diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java index 881276aaa8b5fe4617cf5637b91bd50829920889..92125505259a12233b0813617cfe9e0b62ea99f4 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java @@ -19,14 +19,13 @@ package org.fortiss.tooling.base.ui.annotation.view; import java.util.Collection; import java.util.Comparator; -import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; -import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.util.EContentAdapter; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Composite; @@ -59,19 +58,22 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect private IModelElement currentlySelectedObject; /** - * Set of {@link IModelElement}s for which the {@link #changeListener} has been installed to + * Root element for which the {@link #changeListener} has been installed to (recursively) * watch for model changes (to trigger an update of this {@link AnnotationViewPartBase}). */ - Set<EObject> watchedModelElements = new HashSet<EObject>(); + EObject watchedElement; /** * {@link Adapter} to watch for the addition, removal or value change of model elements * to/from/in elements visible in this {@link AnnotationViewPartBase} (to trigger according * updates). */ - private final Adapter changeListener = new AdapterImpl() { + private final Adapter changeListener = new EContentAdapter() { + /** {@inheritDoc} */ @Override public void notifyChanged(Notification notification) { + super.notifyChanged(notification); + if(notification.getEventType() == Notification.ADD || notification.getEventType() == Notification.REMOVE || notification.getEventType() == Notification.SET) { @@ -113,38 +115,6 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect } } - /** Update registration of model listeners. */ - private void updateChangeListener(EObject rootElement) { - // Determine all IModelElements, and their specifications below the current root elements. - // Specifications must be watched, too, since the state of an editing support for a given - // specification can depend on the state of one or more other specifications. - Set<EObject> currentWatchedModelElements = new HashSet<EObject>(); - for(EObject modelElement : EcoreUtils.getChildrenWithType(rootElement, IModelElement.class)) { - currentWatchedModelElements.add(modelElement); - currentWatchedModelElements.addAll(((IModelElement)modelElement).getSpecifications()); - } - if(rootElement instanceof IModelElement) { - currentWatchedModelElements.add(rootElement); - currentWatchedModelElements.addAll(((IModelElement)rootElement).getSpecifications()); - } - - // Add change listeners to IModelElements that are about to appear in the view - Set<EObject> tmpWatchedModelElements = new HashSet<EObject>(currentWatchedModelElements); - tmpWatchedModelElements.removeAll(watchedModelElements); - for(EObject modelElement : tmpWatchedModelElements) { - modelElement.eAdapters().add(changeListener); - } - - // Remove change listeners IModelElements that are about to disappear from the view - tmpWatchedModelElements = new HashSet<EObject>(watchedModelElements); - tmpWatchedModelElements.removeAll(currentWatchedModelElements); - for(EObject modelElement : tmpWatchedModelElements) { - modelElement.eAdapters().remove(changeListener); - } - - watchedModelElements = currentWatchedModelElements; - } - /** * Update the {@link AnnotationViewPartBase}: delegate update of concrete view to * {@link #update(Collection)}, and update model change listeners. @@ -181,9 +151,15 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect annotationEntries.addAll(IAnnotationValueService.INSTANCE.getValues(childModelElement)); } - // Update the view and change listener registration + // Update the view... update(annotationEntries); - updateChangeListener(rootElement); + + // ... and change listener registration + if(watchedElement != null) { + watchedElement.eAdapters().remove(changeListener); + } + watchedElement = rootElement; + watchedElement.eAdapters().add(changeListener); } /** Update concrete view */ @@ -205,11 +181,10 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect @Override public void dispose() { getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(this); - - for(EObject modelElement : watchedModelElements) { - modelElement.eAdapters().remove(changeListener); + if(watchedElement != null) { + watchedElement.eAdapters().remove(changeListener); + watchedElement = null; } - watchedModelElements.clear(); super.dispose(); }