From 233116a362e02e84f419aab50ef1f4c87a42b4b1 Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Wed, 8 Jun 2016 12:16:49 +0000 Subject: [PATCH] - Add AnnotationViewPartBase.setUpdateEnabled() and .isUpdateEnabled() that allows to control if AnnotationView is updated --- .../view/AnnotationViewPartBase.java | 48 ++++++++++++++++++- .../view/generic/GenericAnnotationView.java | 8 +++- 2 files changed, 53 insertions(+), 3 deletions(-) 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 af8ef0465..291979c34 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 @@ -24,7 +24,9 @@ import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getParent import java.util.Collection; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.TreeSet; import org.eclipse.emf.common.notify.Adapter; @@ -85,6 +87,18 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect /** Flag to prevent nested calls of {@link #selectionChanged(IWorkbenchPart, ISelection)}. */ private boolean processingSectionChanged = false; + /** Flag if update of {@link AnnotationViewPartBase} views is enabled. */ + private static boolean isUpdateEnabled = true; + + /** Active instances of {@link AnnotationViewPartBase} views. */ + private static Set<AnnotationViewPartBase> activeInstances = + new HashSet<AnnotationViewPartBase>(); + + /** Constructs a new {@link AnnotationViewPartBase}. */ + public AnnotationViewPartBase() { + activeInstances.add(this); + } + /** * {@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 @@ -94,6 +108,10 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect /** {@inheritDoc} */ @Override public void notifyChanged(Notification notification) { + if(!isUpdateEnabled) { + return; + } + // Required to actually watch child elements (behavior of EContentAdapter) super.notifyChanged(notification); @@ -198,7 +216,8 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect */ private void addAnnotationEntry(Collection<AnnotationEntry> annotationEntries, IModelElement modelElement) { - AnnotationEntry entry = IAnnotationValueService.getInstance().getAnnotationEntry(modelElement); + AnnotationEntry entry = + IAnnotationValueService.getInstance().getAnnotationEntry(modelElement); if(!entry.isEmpty()) { annotationEntries.add(entry); @@ -266,6 +285,9 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect /** Update concrete view */ protected abstract void update(Collection<AnnotationEntry> annotationEntries); + /** Triggers an update of the view to refresh its last state. */ + public abstract void update(); + /** {@inheritDoc} */ @Override public void createPartControl(Composite parent) { @@ -280,7 +302,7 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect /** {@inheritDoc} */ @Override - public void dispose() { + public synchronized void dispose() { // Unregister listeners getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(this); if(watchedElement != null) { @@ -289,5 +311,27 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect } super.dispose(); + + activeInstances.remove(this); + } + + /** Sets {@link #isUpdateEnabled}. If the update is re-enabled, the view is refreshed. */ + public static synchronized void setUpdateEnabled(boolean isUpdateEnabled) { + AnnotationViewPartBase.isUpdateEnabled = isUpdateEnabled; + if(isUpdateEnabled) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + for(AnnotationViewPartBase avp : activeInstances) { + avp.update(); + } + } + }); + } + } + + /** Returns {@link #isUpdateEnabled}. */ + public synchronized static boolean isUpdateEnabled() { + return isUpdateEnabled; } } diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java index 09b5f978f..951876b07 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java @@ -156,7 +156,8 @@ public class GenericAnnotationView extends AnnotationViewPartBase { return annotationFilter; } - /** Updates the table after a filter change */ + /** {@inheritDoc} */ + @Override public void update() { // Full update, i.e. including reconstructions of columns is always required due to the // following scenario: @@ -164,6 +165,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { // - Filter scope is changed to component names -> annotation filter needs to be undone // - Filter is based on annotation entry type // - Filter is set to current level / current sub model + // - Update of view as been disabled using setUpdateEnable(boolean) is re-enabled now if(lastAnnotationEntries != null) { update(lastAnnotationEntries); } @@ -172,6 +174,10 @@ public class GenericAnnotationView extends AnnotationViewPartBase { /** {@inheritDoc} */ @Override protected void update(Collection<AnnotationEntry> annotationEntries) { + if(!isUpdateEnabled()) { + return; + } + // Update row filter with currently selected element annotationFilter.setCurrentySelectedModelElement(getCurrentlySelectedObject()); boolean contentRequiresUpdate = -- GitLab