Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorepaen2014-08-22 15:03:54 +0000
committerHenrik Rentz-Reichert2014-09-02 12:32:02 +0000
commitf9c20184cec20d26b1e69aa04b3f122394b040e1 (patch)
treeee2d64fb8fa4e54c286c8e42833337d1c3613082 /plugins/org.eclipse.etrice.ui.behavior.fsm/src
parentcb3e4d698bd1ff514466707ba433b15c78ac08f5 (diff)
downloadorg.eclipse.etrice-f9c20184cec20d26b1e69aa04b3f122394b040e1.tar.gz
org.eclipse.etrice-f9c20184cec20d26b1e69aa04b3f122394b040e1.tar.xz
org.eclipse.etrice-f9c20184cec20d26b1e69aa04b3f122394b040e1.zip
[ui.behavior.fsm] fixes for validation decorators
- manage state of DiagnosingModelObserver when refreshing diagram - force deactivate/activate of diagram elements (EditParts) when refreshing, workaround for orphaned decorators during refresh of PictogramElements Change-Id: I95dcc35004e68d2fd6b0aa53ebfe8ceb2c8a91c5
Diffstat (limited to 'plugins/org.eclipse.etrice.ui.behavior.fsm/src')
-rw-r--r--plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java109
-rw-r--r--plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramTypeProvider.java38
-rw-r--r--plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java39
-rw-r--r--plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/DiagnosingModelObserver.java39
4 files changed, 219 insertions, 6 deletions
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java
new file mode 100644
index 000000000..f03eb2c9b
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramBehavior.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2013 protos software gmbh (http://www.protos.de).
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Eyrak Paen (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.ui.behavior.fsm.editor;
+
+import org.eclipse.etrice.ui.behavior.fsm.editor.DiagnosingModelObserver;
+import org.eclipse.etrice.ui.common.base.editor.CustomDiagramBehavior;
+import org.eclipse.gef.EditPart;
+import org.eclipse.graphiti.ui.editor.DefaultRefreshBehavior;
+import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+
+/**
+ * Customizes the DiagramBehavior to help manage BehaviorEditor-specific
+ * functionality. This subclass influences the state of the
+ * DiagnosingModelObserver and ensures that the validation image decorators are
+ * in sync with the diagram.
+ * @author Eyrak Paen
+ *
+ */
+public class AbstractFSMDiagramBehavior extends CustomDiagramBehavior {
+ /**
+ * @param diagramContainer
+ */
+ public AbstractFSMDiagramBehavior(AbstractFSMEditor diagramContainer) {
+ super(diagramContainer);
+ }
+
+ /**
+ * Add the DiagnosingModelObserver to the diagram business model when enabling adapters
+ */
+ @Override
+ protected void enableAdapters() {
+ AbstractFSMEditor editor = (AbstractFSMEditor)getDiagramContainer();
+ DiagnosingModelObserver dmObserver = editor.getDiagnosingModelObserver();
+ if(dmObserver != null) dmObserver.enable();
+ super.enableAdapters();
+ }
+
+ /**
+ * Remove the DiagnosingModelObserver explicitly from the diagram business model when
+ * disabling adapters
+ */
+ @Override
+ protected void disableAdapters() {
+ AbstractFSMEditor editor = (AbstractFSMEditor)getDiagramContainer();
+ DiagnosingModelObserver dmObserver = editor.getDiagnosingModelObserver();
+ if(dmObserver != null) dmObserver.disable();
+ super.disableAdapters();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.etrice.ui.common.editor.CustomDiagramBehavior#createUpdateBehavior()
+ */
+ @Override
+ protected DefaultUpdateBehavior createUpdateBehavior() {
+ return new UpdateBehavior(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.ui.editor.DiagramBehavior#getRefreshBehavior()
+ */
+ @Override
+ public DefaultRefreshBehavior createRefreshBehavior() {
+ return new RefreshBehavior(this);
+ }
+
+ static class UpdateBehavior extends DefaultUpdateBehavior {
+ public UpdateBehavior(DiagramBehavior diagramBehavior) {
+ super(diagramBehavior);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior#handleChangedResources()
+ */
+ @Override
+ protected void handleChangedResources() {
+ // Remove DiagnosticModelObserver from diagram's business model before invoking default handleChangedResources
+ ((AbstractFSMEditor)diagramBehavior.getDiagramContainer()).detachDiagnosingModelObserver();
+ super.handleChangedResources();
+ }
+ }
+
+ static class RefreshBehavior extends DefaultRefreshBehavior {
+ public RefreshBehavior(DiagramBehavior diagramBehavior) {
+ super(diagramBehavior);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.ui.editor.DefaultRefreshBehavior#internalRefreshEditPart(org.eclipse.gef.EditPart)
+ */
+ @Override
+ public void internalRefreshEditPart(EditPart editPart) {
+ // Explicitly deactivate and reactivate EditPart to force call to removeDecorators
+ editPart.deactivate();
+ editPart.activate();
+ super.internalRefreshEditPart(editPart);
+ }
+ }
+}
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramTypeProvider.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramTypeProvider.java
new file mode 100644
index 000000000..73c0ee1e4
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMDiagramTypeProvider.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 protos software gmbh (http://www.protos.de).
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Eyrak Paen (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.ui.behavior.fsm.editor;
+
+import org.eclipse.graphiti.dt.AbstractDiagramTypeProvider;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.platform.IDiagramContainer;
+
+/**
+ * This class augments the AbstractDiagramTypeProvider to help manage
+ * functionality provided by {@link AbstractFSMEditor}. Diagram editor plugins
+ * that extend {@link AbstractFSMEditor} should also extend and use this class.
+ */
+public abstract class AbstractFSMDiagramTypeProvider extends AbstractDiagramTypeProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.dt.AbstractDiagramTypeProvider#resourceReloaded(org.eclipse.graphiti.mm.pictograms.Diagram)
+ */
+ @Override
+ public void resourceReloaded(Diagram diagram) {
+ super.resourceReloaded(diagram);
+ IDiagramContainer dgContainer = this.getDiagramBehavior().getDiagramContainer();
+ if(dgContainer instanceof AbstractFSMEditor)
+ {
+ ((AbstractFSMEditor)dgContainer).attachDiagnosingModelObserver();
+ }
+ }
+}
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java
index 1bc3fa9bf..f619e7386 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java
@@ -37,10 +37,14 @@ import org.eclipse.graphiti.features.context.impl.UpdateContext;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
import com.google.common.base.Function;
/**
+ * Plugins that extend and use this class should also extend and use
+ * {@link AbstractFSMDiagramTypeProvider}.
+ *
* @author Henrik Rentz-Reichert
*
*/
@@ -58,10 +62,36 @@ public abstract class AbstractFSMEditor extends DiagramEditorBase {
public DiagnosingModelObserver getDiagnosingModelObserver() {
return diagnosingModelObserver;
}
+
+ /**
+ * Attaches the DiagnosingModelObserver to the current RoomModel. If the
+ * Observer is already attached, it is first detached.
+ */
+ public void attachDiagnosingModelObserver() {
+ DiagnosingModelObserver dmObserver = this.getDiagnosingModelObserver();
+ // dmObserver may be null if graphical viewer is not yet initialized
+ if(dmObserver != null) {
+ // Ensure that the dmObserver is not bound to the previous RoomModel
+ dmObserver.removeObserver();
+ dmObserver.observeModel(getModel());
+ }
+ }
+
+ /**
+ * Detaches the DiagnosingModelObserver from the diagram's associated
+ * business model.
+ */
+ public void detachDiagnosingModelObserver() {
+ DiagnosingModelObserver dmObserver = this.getDiagnosingModelObserver();
+ // dmObserver may be null if graphical viewer is not yet initialized
+ if(dmObserver != null) {
+ dmObserver.removeObserver();
+ }
+ }
@Override
public void initializeGraphicalViewer() {
- // Start observing the Room Model for rendering Markers
+ // Start observing the diagram business model for rendering Markers
diagnosingModelObserver = new DiagnosingModelObserver();
diagnosingModelObserver.observeModel(getModel());
@@ -97,10 +127,15 @@ public abstract class AbstractFSMEditor extends DiagramEditorBase {
@Override
public void dispose() {
- // Stop observing the Room Model
+ // Stop observing the diagram business model
diagnosingModelObserver.removeObserver();
super.dispose();
}
+
+ @Override
+ protected DiagramBehavior createDiagramBehavior() {
+ return new AbstractFSMDiagramBehavior(this);
+ }
@Override
public void doSave(IProgressMonitor monitor) {
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/DiagnosingModelObserver.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/DiagnosingModelObserver.java
index 326456da0..ba29924be 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/DiagnosingModelObserver.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/DiagnosingModelObserver.java
@@ -48,11 +48,34 @@ public class DiagnosingModelObserver extends EContentAdapter {
*/
private EObject mdel;
+ private boolean enabled;
+
public DiagnosingModelObserver() {
elementDiagnosticMap = new HashMap<EObject, ArrayList<Diagnostic>>();
}
/**
+ * @param enable diagnostics updates due to change notifications
+ */
+ public void enable() {
+ this.enabled = true;
+ }
+
+ /**
+ * @param disable diagnostics updates due to change notifications
+ */
+ public void disable() {
+ this.enabled = false;
+ }
+
+ /**
+ * @return whether the observer is enabled (i.e. whether change notifications will update the diagnostics)
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
* Starts listening to changes of the given {@link RoomModel}.
*
* @param model
@@ -62,9 +85,10 @@ public class DiagnosingModelObserver extends EContentAdapter {
// Start observing the room model
this.mdel = model;
setTarget(model);
+ enable();
// Validate and Populate HashMap for rendering markers initially.
- updateElementDiagonosticMap();
+ updateElementDiagnosticMap();
}
/**
@@ -73,7 +97,12 @@ public class DiagnosingModelObserver extends EContentAdapter {
* @author jayant
*/
public void removeObserver() {
- unsetTarget(mdel);
+ disable();
+ elementDiagnosticMap.clear();
+ if(mdel != null) {
+ unsetTarget(mdel);
+ mdel = null;
+ }
}
/**
@@ -90,7 +119,7 @@ public class DiagnosingModelObserver extends EContentAdapter {
// This prevents the editor to hang on dispose (since all adapters are
// then removed).
if (notification.getEventType() < Notification.REMOVING_ADAPTER) {
- updateElementDiagonosticMap();
+ updateElementDiagnosticMap();
}
}
@@ -103,7 +132,9 @@ public class DiagnosingModelObserver extends EContentAdapter {
*
* @author jayant
*/
- private void updateElementDiagonosticMap() {
+ private void updateElementDiagnosticMap() {
+ if(!isEnabled()) return;
+
// Clear HashMap to remove orphaned element references
elementDiagnosticMap.clear();

Back to the top