/******************************************************************************* * Copyright (c) 2007, 2010 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Intel Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.settings.model; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfoChangeListener; import org.eclipse.cdt.core.parser.IScannerInfoProvider; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; public class ScannerInfoProviderProxy extends AbstractCExtensionProxy implements IScannerInfoProvider, IScannerInfoChangeListener{ private Map<IProject, List<IScannerInfoChangeListener>> listeners; private IScannerInfoProvider fProvider; public ScannerInfoProviderProxy(IProject project) { super(project, CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); } public IScannerInfo getScannerInformation(IResource resource) { providerRequested(); return fProvider.getScannerInformation(resource); } protected void notifyInfoListeners(IResource rc, IScannerInfo info) { // Call in the cavalry List<IScannerInfoChangeListener> listeners = getListeners().get(rc); if (listeners == null) { return; } IScannerInfoChangeListener[] observers = new IScannerInfoChangeListener[listeners.size()]; listeners.toArray(observers); for (int i = 0; i < observers.length; i++) { observers[i].changeNotification(rc, info); } } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.core.resources.IResource, * org.eclipse.cdt.core.parser.IScannerInfoChangeListener) */ public synchronized void subscribe(IResource resource, IScannerInfoChangeListener listener) { if (resource == null || listener == null) { return; } IProject project = resource.getProject(); // Get listeners for this resource Map<IProject, List<IScannerInfoChangeListener>> map = getListeners(); List<IScannerInfoChangeListener> list = map.get(project); if (list == null) { // Create a new list list = new ArrayList<IScannerInfoChangeListener>(); map.put(project, list); } if (!list.contains(listener)) { // Add the new listener for the resource list.add(listener); } } /* * @return */ private Map<IProject, List<IScannerInfoChangeListener>> getListeners() { if (listeners == null) { listeners = new HashMap<IProject, List<IScannerInfoChangeListener>>(); } return listeners; } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.core.resources.IResource, * org.eclipse.cdt.core.parser.IScannerInfoChangeListener) */ public synchronized void unsubscribe(IResource resource, IScannerInfoChangeListener listener) { if (resource == null || listener == null) { return; } IProject project = resource.getProject(); // Remove the listener Map<IProject, List<IScannerInfoChangeListener>> map = getListeners(); List<IScannerInfoChangeListener> list = map.get(project); if (list != null && !list.isEmpty()) { // The list is not empty so try to remove listener list.remove(listener); } } public void changeNotification(IResource rc, IScannerInfo info) { notifyInfoListeners(rc, info); } @SuppressWarnings("deprecation") @Override protected Object createDefaultProvider(ICConfigurationDescription des, boolean newStile){ if(newStile) return new DescriptionScannerInfoProvider(getProject()); return org.eclipse.cdt.core.resources.ScannerProvider.getInstance(); } @Override protected void deinitializeProvider(Object o) { IScannerInfoProvider provider = (IScannerInfoProvider)o; provider.unsubscribe(getProject(), this); if(provider instanceof DescriptionScannerInfoProvider){ ((DescriptionScannerInfoProvider)provider).close(); } } @Override protected void initializeProvider(Object o) { IScannerInfoProvider provider = (IScannerInfoProvider)o; fProvider = provider; provider.subscribe(getProject(), this); } @Override protected void postProcessProviderChange(Object newProvider, Object oldProvider) { if(oldProvider != null) notifyInfoListeners(getProject(), getScannerInformation(getProject())); } @Override protected boolean isValidProvider(Object o) { return o instanceof IScannerInfoProvider; } }