diff options
11 files changed, 227 insertions, 8 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(); diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java index 7010d941e..bd53b5b8c 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/DiagramTypeProvider.java @@ -14,10 +14,10 @@ package org.eclipse.etrice.ui.behavior; import org.eclipse.etrice.ui.behavior.fsm.support.AbstractFSMProviderDispatcher; import org.eclipse.etrice.ui.behavior.support.ProviderDispatcher; -import org.eclipse.graphiti.dt.AbstractDiagramTypeProvider; +import org.eclipse.etrice.ui.behavior.fsm.editor.AbstractFSMDiagramTypeProvider; import org.eclipse.graphiti.tb.IToolBehaviorProvider; -public class DiagramTypeProvider extends AbstractDiagramTypeProvider { +public class DiagramTypeProvider extends AbstractFSMDiagramTypeProvider { public static final String PROVIDER_ID = "org.eclipse.etrice.ui.behavior.diagramTypeProvider"; diff --git a/tests/org.eclipse.etrice.core.genmodel.tests/org.eclipse.etrice.core.genmodel.tests.launch b/tests/org.eclipse.etrice.core.genmodel.tests/org.eclipse.etrice.core.genmodel.tests.launch index b571ac0d3..d1188e378 100644 --- a/tests/org.eclipse.etrice.core.genmodel.tests/org.eclipse.etrice.core.genmodel.tests.launch +++ b/tests/org.eclipse.etrice.core.genmodel.tests/org.eclipse.etrice.core.genmodel.tests.launch @@ -23,6 +23,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.core.genmodel.tests"/> diff --git a/tests/org.eclipse.etrice.core.room.tests/org.eclipse.etrice.core.room.tests.launch b/tests/org.eclipse.etrice.core.room.tests/org.eclipse.etrice.core.room.tests.launch index 5ff328ffe..8571d72bb 100644 --- a/tests/org.eclipse.etrice.core.room.tests/org.eclipse.etrice.core.room.tests.launch +++ b/tests/org.eclipse.etrice.core.room.tests/org.eclipse.etrice.core.room.tests.launch @@ -26,6 +26,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.core.room.tests"/> diff --git a/tests/org.eclipse.etrice.etunit.converter.tests/org.eclipse.etrice.etunit.converter.tests.launch b/tests/org.eclipse.etrice.etunit.converter.tests/org.eclipse.etrice.etunit.converter.tests.launch index 5ed4f4f6f..a820b2c29 100644 --- a/tests/org.eclipse.etrice.etunit.converter.tests/org.eclipse.etrice.etunit.converter.tests.launch +++ b/tests/org.eclipse.etrice.etunit.converter.tests/org.eclipse.etrice.etunit.converter.tests.launch @@ -24,6 +24,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.etunit.converter.tests"/> diff --git a/tests/org.eclipse.etrice.generator.tests/org.eclipse.etrice.generator.tests.launch b/tests/org.eclipse.etrice.generator.tests/org.eclipse.etrice.generator.tests.launch index 6506d0211..dc1cc85ff 100644 --- a/tests/org.eclipse.etrice.generator.tests/org.eclipse.etrice.generator.tests.launch +++ b/tests/org.eclipse.etrice.generator.tests/org.eclipse.etrice.generator.tests.launch @@ -23,6 +23,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.generator.tests"/> diff --git a/tests/org.eclipse.etrice.ui.behavior.tests/org.eclipse.etrice.ui.behavior.tests.launch b/tests/org.eclipse.etrice.ui.behavior.tests/org.eclipse.etrice.ui.behavior.tests.launch index 6f43ef7af..b43c18d3d 100644 --- a/tests/org.eclipse.etrice.ui.behavior.tests/org.eclipse.etrice.ui.behavior.tests.launch +++ b/tests/org.eclipse.etrice.ui.behavior.tests/org.eclipse.etrice.ui.behavior.tests.launch @@ -28,6 +28,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.ui.behavior.tests"/> diff --git a/tests/org.eclipse.etrice.ui.structure.tests/org.eclipse.etrice.ui.structure.tests.launch b/tests/org.eclipse.etrice.ui.structure.tests/org.eclipse.etrice.ui.structure.tests.launch index 5cc691ee9..9291857cb 100644 --- a/tests/org.eclipse.etrice.ui.structure.tests/org.eclipse.etrice.ui.structure.tests.launch +++ b/tests/org.eclipse.etrice.ui.structure.tests/org.eclipse.etrice.ui.structure.tests.launch @@ -27,6 +27,7 @@ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.etrice.ui.structure.tests"/> |