### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.ui
Index: ui/org/eclipse/jdt/internal/ui/compare/JavaStructureDiffViewer.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/compare/JavaStructureDiffViewer.java,v
retrieving revision 1.16
diff -u -r1.16 JavaStructureDiffViewer.java
--- ui/org/eclipse/jdt/internal/ui/compare/JavaStructureDiffViewer.java 16 Dec 2008 10:20:24 -0000 1.16
+++ ui/org/eclipse/jdt/internal/ui/compare/JavaStructureDiffViewer.java 2 Apr 2009 15:06:15 -0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2009 IBM 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
@@ -13,6 +13,7 @@
import java.util.Map;
import java.util.ResourceBundle;
+import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
@@ -29,6 +30,7 @@
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareViewerPane;
+import org.eclipse.compare.IContentChangeNotifier;
import org.eclipse.compare.IResourceProvider;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.DiffNode;
@@ -37,12 +39,15 @@
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.StructureDiffViewer;
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.IElementChangedListener;
import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
// XXX: StructuredDiffViewer should allow subclassing, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=258907
-class JavaStructureDiffViewer extends StructureDiffViewer {
+class JavaStructureDiffViewer extends StructureDiffViewer implements IElementChangedListener {
/**
* Toggles a boolean property of an CompareConfiguration
.
@@ -91,6 +96,7 @@
super(parent, configuration);
fStructureCreator= new JavaStructureCreator();
setStructureCreator(fStructureCreator);
+ JavaCore.addElementChangedListener(this);
}
/**
@@ -150,15 +156,29 @@
}
private Map getCompilerOptions(ITypedElement input) {
- if (input instanceof IResourceProvider) {
- IResource resource= ((IResourceProvider) input).getResource();
+ IJavaElement element= findJavaElement(input);
+ if (element != null) {
+ IJavaProject javaProject= element.getJavaProject();
+ if (javaProject != null)
+ return javaProject.getOptions(true);
+ }
+ return null;
+ }
+
+ /*
+ * @see org.eclipse.compare.structuremergeviewer.StructureDiffViewer#handleDispose(org.eclipse.swt.events.DisposeEvent)
+ * @since 3.5
+ */
+ protected void handleDispose(DisposeEvent event) {
+ JavaCore.removeElementChangedListener(this);
+ super.handleDispose(event);
+ }
+
+ private IJavaElement findJavaElement(ITypedElement element) {
+ if (element instanceof IResourceProvider) {
+ IResource resource= ((IResourceProvider)element).getResource();
if (resource != null) {
- IJavaElement element= JavaCore.create(resource);
- if (element != null) {
- IJavaProject javaProject= element.getJavaProject();
- if (javaProject != null)
- return javaProject.getOptions(true);
- }
+ return JavaCore.create(resource);
}
}
return null;
@@ -218,4 +238,82 @@
tb.getParent().layout(true);
}
}
-}
+
+ /*
+ * @see org.eclipse.jdt.core.IElementChangedListener#elementChanged(org.eclipse.jdt.core.ElementChangedEvent)
+ * @since 3.5
+ */
+ public void elementChanged(ElementChangedEvent event) {
+ ITypedElement e= findAffectedElement(event);
+ if (e == null || !(e instanceof IContentChangeNotifier))
+ return;
+ contentChanged((IContentChangeNotifier)e);
+ }
+
+ /**
+ * Tells whether this viewer is affected by the given event.
+ *
+ * @param event element changed event
+ * @return true
if this viewer is affected by the given event, false
+ * otherwise
+ * @since 3.5
+ */
+ private ITypedElement findAffectedElement(ElementChangedEvent event) {
+ Object input= getInput();
+ if (input instanceof ICompareInput) {
+ ICompareInput ci= (ICompareInput)input;
+ if (findElement(findJavaElement(ci.getAncestor()), event.getDelta()) != null)
+ return ci.getAncestor();
+ if (findElement(findJavaElement(ci.getLeft()), event.getDelta()) != null)
+ return ci.getLeft();
+ if (findElement(findJavaElement(ci.getRight()), event.getDelta()) != null)
+ return ci.getRight();
+ }
+ return null;
+ }
+
+ /**
+ * Checks whether the given Java element is affected by the delta.
+ *
+ * This is a modified copy of the internal JavaOutlinePage.ElementChangedListener#findElement + * method. It assumes that the change affects the Java element if the element equals to the + * element from the delta. It doesn't check if the delta describes a possible structural change + * as the original method does. + * + * @see org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage.ElementChangedListener#findElement(IJavaElement, + * IJavaElementDelta) + * @see org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage.ElementChangedListener#isPossibleStructuralChange(IJavaElementDelta) + * + * @param unit A Java element to check + * @param delta A Java element delta describing changes + * @return A Java element delta that affects the given unit + * @since 3.5 + */ + private IJavaElementDelta findElement(IJavaElement unit, IJavaElementDelta delta) { + + if (delta == null || unit == null) + return null; + + IJavaElement element= delta.getElement(); + + if (unit.equals(element)) { + return delta; + } + + + if (element.getElementType() > IJavaElement.CLASS_FILE) + return null; + + IJavaElementDelta[] children= delta.getAffectedChildren(); + if (children == null || children.length == 0) + return null; + + for (int i= 0; i < children.length; i++) { + IJavaElementDelta d= findElement(unit, children[i]); + if (d != null) + return d; + } + + return null; + } +} \ No newline at end of file