blob: b18f1dc09af71322d8793b3632fe2278f11cc72c [file] [log] [blame]
/*
* Created on Mar 24, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.eclipse.jst.j2ee.navigator.internal.workingsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetUpdater;
import org.eclipse.wst.common.componentcore.StructureEdit;
import org.eclipse.wst.common.componentcore.internal.ComponentType;
import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
/**
* @author Admin
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class ComponentWorkingSetUpdater implements IWorkingSetUpdater,
IResourceChangeListener/*, IResourceDeltaVisitor*/ {
public static final String ID= "org.eclipse.jst.j2ee.navigator.ui.ComponentWorkingSetPage"; //$NON-NLS-1$
private List fWorkingSets;
private static class WorkingSetDelta {
private IWorkingSet fWorkingSet;
private List fElements;
private boolean fChanged;
public WorkingSetDelta(IWorkingSet workingSet) {
fWorkingSet= workingSet;
fElements= new ArrayList(Arrays.asList(workingSet.getElements()));
}
public IWorkingSet getWorkingSet() {
return fWorkingSet;
}
public int indexOf(Object element) {
return fElements.indexOf(element);
}
public void add( Object element) {
fElements.add(element);
fChanged= true;
}
public void remove(int index) {
if (fElements.remove(index) != null) {
fChanged= true;
}
}
public void process() {
if (fChanged) {
fWorkingSet.setElements((IAdaptable[])fElements.toArray(new IAdaptable[fElements.size()]));
}
}
}
/**
*
*/
public ComponentWorkingSetUpdater() {
super();
fWorkingSets= new ArrayList();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#add(org.eclipse.ui.IWorkingSet)
*/
public void add(IWorkingSet workingSet) {
checkElementExistence(workingSet);
synchronized (fWorkingSets) {
fWorkingSets.add(workingSet);
//updateElements(workingSet);
}
}
/**
* @param project
* @param typeId
* @return
*/
private boolean containsModuleType(IProject project, String typeId) {
boolean bReturn = false;
try {
if (project.isAccessible()) {
synchronized (this) {
StructureEdit moduleCore = null;
try {
moduleCore = StructureEdit.getStructureEditForRead(project);
if (moduleCore == null) return false;
WorkbenchComponent[] workBenchModules = moduleCore.getWorkbenchModules();
for (int i = 0; i < workBenchModules.length; i++) {
WorkbenchComponent module = workBenchModules[i];
ComponentType componentType = module.getComponentType() ;
if (typeId.equals(componentType.getComponentTypeId())) {
bReturn = true;
break;
}
}
} finally {
if (moduleCore != null)
moduleCore.dispose();
}
}
}
} catch (Exception ex) {
Logger.getLogger().logError(ex);
}
return bReturn;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#remove(org.eclipse.ui.IWorkingSet)
*/
public boolean remove(IWorkingSet workingSet) {
boolean result;
synchronized(fWorkingSets) {
result= fWorkingSets.remove(workingSet);
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#contains(org.eclipse.ui.IWorkingSet)
*/
public boolean contains(IWorkingSet workingSet) {
synchronized(fWorkingSets) {
return fWorkingSets.contains(workingSet);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#dispose()
*/
public void dispose() {
synchronized(fWorkingSets) {
fWorkingSets.clear();
}
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
/*public void resourceChanged(IResourceChangeEvent event) {
IWorkingSet[] workingSets;
synchronized(fWorkingSets) {
workingSets= (IWorkingSet[])fWorkingSets.toArray(new IWorkingSet[fWorkingSets.size()]);
}
for (int w= 0; w < workingSets.length; w++) {
WorkingSetDelta workingSetDelta= new WorkingSetDelta(workingSets[w]);
IResourceDelta resourceDelta= event.getDelta();
processResourceDelta(workingSetDelta,resourceDelta);
workingSetDelta.process();
}
}*/
/* (non-Javadoc)
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
/* final IResourceDelta delta = event.getDelta();
if (delta != null) {
try {
delta.accept(ComponentWorkingSetUpdater.this);
} catch (CoreException e) {
Logger.getLogger().logError(e);
} catch (SWTException swte) {
Logger.getLogger().logError(swte);
} catch (SWTError swte) {
Logger.getLogger().logError(swte);
}
} */
IResourceDelta delta= event.getDelta();
if (delta == null) return;
IResourceDelta[] affectedChildren= delta.getAffectedChildren(IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.CHANGED, IResource.PROJECT);
if (affectedChildren.length > 0) {
for (int i= 0; i < affectedChildren.length; i++) {
IResourceDelta projectDelta= affectedChildren[i];
IProject project = (IProject)projectDelta.getResource();
IWorkingSet[] workingSets;
synchronized(fWorkingSets) {
workingSets= (IWorkingSet[])fWorkingSets.toArray(new IWorkingSet[fWorkingSets.size()]);
}
for (int w= 0; w < workingSets.length; w++) {
WorkingSetDelta workingSetDelta= new WorkingSetDelta(workingSets[w]);
processResourceDelta(workingSetDelta,projectDelta, project);
workingSetDelta.process();
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
*/
/* public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (resource != null) {
switch (resource.getType()) {
case IResource.ROOT :
return true;
case IResource.PROJECT :
boolean projectOpenStateChanged = ((delta.getFlags() & IResourceDelta.OPEN) != 0);
if (delta.getKind() == IResourceDelta.REMOVED ||
delta.getKind() == IResourceDelta.ADDED
|| projectOpenStateChanged) {
IProject project = (IProject) resource;
IWorkingSet[] workingSets;
synchronized(fWorkingSets) {
workingSets= (IWorkingSet[])fWorkingSets.toArray(new IWorkingSet[fWorkingSets.size()]);
}
for (int w= 0; w < workingSets.length; w++) {
WorkingSetDelta workingSetDelta= new WorkingSetDelta(workingSets[w]);
processResourceDelta(workingSetDelta,delta, project);
workingSetDelta.process();
}
}
return false;
}
}
return false;
}*/
private void processResourceDelta(WorkingSetDelta result, IResourceDelta aDelta, IProject aProject) {
//IResource resource= aDelta.getResource();
int index= result.indexOf(aProject);
int kind= aDelta.getKind();
int flags= aDelta.getFlags();
switch (aDelta.getKind()) {
case IResourceDelta.REMOVED :
if (index != -1) {
result.remove(index) ;
}
break;
case IResourceDelta.ADDED : {
ComponentWorkingSet workingSet = (ComponentWorkingSet) result.getWorkingSet();
if (containsModuleType(aProject,workingSet.getTypeId())) {
if (index == -1)
result.add(aProject);
}
break;
}
case IResourceDelta.CHANGED :
// boolean natureMayHaveChanged = ((aDelta.getFlags() & IResourceDelta.DESCRIPTION) != 0) && ((aDelta.getFlags() & IResourceDelta.MARKERS) == 0);
boolean projectOpenStateChanged = ((aDelta.getFlags() & IResourceDelta.OPEN) != 0);
if (/*natureMayHaveChanged ||*/ projectOpenStateChanged) {
if (aProject.isOpen()) {
ComponentWorkingSet workingSet = (ComponentWorkingSet) result.getWorkingSet();
if (containsModuleType(aProject,workingSet.getTypeId())) {
result.add(aProject);
}
} else {
if (index != -1) {
result.remove(index) ;
}
}
} else {
ComponentWorkingSet workingSet = (ComponentWorkingSet) result.getWorkingSet();
if (containsModuleType(aProject,workingSet.getTypeId())) {
if (index == -1)
result.add(aProject);
} else {
if (index != -1) {
result.remove(index) ;
}
}
break;
}
break;
}
}
private void checkElementExistence(IWorkingSet workingSet) {
List elements= new ArrayList(Arrays.asList(workingSet.getElements()));
boolean changed= false;
for (Iterator iter= elements.iterator(); iter.hasNext();) {
IAdaptable element= (IAdaptable)iter.next();
boolean remove= false;
if (element instanceof IResource) {
remove= !((IResource)element).exists();
}
if (remove) {
iter.remove();
changed= true;
}
}
if (changed) {
workingSet.setElements((IAdaptable[])elements.toArray(new IAdaptable[elements.size()]));
}
}
}