### 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 31 Mar 2009 13:28:50 -0000 @@ -13,8 +13,10 @@ 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.Display; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.core.runtime.IProgressMonitor; @@ -37,12 +39,14 @@ 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.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 +95,7 @@ super(parent, configuration); fStructureCreator= new JavaStructureCreator(); setStructureCreator(fStructureCreator); + JavaCore.addElementChangedListener(this); } /** @@ -149,6 +154,15 @@ super.compareInputChanged(input); } + /* + * @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 Map getCompilerOptions(ITypedElement input) { if (input instanceof IResourceProvider) { IResource resource= ((IResourceProvider) input).getResource(); @@ -218,4 +232,38 @@ tb.getParent().layout(true); } } + + /* + * @see org.eclipse.jdt.core.IElementChangedListener#elementChanged(org.eclipse.jdt.core.ElementChangedEvent) + * @since 3.5 + */ + public void elementChanged(ElementChangedEvent event) { + if (!isAffectedBy(event)) + return; + + Display display= getTree().getDisplay(); + if (display.getThread() == Thread.currentThread()) + contentChanged(null); + else { + display.asyncExec(new Runnable() { + public void run() { + contentChanged(null); + } + }); + } + } + + /** + * 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 boolean isAffectedBy(ElementChangedEvent event) { + // FIXME: must implement + return true; + } + }