diff options
8 files changed, 525 insertions, 52 deletions
diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/editor/BehaviorEditor.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/editor/BehaviorEditor.java index 7de6bbe86..28259a370 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/editor/BehaviorEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/editor/BehaviorEditor.java @@ -21,11 +21,13 @@ import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.etrice.core.room.ActorClass; import org.eclipse.etrice.core.room.RefinedState; import org.eclipse.etrice.core.room.RoomFactory; +import org.eclipse.etrice.core.room.RoomModel; import org.eclipse.etrice.core.room.State; import org.eclipse.etrice.core.room.StateGraph; import org.eclipse.etrice.core.room.StructureClass; import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.etrice.ui.behavior.Activator; +import org.eclipse.etrice.ui.behavior.markers.DiagnosingModelObserver; import org.eclipse.etrice.ui.behavior.support.ContextSwitcher; import org.eclipse.etrice.ui.behavior.support.SupportUtil; import org.eclipse.etrice.ui.common.editor.RoomDiagramEditor; @@ -42,11 +44,16 @@ import org.eclipse.swt.graphics.Image; public class BehaviorEditor extends RoomDiagramEditor { public static final String BEHAVIOR_EDITOR_ID = "org.eclipse.etrice.ui.behavior.editor.BehaviorEditor"; + private DiagnosingModelObserver diagnosingModelObserver; public BehaviorEditor() { super(); } + public DiagnosingModelObserver getDiagnosingModelObserver() { + return diagnosingModelObserver; + } + @Override public Image getDefaultImage() { return Activator.getImage("icons/Behavior.gif"); @@ -54,6 +61,10 @@ public class BehaviorEditor extends RoomDiagramEditor { @Override public void initializeGraphicalViewer() { + // Start observing the Room Model for rendering Markers + diagnosingModelObserver = new DiagnosingModelObserver(); + diagnosingModelObserver.observeRoomModel((RoomModel)getActorClass().eResource().getContents().get(0)); + super.initializeGraphicalViewer(); Command cmd = new RecordingCommand(getEditingDomain()) { @@ -66,6 +77,13 @@ public class BehaviorEditor extends RoomDiagramEditor { getEditingDomain().getCommandStack().flush(); } + @Override + public void dispose() { + // Stop observing the Room Model + diagnosingModelObserver.removeObserver(); + super.dispose(); + } + public boolean showStateGraph(StateGraph sg) { URI boUri = EcoreUtil.getURI(sg); final StateGraph mySG = (StateGraph) getEditingDomain().getResourceSet().getEObject(boUri, true); diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DecoratorUtil.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DecoratorUtil.java new file mode 100644 index 000000000..fc5c7ce0a --- /dev/null +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DecoratorUtil.java @@ -0,0 +1,145 @@ +/******************************************************************************* + * Copyright (c) 2013 Jayant Gupta + * 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: + * Jayant Gupta (initial contribution) + * + *******************************************************************************/ + +package org.eclipse.etrice.ui.behavior.markers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.emf.common.util.Diagnostic; +import org.eclipse.graphiti.mm.pictograms.PictogramElement; +import org.eclipse.graphiti.platform.IPlatformImageConstants; +import org.eclipse.graphiti.tb.IDecorator; +import org.eclipse.graphiti.tb.ImageDecorator; + +/** + * A Utility Class for rendering error, warning and info markers in Behavior + * Graphical Editor. + * + * @author jayant + */ +public class DecoratorUtil { + + /** + * Private Constructor to prevent instanstiation. + */ + private DecoratorUtil() { + } + + /** + * Converts the list of {@link Diagnostic}s (associated with a + * {@link PictogramElement}) to a list of {@link IDecorator}s to be rendered + * over the element. + * + * @param diagnostics + * @return A list of IDecorators + */ + public static ArrayList<IDecorator> getMarkersFromDiagnostics( + ArrayList<Diagnostic> diagnostics) { + + if (diagnostics == null) + return new ArrayList<IDecorator>(); + + // Classify each Diagnostic as Error, Warning or Info. + HashMap<Integer, Set<String>> severityMessageMap = new HashMap<Integer, Set<String>>(); + for (Diagnostic diagnostic : diagnostics) { + + switch (diagnostic.getSeverity()) { + case Diagnostic.ERROR: + addMessage(severityMessageMap, Diagnostic.ERROR, + diagnostic.getMessage()); + break; + + case Diagnostic.WARNING: + addMessage(severityMessageMap, Diagnostic.WARNING, + diagnostic.getMessage()); + break; + + case Diagnostic.INFO: + addMessage(severityMessageMap, Diagnostic.INFO, + diagnostic.getMessage()); + break; + } + } + + ArrayList<IDecorator> decorators = new ArrayList<IDecorator>(); + // Form a combined marker for all Errors + if (severityMessageMap.containsKey(Diagnostic.ERROR)) { + IDecorator decorator = new ImageDecorator( + IPlatformImageConstants.IMG_ECLIPSE_ERROR_TSK); + decorator.setMessage(convertSetToString(severityMessageMap + .get(Diagnostic.ERROR))); + decorators.add(decorator); + } + + // Form a combined marker for all Warnings + if (severityMessageMap.containsKey(Diagnostic.WARNING)) { + IDecorator decorator = new ImageDecorator( + IPlatformImageConstants.IMG_ECLIPSE_WARNING_TSK); + decorator.setMessage(convertSetToString(severityMessageMap + .get(Diagnostic.WARNING))); + decorators.add(decorator); + } + + // Form a combined marker for all Infos + if (severityMessageMap.containsKey(Diagnostic.INFO)) { + IDecorator decorator = new ImageDecorator( + IPlatformImageConstants.IMG_ECLIPSE_INFORMATION_TSK); + decorator.setMessage(convertSetToString(severityMessageMap + .get(Diagnostic.INFO))); + decorators.add(decorator); + } + + return decorators; + } + + /** + * Adds message to the set of messages associated with the given key in the + * map. + * + * @param map + * @param key + * @param message + * + * @author jayant + */ + private static void addMessage(HashMap<Integer, Set<String>> map, int key, + String message) { + if (!map.containsKey(key)) { + map.put(key, new HashSet<String>()); + } + map.get(key).add(message); + } + + /** + * Form a single message for all messages of the set. + * + * @param stringSet + * @return a single combined message string for all the messages in the set + * + * @author jayant + */ + private static String convertSetToString(Set<String> stringSet) { + StringBuilder stringBuilder = new StringBuilder(); + for (String string : stringSet) { + stringBuilder.append("- ").append(string).append("\n"); + } + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + + if (stringSet.size() == 1) + return stringBuilder.substring(2); + else + return stringBuilder.toString(); + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DiagnosingModelObserver.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DiagnosingModelObserver.java new file mode 100644 index 000000000..236e2588d --- /dev/null +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/markers/DiagnosingModelObserver.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2013 Jayant Gupta + * 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: + * Jayant Gupta (initial contribution) + * + *******************************************************************************/ + +package org.eclipse.etrice.ui.behavior.markers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.util.Diagnostic; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.Diagnostician; +import org.eclipse.emf.ecore.util.EContentAdapter; +import org.eclipse.etrice.core.room.RoomModel; +import org.eclipse.etrice.core.room.StateGraph; +import org.eclipse.etrice.core.room.Trigger; +import org.eclipse.xtext.validation.FeatureBasedDiagnostic; +import org.eclipse.xtext.validation.ValidationMessageAcceptor; + +/** + * An {@link EContentAdapter} which validates the {@link RoomModel} on each + * change notification and stores the results of validation in a {@link HashMap} + * of model elements and associated {@link Diagnostic}s. + * + * @author jayant + */ +public class DiagnosingModelObserver extends EContentAdapter { + + /** + * A {@link HashMap} for storing {@link Diagnostic}s keyed on the model + * elements they belong to. + */ + private HashMap<EObject, ArrayList<Diagnostic>> elementDiagnosticMap; + + /** + * The {@link RoomModel} being observed. + */ + private RoomModel roomModel; + + public DiagnosingModelObserver() { + elementDiagnosticMap = new HashMap<EObject, ArrayList<Diagnostic>>(); + } + + /** + * Starts listening to changes of the given {@link RoomModel}. + * + * @param roomModel + * @author jayant + */ + public void observeRoomModel(RoomModel roomModel) { + // Start observing the room model + this.roomModel = roomModel; + setTarget(roomModel); + + // Validate and Populate HashMap for rendering markers initially. + updateElementDiagonosticMap(); + } + + /** + * Stops observing the {@link RoomModel}. + * + * @author jayant + */ + public void removeObserver() { + unsetTarget(roomModel); + } + + /** + * {@inheritDoc} Updates elementDiagnosticMap on each notification (except + * Adapter Removal) + * + * @author jayant + */ + @Override + public void notifyChanged(Notification notification) { + super.notifyChanged(notification); + + // Re-Validate on each notification except Adapter Removal. + // This prevents the editor to hang on dispose (since all adapters are + // then removed). + if (notification.getEventType() < Notification.REMOVING_ADAPTER) { + updateElementDiagonosticMap(); + } + } + + public HashMap<EObject, ArrayList<Diagnostic>> getElementDiagonsticMap() { + return elementDiagnosticMap; + } + + /** + * Updates the elementDiagnosticMap by re-validating the model. + * + * @author jayant + */ + private void updateElementDiagonosticMap() { + // Clear HashMap to remove orphaned element references + elementDiagnosticMap.clear(); + + // Perform Model Validation and get the diagnostic + Diagnostic diagnostics = Diagnostician.INSTANCE.validate(roomModel); + + // Inspect each child diagnostic + for (Diagnostic diagnostic : diagnostics.getChildren()) { + + // for each child diagnostic, find the associated EObject + FeatureBasedDiagnostic featureBasedDiagnostic = (FeatureBasedDiagnostic) diagnostic; + EObject source = featureBasedDiagnostic.getSourceEObject(); + + EObject eObject = null; + if (source instanceof StateGraph) { + EStructuralFeature feature = featureBasedDiagnostic + .getFeature(); + int index = featureBasedDiagnostic.getIndex(); + + if (!feature.isMany()) + eObject = (EObject) source.eGet(feature); + else if (index != ValidationMessageAcceptor.INSIGNIFICANT_INDEX) { + List<?> list = (List<?>) source.eGet(feature); + eObject = (EObject) list.get(index); + } + } else if (source instanceof Trigger) + eObject = source.eContainer(); + else + eObject = source; + + if (eObject != null) { + // Add diagnostic to elementDiagnosticMap keyed on model element + if (elementDiagnosticMap.get(eObject) == null) + elementDiagnosticMap.put(eObject, + new ArrayList<Diagnostic>()); + elementDiagnosticMap.get(eObject).add(diagnostic); + } + } + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/ChoicePointSupport.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/ChoicePointSupport.java index 3108fd36f..efec629d8 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/ChoicePointSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/ChoicePointSupport.java @@ -12,6 +12,9 @@ package org.eclipse.etrice.ui.behavior.support; +import java.util.ArrayList; + +import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.etrice.core.naming.RoomNameProvider; @@ -21,6 +24,8 @@ import org.eclipse.etrice.core.room.RoomFactory; import org.eclipse.etrice.core.room.StateGraph; import org.eclipse.etrice.ui.behavior.ImageProvider; import org.eclipse.etrice.ui.behavior.dialogs.ChoicePointPropertyDialog; +import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor; +import org.eclipse.etrice.ui.behavior.markers.DecoratorUtil; import org.eclipse.etrice.ui.common.support.CommonSupportUtil; import org.eclipse.etrice.ui.common.support.DeleteWithoutConfirmFeature; import org.eclipse.etrice.ui.common.support.NoResizeFeature; @@ -73,7 +78,9 @@ import org.eclipse.graphiti.services.IPeCreateService; import org.eclipse.graphiti.tb.ContextButtonEntry; import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider; import org.eclipse.graphiti.tb.IContextButtonPadData; +import org.eclipse.graphiti.tb.IDecorator; import org.eclipse.graphiti.tb.IToolBehaviorProvider; +import org.eclipse.graphiti.tb.ImageDecorator; import org.eclipse.graphiti.ui.features.DefaultFeatureProvider; import org.eclipse.graphiti.util.ColorConstant; import org.eclipse.graphiti.util.IColorConstant; @@ -583,6 +590,48 @@ public class ChoicePointSupport { return data; } + + /** + * @author jayant + */ + @Override + public IDecorator[] getDecorators(PictogramElement pe) { + // Constants for positioning decorators + GraphicsAlgorithm invisible = pe.getGraphicsAlgorithm(); + GraphicsAlgorithm rectangle = invisible + .getGraphicsAlgorithmChildren().get(0); + int xOrigin = rectangle.getX(); + int yOrigin = rectangle.getY(); + int xGap = 10, yGap = 0; + + // Get the linked Business Object + EObject bo = Graphiti.getLinkService() + .getBusinessObjectForLinkedPictogramElement(pe); + + // Get Diagnostics associated with the business object + ArrayList<Diagnostic> diagnostics = ((BehaviorEditor) getDiagramTypeProvider() + .getDiagramBehavior().getDiagramContainer()) + .getDiagnosingModelObserver().getElementDiagonsticMap() + .get(bo); + + // Form Decorators based on Diagnostics + ArrayList<IDecorator> decorators = DecoratorUtil + .getMarkersFromDiagnostics(diagnostics); + + if (decorators.isEmpty()) + return super.getDecorators(pe); + else { + int i = 0; + for (IDecorator decorator : decorators) { + ((ImageDecorator) decorator).setX(xOrigin + xGap * i); + ((ImageDecorator) decorator).setY(yOrigin + yGap * i); + i++; + } + + return (IDecorator[]) decorators + .toArray(new IDecorator[decorators.size()]); + } + } } private FeatureProvider pfp; diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateGraphSupport.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateGraphSupport.java index d2a2f1b59..93971f397 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateGraphSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateGraphSupport.java @@ -12,8 +12,10 @@ package org.eclipse.etrice.ui.behavior.support; +import java.util.ArrayList; import java.util.List; +import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.etrice.core.naming.RoomNameProvider; @@ -23,6 +25,8 @@ import org.eclipse.etrice.core.room.StateGraph; import org.eclipse.etrice.core.room.TrPoint; import org.eclipse.etrice.core.room.Transition; import org.eclipse.etrice.ui.behavior.commands.StateGraphContext; +import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor; +import org.eclipse.etrice.ui.behavior.markers.DecoratorUtil; import org.eclipse.etrice.ui.common.support.DeleteWithoutConfirmFeature; import org.eclipse.graphiti.dt.IDiagramTypeProvider; import org.eclipse.graphiti.features.IAddFeature; @@ -63,7 +67,9 @@ import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.IGaService; import org.eclipse.graphiti.services.IPeCreateService; import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider; +import org.eclipse.graphiti.tb.IDecorator; import org.eclipse.graphiti.tb.IToolBehaviorProvider; +import org.eclipse.graphiti.tb.ImageDecorator; import org.eclipse.graphiti.ui.features.DefaultFeatureProvider; import org.eclipse.graphiti.util.ColorConstant; import org.eclipse.graphiti.util.IColorConstant; @@ -588,6 +594,48 @@ public class StateGraphSupport { public ICustomFeature getDoubleClickFeature(IDoubleClickContext context) { return new FeatureProvider.GoUpFeature(getDiagramTypeProvider().getFeatureProvider()); } + + /** + * @author jayant + */ + @Override + public IDecorator[] getDecorators(PictogramElement pe) { + // Constants for positioning decorators + GraphicsAlgorithm invisible = pe.getGraphicsAlgorithm(); + GraphicsAlgorithm rectangle = invisible + .getGraphicsAlgorithmChildren().get(0); + int xOrigin = rectangle.getX(); + int yOrigin = rectangle.getY(); + int xGap = 10, yGap = 0; + + // Get the linked Business Object + EObject bo = Graphiti.getLinkService() + .getBusinessObjectForLinkedPictogramElement(pe); + + // Get Diagnostics associated with the business object + ArrayList<Diagnostic> diagnostics = ((BehaviorEditor) getDiagramTypeProvider() + .getDiagramBehavior().getDiagramContainer()) + .getDiagnosingModelObserver().getElementDiagonsticMap() + .get(bo); + + // Form Decorators based on Diagnostics + ArrayList<IDecorator> decorators = DecoratorUtil + .getMarkersFromDiagnostics(diagnostics); + + if (decorators.isEmpty()) + return super.getDecorators(pe); + else { + int i = 0; + for (IDecorator decorator : decorators) { + ((ImageDecorator) decorator).setX(xOrigin + xGap * i); + ((ImageDecorator) decorator).setY(yOrigin + yGap * i); + i++; + } + + return (IDecorator[]) decorators + .toArray(new IDecorator[decorators.size()]); + } + } } private FeatureProvider afp; diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateSupport.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateSupport.java index e78d3dcc1..28831b884 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/StateSupport.java @@ -13,12 +13,9 @@ package org.eclipse.etrice.ui.behavior.support; import java.util.ArrayList; -import java.util.List; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.util.Diagnostician; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.etrice.core.naming.RoomNameProvider; import org.eclipse.etrice.core.room.ActorClass; @@ -31,6 +28,8 @@ import org.eclipse.etrice.core.room.TrPoint; import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.etrice.ui.behavior.ImageProvider; import org.eclipse.etrice.ui.behavior.dialogs.StatePropertyDialog; +import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor; +import org.eclipse.etrice.ui.behavior.markers.DecoratorUtil; import org.eclipse.etrice.ui.common.support.CommonSupportUtil; import org.eclipse.etrice.ui.common.support.DeleteWithoutConfirmFeature; import org.eclipse.graphiti.datatypes.IDimension; @@ -84,7 +83,6 @@ import org.eclipse.graphiti.mm.pictograms.ContainerShape; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.mm.pictograms.Shape; -import org.eclipse.graphiti.platform.IPlatformImageConstants; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.IGaService; import org.eclipse.graphiti.services.IPeCreateService; @@ -1086,65 +1084,41 @@ public class StateSupport { */ @Override public IDecorator[] getDecorators(PictogramElement pe) { - //Some constants for decorator + // Constants for positioning decorators GraphicsAlgorithm invisible = pe.getGraphicsAlgorithm(); - GraphicsAlgorithm rectangle = invisible.getGraphicsAlgorithmChildren().get(0); + GraphicsAlgorithm rectangle = invisible + .getGraphicsAlgorithmChildren().get(0); int xOrigin = rectangle.getX(); int yOrigin = rectangle.getY(); - ArrayList<IDecorator> decorators = new ArrayList<IDecorator>(); + int xGap = 10, yGap = 0; - //Get the linked Business Object + // Get the linked Business Object EObject bo = Graphiti.getLinkService() .getBusinessObjectForLinkedPictogramElement(pe); - //Validate the compete ROOM Model and Get Diagnostics - EObject myModel = bo.eResource().getContents().get(0); - Diagnostic diagnostics = Diagnostician.INSTANCE.validate(myModel); + // Get Diagnostics associated with the business object + ArrayList<Diagnostic> diagnostics = ((BehaviorEditor) getDiagramTypeProvider() + .getDiagramBehavior().getDiagramContainer()) + .getDiagnosingModelObserver().getElementDiagonsticMap() + .get(bo); - //Inspect each child diagnostic - for (Diagnostic diagnostic : diagnostics.getChildren()) { - - //for each child diagnostic, find the associated EObject - FeatureBasedDiagnostic featureBasedDiagnostic = (FeatureBasedDiagnostic)diagnostic; - EObject source = featureBasedDiagnostic.getSourceEObject(); - EStructuralFeature feature = featureBasedDiagnostic.getFeature(); - int index = featureBasedDiagnostic.getIndex(); - EObject eObject = null; - if (!feature.isMany()) - eObject = (EObject) source.eGet(feature); - else { - List<?> list = (List<?>) source.eGet(feature); - eObject = (EObject) list.get(index); - } - - //compare the diagnostic EObject with the Business object linked with the pictogram element - //if they are equal, add entry to IDecorator[] - if (eObject.equals(bo)){ - ImageDecorator imageRenderingDecorator = null; - switch (diagnostic.getSeverity()) { - case Diagnostic.ERROR: - imageRenderingDecorator = new ImageDecorator(IPlatformImageConstants.IMG_ECLIPSE_ERROR_TSK); - break; - case Diagnostic.WARNING: - imageRenderingDecorator = new ImageDecorator(IPlatformImageConstants.IMG_ECLIPSE_WARNING_TSK); - break; - case Diagnostic.INFO: - imageRenderingDecorator = new ImageDecorator(IPlatformImageConstants.IMG_ECLIPSE_INFORMATION_TSK); - break; - } - if (imageRenderingDecorator != null){ - imageRenderingDecorator.setMessage(diagnostic.getMessage()); - imageRenderingDecorator.setX(xOrigin); - imageRenderingDecorator.setY(yOrigin); - decorators.add(imageRenderingDecorator); - } - } - } + // Form Decorators based on Diagnostics + ArrayList<IDecorator> decorators = DecoratorUtil + .getMarkersFromDiagnostics(diagnostics); if (decorators.isEmpty()) return super.getDecorators(pe); - else - return (IDecorator[]) decorators.toArray(new IDecorator[decorators.size()]); + else { + int i = 0; + for (IDecorator decorator : decorators) { + ((ImageDecorator) decorator).setX(xOrigin + xGap * i); + ((ImageDecorator) decorator).setY(yOrigin + yGap * i); + i++; + } + + return (IDecorator[]) decorators + .toArray(new IDecorator[decorators.size()]); + } } } diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TrPointSupport.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TrPointSupport.java index fa0dc3f88..0dbfec858 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TrPointSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TrPointSupport.java @@ -12,8 +12,10 @@ package org.eclipse.etrice.ui.behavior.support; +import java.util.ArrayList; import java.util.List; +import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.etrice.core.naming.RoomNameProvider; @@ -29,6 +31,8 @@ import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.etrice.core.validation.ValidationUtil; import org.eclipse.etrice.ui.behavior.ImageProvider; import org.eclipse.etrice.ui.behavior.dialogs.TrPointPropertyDialog; +import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor; +import org.eclipse.etrice.ui.behavior.markers.DecoratorUtil; import org.eclipse.etrice.ui.common.support.CommonSupportUtil; import org.eclipse.etrice.ui.common.support.DeleteWithoutConfirmFeature; import org.eclipse.etrice.ui.common.support.NoResizeFeature; @@ -86,7 +90,9 @@ import org.eclipse.graphiti.services.IPeCreateService; import org.eclipse.graphiti.tb.ContextButtonEntry; import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider; import org.eclipse.graphiti.tb.IContextButtonPadData; +import org.eclipse.graphiti.tb.IDecorator; import org.eclipse.graphiti.tb.IToolBehaviorProvider; +import org.eclipse.graphiti.tb.ImageDecorator; import org.eclipse.graphiti.ui.features.DefaultFeatureProvider; import org.eclipse.graphiti.util.ColorConstant; import org.eclipse.graphiti.util.IColorConstant; @@ -980,6 +986,47 @@ public class TrPointSupport { return data; } + + /** + * @author jayant + */ + @Override + public IDecorator[] getDecorators(PictogramElement pe) { + // Constants for positioning decorators + GraphicsAlgorithm ga = pe.getGraphicsAlgorithm(); + GraphicsAlgorithm port = ga.getGraphicsAlgorithmChildren().get(0); + int xOrigin = port.getX() + 6; + int yOrigin = port.getY() - 6; + int xGap = 0, yGap = 7; + + // Get the linked Business Object + EObject bo = Graphiti.getLinkService() + .getBusinessObjectForLinkedPictogramElement(pe); + + // Get Diagnostics associated with the business object + ArrayList<Diagnostic> diagnostics = ((BehaviorEditor) getDiagramTypeProvider() + .getDiagramBehavior().getDiagramContainer()) + .getDiagnosingModelObserver().getElementDiagonsticMap() + .get(bo); + + // Form Decorators based on Diagnostics + ArrayList<IDecorator> decorators = DecoratorUtil + .getMarkersFromDiagnostics(diagnostics); + + if (decorators.isEmpty()) + return super.getDecorators(pe); + else { + int i = 0; + for (IDecorator decorator : decorators) { + ((ImageDecorator) decorator).setX(xOrigin + xGap * i); + ((ImageDecorator) decorator).setY(yOrigin + yGap * i); + i++; + } + + return (IDecorator[]) decorators + .toArray(new IDecorator[decorators.size()]); + } + } } private FeatureProvider pfp; diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TransitionSupport.java b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TransitionSupport.java index c5eae86fc..1d00fbf5e 100644 --- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TransitionSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/support/TransitionSupport.java @@ -14,6 +14,7 @@ package org.eclipse.etrice.ui.behavior.support; import java.util.ArrayList; +import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.etrice.core.naming.RoomNameProvider; @@ -38,6 +39,8 @@ import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.etrice.core.validation.ValidationUtil; import org.eclipse.etrice.ui.behavior.ImageProvider; import org.eclipse.etrice.ui.behavior.dialogs.TransitionPropertyDialog; +import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor; +import org.eclipse.etrice.ui.behavior.markers.DecoratorUtil; import org.eclipse.etrice.ui.common.support.DeleteWithoutConfirmFeature; import org.eclipse.graphiti.datatypes.ILocation; import org.eclipse.graphiti.dt.IDiagramTypeProvider; @@ -86,7 +89,9 @@ import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.IGaService; import org.eclipse.graphiti.services.IPeCreateService; import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider; +import org.eclipse.graphiti.tb.IDecorator; import org.eclipse.graphiti.tb.IToolBehaviorProvider; +import org.eclipse.graphiti.tb.ImageDecorator; import org.eclipse.graphiti.ui.features.DefaultFeatureProvider; import org.eclipse.graphiti.util.ColorConstant; import org.eclipse.graphiti.util.IColorConstant; @@ -901,6 +906,47 @@ public class TransitionSupport { return super.getToolTip(ga); } + + /** + * @author jayant + */ + @Override + public IDecorator[] getDecorators(PictogramElement pe) { + if (pe.isVisible()) { + // Constants for positioning decorators + int xOrigin = -20, yOrigin = 0; // Position to the left of label + int xGap = 0, yGap = -10; + + // Get the linked Business Object + EObject bo = Graphiti.getLinkService() + .getBusinessObjectForLinkedPictogramElement( + (PictogramElement) pe.eContainer()); + + // Get Diagnostics associated with the business object + ArrayList<Diagnostic> diagnostics = ((BehaviorEditor) getDiagramTypeProvider() + .getDiagramBehavior().getDiagramContainer()) + .getDiagnosingModelObserver().getElementDiagonsticMap() + .get(bo); + + // Form Decorators based on Diagnostics + ArrayList<IDecorator> decorators = DecoratorUtil + .getMarkersFromDiagnostics(diagnostics); + + if (!decorators.isEmpty()) { + int i = 0; + for (IDecorator decorator : decorators) { + ((ImageDecorator) decorator).setX(xOrigin + i * xGap); + ((ImageDecorator) decorator).setY(yOrigin + i * yGap); + i++; + } + + return (IDecorator[]) decorators + .toArray(new IDecorator[decorators.size()]); + } + } + + return super.getDecorators(pe); + } } private FeatureProvider pfp; |