/*******************************************************************************
* 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.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.core.resources.IPathEntryStore;
import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
import org.eclipse.cdt.core.settings.model.ICConfigExtensionReference;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.internal.core.settings.model.AbstractCExtensionProxy;
import org.eclipse.cdt.internal.core.settings.model.ConfigBasedPathEntryStore;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
public class PathEntryStoreProxy extends AbstractCExtensionProxy implements IPathEntryStore, IPathEntryStoreListener {
private List<IPathEntryStoreListener> fListeners;
private IPathEntryStore fStore;
public PathEntryStoreProxy(IProject project){
super(project, PathEntryManager.PATHENTRY_STORE_UNIQ_ID);
fListeners = Collections.synchronizedList(new ArrayList<IPathEntryStoreListener>());
}
public IPathEntryStore getStore(){
providerRequested();
return fStore;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.resources.IPathEntryStore#addPathEntryStoreListener(org.eclipse.cdt.core.resources.IPathEntryStoreListener)
*/
public void addPathEntryStoreListener(IPathEntryStoreListener listener) {
fListeners.add(listener);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.resources.IPathEntryStore#removePathEntryStoreListener(org.eclipse.cdt.core.resources.IPathEntryStoreListener)
*/
public void removePathEntryStoreListener(IPathEntryStoreListener listener) {
fListeners.remove(listener);
}
private void fireContentChangedEvent(IProject project) {
PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(this, project, PathEntryStoreChangedEvent.CONTENT_CHANGED);
notifyListeners(evt);
}
private void notifyListeners(PathEntryStoreChangedEvent evt){
IPathEntryStoreListener[] observers = new IPathEntryStoreListener[fListeners.size()];
fListeners.toArray(observers);
for (int i = 0; i < observers.length; i++) {
observers[i].pathEntryStoreChanged(evt);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.resources.IPathEntryStore#fireClosedChangedEvent(IProject)
*/
@Override
public void close() {
super.close();
PathEntryStoreChangedEvent evt = new PathEntryStoreChangedEvent(this, getProject(), PathEntryStoreChangedEvent.STORE_CLOSED);
IPathEntryStoreListener[] observers = new IPathEntryStoreListener[fListeners.size()];
fListeners.toArray(observers);
for (int i = 0; i < observers.length; i++) {
observers[i].pathEntryStoreChanged(evt);
}
}
@Override
public IProject getProject() {
return super.getProject();
}
public ICExtensionReference getExtensionReference() {
//TODO: calculate
return null;
}
public ICConfigExtensionReference getConfigExtensionReference() {
return null;
}
public IPathEntry[] getRawPathEntries() throws CoreException {
providerRequested();
return fStore.getRawPathEntries();
}
public void setRawPathEntries(IPathEntry[] entries) throws CoreException {
providerRequested();
fStore.setRawPathEntries(entries);
}
public void pathEntryStoreChanged(PathEntryStoreChangedEvent event) {
notifyListeners(event);
}
@Override
protected Object createDefaultProvider(ICConfigurationDescription cfgDes,
boolean newStile) {
if(newStile){
return new ConfigBasedPathEntryStore(getProject());
}
return new DefaultPathEntryStore(getProject());
}
@Override
protected void deinitializeProvider(Object o) {
IPathEntryStore store = (IPathEntryStore)o;
store.removePathEntryStoreListener(this);
store.close();
}
@Override
protected void initializeProvider(Object o) {
IPathEntryStore store = (IPathEntryStore)o;
fStore = store;
store.addPathEntryStoreListener(this);
}
@Override
protected boolean isValidProvider(Object o) {
return o instanceof IPathEntryStore;
}
@Override
protected void postProcessProviderChange(Object newProvider,
Object oldProvider) {
// if(oldProvider != null)
fireContentChangedEvent(getProject());
}
@Override
protected boolean doHandleEvent(CProjectDescriptionEvent event) {
IPathEntryStore oldStore = fStore;
boolean result = super.doHandleEvent(event);
if(!result)
postProcessProviderChange(fStore, oldStore);
return result;
}
}