private void processResourceDelta(WorkingSetDelta result, IResourceDelta delta) {
    IResource resource = delta.getResource();
    int type = resource.getType();
    int index = result.indexOf(resource);
    int kind = delta.getKind();
    int flags = delta.getFlags();
    if (kind == IResourceDelta.CHANGED && type == IResource.PROJECT && index != -1) {
      if ((flags & IResourceDelta.OPEN) != 0) {
        result.set(index, resource);
      }
    }
    if (index != -1 && kind == IResourceDelta.REMOVED) {
      if ((flags & IResourceDelta.MOVED_TO) != 0) {
        result.set(
            index, ResourcesPlugin.getWorkspace().getRoot().findMember(delta.getMovedToPath()));
      } else {
        result.remove(index);
      }
    }

    // Don't dive into closed or opened projects
    if (projectGotClosedOrOpened(resource, kind, flags)) {
      return;
    }

    IResourceDelta[] children = delta.getAffectedChildren();
    for (int i = 0; i < children.length; i++) {
      processResourceDelta(result, children[i]);
    }
  }
 @Override
 public void resourceChanged(IResourceChangeEvent event) {
   IResourceDelta delta = event.getDelta();
   if (delta == null) {
     return;
   }
   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);
     workingSetDelta.process();
   }
 }
 @Override
 public void elementChanged(ElementChangedEvent event) {
   IWorkingSet[] workingSets;
   synchronized (fWorkingSets) {
     workingSets = fWorkingSets.toArray(new IWorkingSet[fWorkingSets.size()]);
   }
   for (int w = 0; w < workingSets.length; w++) {
     WorkingSetDelta workingSetDelta = new WorkingSetDelta(workingSets[w]);
     processJavaDelta(workingSetDelta, event.getDelta());
     IResourceDelta[] resourceDeltas = event.getDelta().getResourceDeltas();
     if (resourceDeltas != null) {
       for (int r = 0; r < resourceDeltas.length; r++) {
         processResourceDelta(workingSetDelta, resourceDeltas[r]);
       }
     }
     workingSetDelta.process();
   }
 }
 private void processJavaDelta(WorkingSetDelta result, IJavaElementDelta delta) {
   IJavaElement jElement = delta.getElement();
   int index = result.indexOf(jElement);
   int type = jElement.getElementType();
   int kind = delta.getKind();
   int flags = delta.getFlags();
   if (type == IJavaElement.JAVA_PROJECT && kind == IJavaElementDelta.CHANGED) {
     if (index != -1 && (flags & IJavaElementDelta.F_CLOSED) != 0) {
       result.set(index, ((IJavaProject) jElement).getProject());
     } else if ((flags & IJavaElementDelta.F_OPENED) != 0) {
       index = result.indexOf(((IJavaProject) jElement).getProject());
       if (index != -1) result.set(index, jElement);
     }
   }
   if (index != -1) {
     if (kind == IJavaElementDelta.REMOVED) {
       if ((flags & IJavaElementDelta.F_MOVED_TO) != 0) {
         result.set(index, delta.getMovedToElement());
       } else {
         result.remove(index);
       }
     }
   }
   IResourceDelta[] resourceDeltas = delta.getResourceDeltas();
   if (resourceDeltas != null) {
     for (int i = 0; i < resourceDeltas.length; i++) {
       processResourceDelta(result, resourceDeltas[i]);
     }
   }
   IJavaElementDelta[] children = delta.getAffectedChildren();
   for (int i = 0; i < children.length; i++) {
     processJavaDelta(result, children[i]);
   }
 }