### 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