X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/DeltaProcessor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/DeltaProcessor.java index ae314b3..41d5e07 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/DeltaProcessor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/DeltaProcessor.java @@ -27,6 +27,8 @@ import net.sourceforge.phpdt.core.IJavaModel; import net.sourceforge.phpdt.core.IJavaProject; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.core.JavaModelException; +import net.sourceforge.phpdt.internal.core.builder.PHPBuilder; +import net.sourceforge.phpdt.internal.core.util.Util; import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil; import net.sourceforge.phpeclipse.PHPeclipsePlugin; @@ -44,12 +46,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; -import net.sourceforge.phpdt.internal.core.builder.PHPBuilder; - -import net.sourceforge.phpdt.internal.core.DeltaProcessingState; -import net.sourceforge.phpdt.internal.core.JavaElementDelta; -import net.sourceforge.phpdt.internal.core.JavaModelManager; -import net.sourceforge.phpdt.internal.core.util.Util; /** @@ -719,7 +715,7 @@ public class DeltaProcessor implements IResourceChangeListener { // } else if (((JavaProject)root.getJavaProject()).contains(resource)) { // // create package handle // IPath pkgPath = path.removeFirstSegments(root.getPath().segmentCount()); -// String pkg = Util.packageName(pkgPath); +// String pkg = ProjectPrefUtil.packageName(pkgPath); // if (pkg == null) return null; // element = root.getPackageFragment(pkg); // } @@ -740,7 +736,7 @@ public class DeltaProcessor implements IResourceChangeListener { // IPackageFragmentRoot root = (IPackageFragmentRoot)this.currentElement; // IPath rootPath = root.getPath(); // IPath pkgPath = path.removeLastSegments(1); -// String pkgName = Util.packageName(pkgPath.removeFirstSegments(rootPath.segmentCount())); +// String pkgName = ProjectPrefUtil.packageName(pkgPath.removeFirstSegments(rootPath.segmentCount())); // if (pkgName != null) { // pkgFragment = root.getPackageFragment(pkgName); // } @@ -928,7 +924,7 @@ public class DeltaProcessor implements IResourceChangeListener { // IResource resource = child.getResource(); // if (resource instanceof IFolder) { // String folderName = resource.getName(); -// if (Util.isValidFolderNameForPackage(folderName)) { +// if (ProjectPrefUtil.isValidFolderNameForPackage(folderName)) { // String subpkgName = // name.length() == 0 ? // folderName : @@ -1038,7 +1034,7 @@ public class DeltaProcessor implements IResourceChangeListener { // IResource resource = child.getResource(); // if (resource instanceof IFolder) { // String folderName = resource.getName(); -// if (Util.isValidFolderNameForPackage(folderName)) { +// if (ProjectPrefUtil.isValidFolderNameForPackage(folderName)) { // String subpkgName = // name.length() == 0 ? // folderName : @@ -1078,20 +1074,20 @@ public class DeltaProcessor implements IResourceChangeListener { // if (rootInfo == null) { // rootInfo = this.enclosingRootInfo(res.getFullPath(), kind); // } -// if (rootInfo == null || Util.isExcluded(res, rootInfo.exclusionPatterns)) { +// if (rootInfo == null || ProjectPrefUtil.isExcluded(res, rootInfo.exclusionPatterns)) { // return NON_JAVA_RESOURCE; // } // if (res instanceof IFolder) { -// if (Util.isValidFolderNameForPackage(res.getName())) { +// if (ProjectPrefUtil.isValidFolderNameForPackage(res.getName())) { // return IJavaElement.PACKAGE_FRAGMENT; // } else { // return NON_JAVA_RESOURCE; // } // } else { // String fileName = res.getName(); -// if (Util.isValidCompilationUnitName(fileName)) { +// if (ProjectPrefUtil.isValidCompilationUnitName(fileName)) { // return IJavaElement.COMPILATION_UNIT; -// } else if (Util.isValidClassFileName(fileName)) { +// } else if (ProjectPrefUtil.isValidClassFileName(fileName)) { // return IJavaElement.CLASS_FILE; // } else if (this.rootInfo(res.getFullPath(), kind) != null) { // // case of proj=src=bin and resource is a jar file on the classpath @@ -1292,120 +1288,6 @@ public class DeltaProcessor implements IResourceChangeListener { if (insertedTree) return rootDelta; return null; } - private void notifyListeners(IJavaElementDelta deltaToNotify, int eventType, IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) { - final ElementChangedEvent extraEvent = new ElementChangedEvent(deltaToNotify, eventType); - for (int i= 0; i < listenerCount; i++) { - if ((listenerMask[i] & eventType) != 0){ - final IElementChangedListener listener = listeners[i]; - long start = -1; - if (VERBOSE) { - System.out.print("Listener #" + (i+1) + "=" + listener.toString());//$NON-NLS-1$//$NON-NLS-2$ - start = System.currentTimeMillis(); - } - // wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief - Platform.run(new ISafeRunnable() { - public void handleException(Throwable exception) { - Util.log(exception, "Exception occurred in listener of Java element change notification"); //$NON-NLS-1$ - } - public void run() throws Exception { - listener.elementChanged(extraEvent); - } - }); - if (VERBOSE) { - System.out.println(" -> " + (System.currentTimeMillis()-start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } - } - /** - * Generic processing for elements with changed contents:
IJavaElementDelta
, rooted in the
* relevant JavaModel
s.
*/
-// public IJavaElementDelta processResourceDelta(IResourceDelta changes) {
-//
-// try {
-// IJavaModel model = this.manager.getJavaModel();
-// if (!model.isOpen()) {
-// // force opening of java model so that java element delta are reported
-// try {
-// model.open(null);
-// } catch (JavaModelException e) {
-// if (VERBOSE) {
-// e.printStackTrace();
-// }
-// return null;
-// }
-// }
-// this.initializeRoots();
-// this.currentElement = null;
-//
-// // get the workspace delta, and start processing there.
-// IResourceDelta[] deltas = changes.getAffectedChildren();
-// for (int i = 0; i < deltas.length; i++) {
-// IResourceDelta delta = deltas[i];
-// IResource res = delta.getResource();
-//
-// // find out the element type
-// RootInfo rootInfo = null;
-// int elementType;
-// IProject proj = (IProject)res;
-// boolean wasJavaProject = this.manager.getJavaModel().findJavaProject(proj) != null;
-// boolean isJavaProject = JavaProject.hasJavaNature(proj);
-// if (!wasJavaProject && !isJavaProject) {
-// elementType = NON_JAVA_RESOURCE;
-// } else {
-// rootInfo = this.enclosingRootInfo(res.getFullPath(), delta.getKind());
-// if (rootInfo != null && rootInfo.isRootOfProject(res.getFullPath())) {
-// elementType = IJavaElement.PACKAGE_FRAGMENT_ROOT;
-// } else {
-// elementType = IJavaElement.JAVA_PROJECT;
-// }
-// }
-//
-// // traverse delta
-// if (!this.traverseDelta(delta, elementType, rootInfo, null)
-// || (wasJavaProject != isJavaProject && (delta.getKind()) == IResourceDelta.CHANGED)) { // project has changed nature (description or open/closed)
-// try {
-// // add child as non java resource
-// nonJavaResourcesChanged((JavaModel)model, delta);
-// } catch (JavaModelException e) {
-// }
-// }
-//
-// }
-//
-// // update package fragment roots of projects that were affected
-// Iterator iterator = this.projectsToUpdate.iterator();
-// while (iterator.hasNext()) {
-// JavaProject project = (JavaProject)iterator.next();
-// project.updatePackageFragmentRoots();
-// }
-//
-// updateDependentNamelookups();
-//
-// return this.currentDelta;
-// } finally {
-// this.currentDelta = null;
-// this.projectsToUpdate.clear();
-// this.projectsForDependentNamelookupRefresh.clear();
-// }
-// }
/**
* Update the JavaModel according to a .classpath file change. The file can have changed as a result of a previous
@@ -1601,7 +1414,7 @@ public class DeltaProcessor implements IResourceChangeListener {
// }
// } catch (JavaModelException e) {
// if (project.getProject().isAccessible()) {
-// Util.log(e, "Could not save classpath for "+ project.getPath()); //$NON-NLS-1$
+// ProjectPrefUtil.log(e, "Could not save classpath for "+ project.getPath()); //$NON-NLS-1$
// }
// }
// break;
@@ -1657,7 +1470,7 @@ public class DeltaProcessor implements IResourceChangeListener {
// } catch (RuntimeException e) {
// // setRawClasspath might fire a delta, and a listener may throw an exception
// if (project.getProject().isAccessible()) {
-// Util.log(e, "Could not set classpath for "+ project.getPath()); //$NON-NLS-1$
+// ProjectPrefUtil.log(e, "Could not set classpath for "+ project.getPath()); //$NON-NLS-1$
// }
// break;
// } catch (JavaModelException e) { // CP failed validation
@@ -1666,11 +1479,11 @@ public class DeltaProcessor implements IResourceChangeListener {
// // happens if the .classpath could not be written to disk
// project.createClasspathProblemMarker(new JavaModelStatus(
// IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT,
-// Util.bind("classpath.couldNotWriteClasspathFile", project.getElementName(), e.getMessage()))); //$NON-NLS-1$
+// ProjectPrefUtil.bind("classpath.couldNotWriteClasspathFile", project.getElementName(), e.getMessage()))); //$NON-NLS-1$
// } else {
// project.createClasspathProblemMarker(new JavaModelStatus(
// IJavaModelStatusConstants.INVALID_CLASSPATH_FILE_FORMAT,
-// Util.bind("classpath.invalidClasspathInClasspathFile", project.getElementName(), e.getMessage()))); //$NON-NLS-1$
+// ProjectPrefUtil.bind("classpath.invalidClasspathInClasspathFile", project.getElementName(), e.getMessage()))); //$NON-NLS-1$
// }
// }
// break;
@@ -1779,74 +1592,518 @@ public class DeltaProcessor implements IResourceChangeListener {
* @see IResource
*/
public void resourceChanged(IResourceChangeEvent event) {
- // jsurfer TODO compare 3.0 sources
- if (event.getSource() instanceof IWorkspace) {
- int eventType = this.overridenEventType == -1 ? event.getType() : this.overridenEventType;
- IResource resource = event.getResource();
- IResourceDelta delta = event.getDelta();
-
- switch(eventType){
- case IResourceChangeEvent.PRE_DELETE :
+ if (event.getSource() instanceof IWorkspace) {
+ int eventType = this.overridenEventType == -1 ? event.getType() : this.overridenEventType;
+ IResource resource = event.getResource();
+ IResourceDelta delta = event.getDelta();
+
+ switch(eventType){
+ case IResourceChangeEvent.PRE_DELETE :
+ try {
+ if(resource.getType() == IResource.PROJECT
+ && ((IProject) resource).hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
+
+ deleting((IProject)resource);
+ }
+ } catch(CoreException e){
+ // project doesn't exist or is not open: ignore
+ }
+ return;
+
+ case IResourceChangeEvent.POST_CHANGE :
+ if (isAffectedBy(delta)) { // avoid populating for SYNC or MARKER deltas
try {
- if(resource.getType() == IResource.PROJECT
- && ((IProject) resource).hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
- // TODO jsurfer temp-del
-// this.deleting((IProject)resource);
+ try {
+ stopDeltas();
+// checkProjectsBeingAddedOrRemoved(delta);
+// if (this.refreshedElements != null) {
+// createExternalArchiveDelta(null);
+// }
+ IJavaElementDelta translatedDelta = processResourceDelta(delta);
+ if (translatedDelta != null) {
+ registerJavaModelDelta(translatedDelta);
+ }
+ } finally {
+ startDeltas();
}
- } catch(CoreException e){
+// notifyTypeHierarchies(this.state.elementChangedListeners, this.state.elementChangedListenerCount);
+ fire(null, ElementChangedEvent.POST_CHANGE);
+ } finally {
+ // workaround for bug 15168 circular errors not reported
+ this.state.modelProjectsCache = null;
+ this.removedRoots = null;
}
- return;
-
- case IResourceChangeEvent.PRE_AUTO_BUILD :
-// TODO jsurfer temp-del
-// if(isAffectedBy(delta)) { // avoid populating for SYNC or MARKER deltas
-// this.checkProjectsBeingAddedOrRemoved(delta);
-//
-// // update the classpath related markers
-// this.updateClasspathMarkers();
-//
-// // the following will close project if affected by the property file change
-// try {
-// // don't fire classpath change deltas right away, but batch them
-// this.manager.stopDeltas();
-// this.performPreBuildCheck(delta, null);
-// } finally {
-// this.manager.startDeltas();
+ }
+ return;
+
+ case IResourceChangeEvent.PRE_BUILD :
+ DeltaProcessingState.ProjectUpdateInfo[] updates = this.state.removeAllProjectUpdates();
+ if (updates != null) {
+ for (int i = 0, length = updates.length; i < length; i++) {
+ try {
+ updates[i].updateProjectReferencesIfNecessary();
+ } catch(JavaModelException e) {
+ // do nothing
+ }
+ }
+ }
+ // this.processPostChange = false;
+ if(isAffectedBy(delta)) { // avoid populating for SYNC or MARKER deltas
+// updateClasspathMarkers(delta);
+ PHPBuilder.buildStarting();
+ }
+ // does not fire any deltas
+ return;
+
+ case IResourceChangeEvent.POST_BUILD :
+ PHPBuilder.buildFinished();
+ return;
+ }
+ }
+// // jsurfer TODO compare 3.0 sources
+// if (event.getSource() instanceof IWorkspace) {
+// int eventType = this.overridenEventType == -1 ? event.getType() : this.overridenEventType;
+// IResource resource = event.getResource();
+// IResourceDelta delta = event.getDelta();
+//
+// switch(eventType){
+// case IResourceChangeEvent.PRE_DELETE :
+// try {
+// if(resource.getType() == IResource.PROJECT
+// && ((IProject) resource).hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
+// // TODO jsurfer temp-del
+//// this.deleting((IProject)resource);
// }
+// } catch(CoreException e){
// }
- // only fire already computed deltas (resource ones will be processed in post change only)
- this.manager.fire(null, ElementChangedEvent.PRE_AUTO_BUILD);
- break;
+// return;
+//
+// case IResourceChangeEvent.PRE_BUILD :
+//// TODO jsurfer temp-del
+//// if(isAffectedBy(delta)) { // avoid populating for SYNC or MARKER deltas
+//// this.checkProjectsBeingAddedOrRemoved(delta);
+////
+//// // update the classpath related markers
+//// this.updateClasspathMarkers();
+////
+//// // the following will close project if affected by the property file change
+//// try {
+//// // don't fire classpath change deltas right away, but batch them
+//// this.manager.stopDeltas();
+//// this.performPreBuildCheck(delta, null);
+//// } finally {
+//// this.manager.startDeltas();
+//// }
+//// }
+// // only fire already computed deltas (resource ones will be processed in post change only)
+// this.manager.fire(null, ElementChangedEvent.PRE_AUTO_BUILD);
+// break;
+//
+// case IResourceChangeEvent.POST_BUILD :
+//// TODO jsurfer temp-del
+//// JavaBuilder.finishedBuilding(event);
+// break;
+//
+// case IResourceChangeEvent.POST_CHANGE :
+//// TODO jsurfer temp-del
+//// if (isAffectedBy(delta)) {
+//// try {
+//// if (this.refreshedElements != null) {
+//// try {
+//// createExternalArchiveDelta(null);
+//// } catch (JavaModelException e) {
+//// e.printStackTrace();
+//// }
+//// }
+//// IJavaElementDelta translatedDelta = this.processResourceDelta(delta);
+//// if (translatedDelta != null) {
+//// this.manager.registerJavaModelDelta(translatedDelta);
+//// }
+//// this.manager.fire(null, ElementChangedEvent.POST_CHANGE);
+//// } finally {
+//// // workaround for bug 15168 circular errors not reported
+//// this.manager.javaProjectsCache = null;
+//// this.removedRoots = null;
+//// }
+//// }
+// }
+// }
+ }
+ /*
+ * Turns the firing mode to on. That is, deltas that are/have been
+ * registered will be fired.
+ */
+ private void startDeltas() {
+ this.isFiring= true;
+ }
+ /*
+ * Turns the firing mode to off. That is, deltas that are/have been
+ * registered will not be fired until deltas are started again.
+ */
+ private void stopDeltas() {
+ this.isFiring= false;
+ }
+ /*
+ * Note that the project is about to be deleted.
+ */
+ private void deleting(IProject project) {
+
+ try {
+ // discard indexing jobs that belong to this project so that the project can be
+ // deleted without interferences from the index manager
+// this.manager.indexManager.discardJobs(project.getName());
- case IResourceChangeEvent.POST_AUTO_BUILD :
-// TODO jsurfer temp-del
-// JavaBuilder.finishedBuilding(event);
- break;
-
- case IResourceChangeEvent.POST_CHANGE :
-// TODO jsurfer temp-del
-// if (isAffectedBy(delta)) {
-// try {
-// if (this.refreshedElements != null) {
-// try {
-// createExternalArchiveDelta(null);
-// } catch (JavaModelException e) {
-// e.printStackTrace();
+ JavaProject javaProject = (JavaProject)JavaCore.create(project);
+
+ // remember roots of this project
+ if (this.removedRoots == null) {
+ this.removedRoots = new HashMap();
+ }
+ if (javaProject.isOpen()) {
+ this.removedRoots.put(javaProject, javaProject.getPackageFragmentRoots());
+ } else {
+ // compute roots without opening project
+// this.removedRoots.put(
+// javaProject,
+// javaProject.computePackageFragmentRoots(
+// javaProject.getResolvedClasspath(true/*ignoreUnresolvedEntry*/, false/*don't generateMarkerOnError*/, false/*don't returnResolutionInProgress*/),
+// false));
+ }
+
+ javaProject.close();
+
+ // workaround for bug 15168 circular errors not reported
+ if (this.state.modelProjectsCache == null) {
+ this.state.modelProjectsCache = this.manager.getJavaModel().getJavaProjects();
+ }
+ this.removeFromParentInfo(javaProject);
+
+ } catch (JavaModelException e) {
+ // java project doesn't exist: ignore
+ }
+ }
+ /*
+ * Converts a IResourceDelta
rooted in a Workspace
into
+ * the corresponding set of IJavaElementDelta
, rooted in the
+ * relevant JavaModel
s.
+ */
+ private IJavaElementDelta processResourceDelta(IResourceDelta changes) {
+
+ try {
+ IJavaModel model = this.manager.getJavaModel();
+ if (!model.isOpen()) {
+ // force opening of java model so that java element delta are reported
+ try {
+ model.open(null);
+ } catch (JavaModelException e) {
+ if (VERBOSE) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ }
+ this.state.initializeRoots();
+ this.currentElement = null;
+
+ // get the workspace delta, and start processing there.
+ IResourceDelta[] deltas = changes.getAffectedChildren();
+ for (int i = 0; i < deltas.length; i++) {
+ IResourceDelta delta = deltas[i];
+ IResource res = delta.getResource();
+
+ // find out the element type
+// RootInfo rootInfo = null;
+ int elementType;
+ IProject proj = (IProject)res;
+ boolean wasJavaProject = this.manager.getJavaModel().findJavaProject(proj) != null;
+ boolean isJavaProject = JavaProject.hasJavaNature(proj);
+ if (!wasJavaProject && !isJavaProject) {
+ elementType = NON_JAVA_RESOURCE;
+ } else {
+// rootInfo = this.enclosingRootInfo(res.getFullPath(), delta.getKind());
+// if (rootInfo != null && rootInfo.isRootOfProject(res.getFullPath())) {
+// elementType = IJavaElement.PACKAGE_FRAGMENT_ROOT;
+// } else {
+ elementType = IJavaElement.JAVA_PROJECT;
+// }
+ }
+
+ // traverse delta
+// this.traverseDelta(delta, elementType, rootInfo, null);
+
+ if (elementType == NON_JAVA_RESOURCE
+ || (wasJavaProject != isJavaProject && (delta.getKind()) == IResourceDelta.CHANGED)) { // project has changed nature (description or open/closed)
+ try {
+ // add child as non java resource
+ nonJavaResourcesChanged((JavaModel)model, delta);
+ } catch (JavaModelException e) {
+ // java model could not be opened
+ }
+ }
+
+ }
+// refreshPackageFragmentRoots();
+// resetProjectCaches();
+
+ return this.currentDelta;
+ } finally {
+ this.currentDelta = null;
+// this.rootsToRefresh.clear();
+// this.projectCachesToReset.clear();
+ }
+ }
+
+ /*
+ * Converts an IResourceDelta
and its children into
+ * the corresponding IJavaElementDelta
s.
+ */
+// private void traverseDelta(
+// IResourceDelta delta,
+// int elementType,
+// RootInfo rootInfo,
+// OutputsInfo outputsInfo) {
+//
+// IResource res = delta.getResource();
+//
+// // set stack of elements
+// if (this.currentElement == null && rootInfo != null) {
+//// this.currentElement = rootInfo.project;
+// }
+//
+// // process current delta
+// boolean processChildren = true;
+// if (res instanceof IProject) {
+// processChildren =
+// this.updateCurrentDeltaAndIndex(
+// delta,
+// elementType == IJavaElement.PACKAGE_FRAGMENT_ROOT ?
+// IJavaElement.JAVA_PROJECT : // case of prj=src
+// elementType,
+// rootInfo);
+// } else if (rootInfo != null) {
+// processChildren = this.updateCurrentDeltaAndIndex(delta, elementType, rootInfo);
+// } else {
+// // not yet inside a package fragment root
+// processChildren = true;
+// }
+//
+// // get the project's output locations and traverse mode
+// if (outputsInfo == null) outputsInfo = this.outputsInfo(rootInfo, res);
+//
+// // process children if needed
+// if (processChildren) {
+// IResourceDelta[] children = delta.getAffectedChildren();
+// boolean oneChildOnClasspath = false;
+// int length = children.length;
+// IResourceDelta[] orphanChildren = null;
+// Openable parent = null;
+// boolean isValidParent = true;
+// for (int i = 0; i < length; i++) {
+// IResourceDelta child = children[i];
+// IResource childRes = child.getResource();
+//
+// // check source attachment change
+// this.checkSourceAttachmentChange(child, childRes);
+//
+// // find out whether the child is a package fragment root of the current project
+// IPath childPath = childRes.getFullPath();
+// int childKind = child.getKind();
+// RootInfo childRootInfo = this.rootInfo(childPath, childKind);
+// if (childRootInfo != null && !childRootInfo.isRootOfProject(childPath)) {
+// // package fragment root of another project (dealt with later)
+// childRootInfo = null;
+// }
+//
+// // compute child type
+// int childType =
+// this.elementType(
+// childRes,
+// childKind,
+// elementType,
+// rootInfo == null ? childRootInfo : rootInfo
+// );
+//
+// // is childRes in the output folder and is it filtered out ?
+// boolean isResFilteredFromOutput = this.isResFilteredFromOutput(outputsInfo, childRes, childType);
+//
+// boolean isNestedRoot = rootInfo != null && childRootInfo != null;
+// if (!isResFilteredFromOutput
+// && !isNestedRoot) { // do not treat as non-java rsc if nested root
+//
+// this.traverseDelta(child, childType, rootInfo == null ? childRootInfo : rootInfo, outputsInfo); // traverse delta for child in the same project
+//
+// if (childType == NON_JAVA_RESOURCE) {
+// if (rootInfo != null) { // if inside a package fragment root
+// if (!isValidParent) continue;
+// if (parent == null) {
+// // find the parent of the non-java resource to attach to
+// if (this.currentElement == null
+// || !rootInfo.project.equals(this.currentElement.getJavaProject())) { // note if currentElement is the IJavaModel, getJavaProject() is null
+// // force the currentProject to be used
+// this.currentElement = rootInfo.project;
+// }
+// if (elementType == IJavaElement.JAVA_PROJECT
+// || (elementType == IJavaElement.PACKAGE_FRAGMENT_ROOT
+// && res instanceof IProject)) {
+// // NB: attach non-java resource to project (not to its package fragment root)
+// parent = rootInfo.project;
+// } else {
+// parent = this.createElement(res, elementType, rootInfo);
+// }
+// if (parent == null) {
+// isValidParent = false;
+// continue;
// }
// }
-// IJavaElementDelta translatedDelta = this.processResourceDelta(delta);
-// if (translatedDelta != null) {
-// this.manager.registerJavaModelDelta(translatedDelta);
+// // add child as non java resource
+// try {
+// nonJavaResourcesChanged(parent, child);
+// } catch (JavaModelException e) {
+// // ignore
// }
-// this.manager.fire(null, ElementChangedEvent.POST_CHANGE);
-// } finally {
-// // workaround for bug 15168 circular errors not reported
-// this.manager.javaProjectsCache = null;
-// this.removedRoots = null;
+// } else {
+// // the non-java resource (or its parent folder) will be attached to the java project
+// if (orphanChildren == null) orphanChildren = new IResourceDelta[length];
+// orphanChildren[i] = child;
// }
+// } else {
+// oneChildOnClasspath = true;
+// }
+// } else {
+// oneChildOnClasspath = true; // to avoid reporting child delta as non-java resource delta
+// }
+//
+// // if child is a nested root
+// // or if it is not a package fragment root of the current project
+// // but it is a package fragment root of another project, traverse delta too
+// if (isNestedRoot
+// || (childRootInfo == null && (childRootInfo = this.rootInfo(childPath, childKind)) != null)) {
+// this.traverseDelta(child, IJavaElement.PACKAGE_FRAGMENT_ROOT, childRootInfo, null); // binary output of childRootInfo.project cannot be this root
+// }
+//
+// // if the child is a package fragment root of one or several other projects
+// ArrayList rootList;
+// if ((rootList = this.otherRootsInfo(childPath, childKind)) != null) {
+// Iterator iterator = rootList.iterator();
+// while (iterator.hasNext()) {
+// childRootInfo = (RootInfo) iterator.next();
+// this.traverseDelta(child, IJavaElement.PACKAGE_FRAGMENT_ROOT, childRootInfo, null); // binary output of childRootInfo.project cannot be this root
// }
+// }
+// }
+// if (orphanChildren != null
+// && (oneChildOnClasspath // orphan children are siblings of a package fragment root
+// || res instanceof IProject)) { // non-java resource directly under a project
+//
+// // attach orphan children
+// IProject rscProject = res.getProject();
+// JavaProject adoptiveProject = (JavaProject)JavaCore.create(rscProject);
+// if (adoptiveProject != null
+// && JavaProject.hasJavaNature(rscProject)) { // delta iff Java project (18698)
+// for (int i = 0; i < length; i++) {
+// if (orphanChildren[i] != null) {
+// try {
+// nonJavaResourcesChanged(adoptiveProject, orphanChildren[i]);
+// } catch (JavaModelException e) {
+// // ignore
+// }
+// }
+// }
+// }
+// } // else resource delta will be added by parent
+// } // else resource delta will be added by parent
+// }
+ private void notifyListeners(IJavaElementDelta deltaToNotify, int eventType, IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
+ final ElementChangedEvent extraEvent = new ElementChangedEvent(deltaToNotify, eventType);
+ for (int i= 0; i < listenerCount; i++) {
+ if ((listenerMask[i] & eventType) != 0){
+ final IElementChangedListener listener = listeners[i];
+ long start = -1;
+ if (VERBOSE) {
+ System.out.print("Listener #" + (i+1) + "=" + listener.toString());//$NON-NLS-1$//$NON-NLS-2$
+ start = System.currentTimeMillis();
+ }
+ // wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief
+ Platform.run(new ISafeRunnable() {
+ public void handleException(Throwable exception) {
+ Util.log(exception, "Exception occurred in listener of Java element change notification"); //$NON-NLS-1$
+ }
+ public void run() throws Exception {
+ listener.elementChanged(extraEvent);
+ }
+ });
+ if (VERBOSE) {
+ System.out.println(" -> " + (System.currentTimeMillis()-start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+ }
+// private void notifyTypeHierarchies(IElementChangedListener[] listeners, int listenerCount) {
+// for (int i= 0; i < listenerCount; i++) {
+// final IElementChangedListener listener = listeners[i];
+// if (!(listener instanceof TypeHierarchy)) continue;
+//
+// // wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief
+// Platform.run(new ISafeRunnable() {
+// public void handleException(Throwable exception) {
+// ProjectPrefUtil.log(exception, "Exception occurred in listener of Java element change notification"); //$NON-NLS-1$
+// }
+// public void run() throws Exception {
+// TypeHierarchy typeHierarchy = (TypeHierarchy)listener;
+// if (typeHierarchy.hasFineGrainChanges()) {
+// // case of changes in primary working copies
+// typeHierarchy.needsRefresh = true;
+// typeHierarchy.fireChange();
+// }
+// }
+// });
+// }
+// }
+ /*
+ * Generic processing for elements with changed contents: