diff options
author | epaen | 2014-08-22 15:03:54 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2014-09-02 12:32:02 +0000 |
commit | f9c20184cec20d26b1e69aa04b3f122394b040e1 (patch) | |
tree | ee2d64fb8fa4e54c286c8e42833337d1c3613082 /plugins/org.eclipse.etrice.ui.behavior.fsm/src | |
parent | cb3e4d698bd1ff514466707ba433b15c78ac08f5 (diff) | |
download | org.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')
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(); |