소스 검색

added modelling assistant provider for transitions, declarations text part undeletable, Transition labels moveable

Andreas Mülder 14 년 전
부모
커밋
1b4dd0d041

+ 15 - 1
plugins/org.yakindu.sct.statechart.diagram/plugin.xml

@@ -149,7 +149,21 @@
       </parser>
    </extension>
    
-     <!-- View Provider -->
+   <!-- Contribution Item Provider -->
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
+      <contributionItemProvider
+            class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider"
+            checkPluginLoaded="false">
+         <Priority name="Low"/>
+         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
+            <popupStructuredContributionCriteria objectClass="org.yakindu.sct.statechart.diagram.editparts.StatechartTextEditPart"/>
+            <popupStructuredContributionCriteria objectClass="org.yakindu.sct.statechart.diagram.editparts.StatechartTextExpressionEditPart"/>
+            <popupPredefinedItem id="editGroup" remove="true"/>
+         </popupContribution>
+      </contributionItemProvider>
+   </extension>
+   
+  <!-- View Provider -->
    
    <extension
          point="org.eclipse.gmf.runtime.diagram.core.viewProviders">

+ 36 - 9
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/assistent/StatechartModelingAssistantProvider.java

@@ -18,13 +18,16 @@ import static org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes.J
 import static org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes.REGION;
 import static org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes.SHALLOWHISTORY;
 import static org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes.STATE;
+import static org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes.TRANSITION;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.emf.type.core.IElementType;
 import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;
+import org.yakindu.sct.statechart.diagram.editor.StatechartElementTypes;
 import org.yakindu.sct.statechart.diagram.editparts.RegionCompartmentEditPart;
 import org.yakindu.sct.statechart.diagram.editparts.RegionEditPart;
 import org.yakindu.sct.statechart.diagram.editparts.StateEditPart;
@@ -34,28 +37,52 @@ import com.google.common.collect.Lists;
 
 /**
  * 
- * @author Andreas Muelder <a
- *         href="mailto:andreas.muelder@itemis.de">andreas.muelder@itemis.de</a>
+ * @author muelder
  * 
  */
-public class StatechartModelingAssistantProvider extends ModelingAssistantProvider {
+public class StatechartModelingAssistantProvider extends
+		ModelingAssistantProvider {
 
 	@Override
 	public List<IElementType> getTypesForPopupBar(IAdaptable host) {
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host.getAdapter(IGraphicalEditPart.class);
+		IGraphicalEditPart editPart = (IGraphicalEditPart) host
+				.getAdapter(IGraphicalEditPart.class);
 
-		if (editPart instanceof RegionEditPart || editPart instanceof RegionCompartmentEditPart)
-			return Lists.newArrayList(INITIALSTATE, STATE, FINALSTATE, DEEPHISTORY, SHALLOWHISTORY, JUNCTION, CHOICE);
+		if (editPart instanceof RegionEditPart
+				|| editPart instanceof RegionCompartmentEditPart)
+			return Lists.newArrayList(INITIALSTATE, STATE, FINALSTATE,
+					DEEPHISTORY, SHALLOWHISTORY, JUNCTION, CHOICE);
 
-		if (editPart instanceof StateEditPart || editPart instanceof StateFigureCompartmentEditPart)
+		if (editPart instanceof StateEditPart
+				|| editPart instanceof StateFigureCompartmentEditPart)
 			return Lists.newArrayList(REGION);
 
 		return Lists.newArrayList();
 	}
 
+	@SuppressWarnings("unchecked")
 	@Override
-	public List<IElementType> getTypesForTarget(IAdaptable source, IElementType relationshipType) {
-		return Lists.newArrayList(STATE, FINALSTATE, JUNCTION, CHOICE);
+	public List<IElementType> getTypesForTarget(IAdaptable source,
+			IElementType relationshipType) {
+		if (StatechartElementTypes.TRANSITION.equals(relationshipType))
+			return Lists.newArrayList(STATE, FINALSTATE, JUNCTION, CHOICE);
+		return Collections.EMPTY_LIST;
+	}
+
+	@Override
+	public List<?> getRelTypesOnSource(IAdaptable source) {
+		return Lists.newArrayList(TRANSITION);
+	}
+
+	@Override
+	public List<?> getRelTypesOnTarget(IAdaptable target) {
+		return Lists.newArrayList(TRANSITION);
+	}
+
+	@Override
+	public List<?> getRelTypesOnSourceAndTarget(IAdaptable source,
+			IAdaptable target) {
+		return Lists.newArrayList(TRANSITION);
 	}
 
 }

+ 9 - 4
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/FinalStateEditPart.java

@@ -13,15 +13,16 @@ package org.yakindu.sct.statechart.diagram.editparts;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.handles.ConnectionHandle.HandleDirection;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.statechart.diagram.editor.figures.FinalStateFigure;
 import org.yakindu.sct.statechart.diagram.editor.figures.utils.MapModeUtils;
+import org.yakindu.sct.statechart.diagram.policies.OneWayConnectionHandlesEditPolicy;
 import org.yakindu.sct.statechart.diagram.policies.RelationshipSemanticEditPolicy;
 
 /**
  * 
- * @author Andreas Muelder <a
- *         href="mailto:andreas.muelder@itemis.de">andreas.muelder@itemis.de</a>
+ * @author muelder
  * 
  */
 public class FinalStateEditPart extends FixedSizeShapeNodeEditPart {
@@ -33,12 +34,16 @@ public class FinalStateEditPart extends FixedSizeShapeNodeEditPart {
 	@Override
 	protected void createDefaultEditPolicies() {
 		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new RelationshipSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
+				new RelationshipSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE,
+				new OneWayConnectionHandlesEditPolicy(HandleDirection.INCOMING));
 	}
 
 	@Override
 	public Dimension getDefaultSize() {
-		return MapModeUtils.getMappedDimensions(getMapMode(), MapModeUtils.DEFAULT_SMALL_NODE_DIMENSION);
+		return MapModeUtils.getMappedDimensions(getMapMode(),
+				MapModeUtils.DEFAULT_SMALL_NODE_DIMENSION);
 	}
 
 	@Override

+ 10 - 5
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/InitialStateEditPart.java

@@ -13,15 +13,17 @@ package org.yakindu.sct.statechart.diagram.editparts;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.handles.ConnectionHandle.HandleDirection;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.statechart.diagram.editor.figures.InitialStateFigure;
 import org.yakindu.sct.statechart.diagram.editor.figures.utils.MapModeUtils;
+import org.yakindu.sct.statechart.diagram.policies.OneWayConnectionHandlesEditPolicy;
 import org.yakindu.sct.statechart.diagram.policies.RelationshipSemanticEditPolicy;
 
 /**
  * 
- * @author Andreas Muelder <ahref="mailto:andreas.muelder@itemis.de">andreas.muelder@itemis.de</a>
- * 
+ * @author muelder
+ *
  */
 public class InitialStateEditPart extends FixedSizeShapeNodeEditPart {
 
@@ -32,15 +34,18 @@ public class InitialStateEditPart extends FixedSizeShapeNodeEditPart {
 	@Override
 	protected void createDefaultEditPolicies() {
 		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, new RelationshipSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
+				new RelationshipSemanticEditPolicy());
+		installEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE,
+				new OneWayConnectionHandlesEditPolicy(HandleDirection.OUTGOING));
 	}
 
 	@Override
 	public Dimension getDefaultSize() {
-		return MapModeUtils.getMappedDimensions(getMapMode(), MapModeUtils.DEFAULT_SMALL_NODE_DIMENSION);
+		return MapModeUtils.getMappedDimensions(getMapMode(),
+				MapModeUtils.DEFAULT_SMALL_NODE_DIMENSION);
 	}
 
-	
 	@Override
 	public IFigure getPrimaryShape() {
 		return new InitialStateFigure();

+ 0 - 2
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/PlugableXTextLabelEditPart.java

@@ -46,8 +46,6 @@ public abstract class PlugableXTextLabelEditPart extends XtextLabelEditPart {
 		injector.injectMembers(expressionDirectEditPolicy);
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				expressionDirectEditPolicy);
-		
-		removeEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);		
 	}
 
 	@Override

+ 11 - 4
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/RegionEditPart.java

@@ -14,6 +14,7 @@ import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.StackLayout;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
 import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
 import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
 import org.eclipse.gmf.runtime.notation.View;
@@ -22,7 +23,7 @@ import org.yakindu.sct.statechart.diagram.editor.figures.RegionFigure;
 /**
  * 
  * @author muelder
- *
+ * 
  */
 public class RegionEditPart extends ShapeNodeEditPart {
 
@@ -37,7 +38,12 @@ public class RegionEditPart extends ShapeNodeEditPart {
 		figure.add(new RegionFigure(getMapMode()));
 		return figure;
 	}
-	
+
+	@Override
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE);
+	}
 
 	@Override
 	public IFigure getContentPane() {
@@ -56,8 +62,9 @@ public class RegionEditPart extends ShapeNodeEditPart {
 			IFigure figure2 = ((RegionCompartmentEditPart) childEditPart)
 					.getFigure();
 			pane.add(figure2);
-		}else if(childEditPart instanceof RegionNameEditPart){
-			((RegionNameEditPart) childEditPart).setLabel(getPrimaryShape().getNameLabel());
+		} else if (childEditPart instanceof RegionNameEditPart) {
+			((RegionNameEditPart) childEditPart).setLabel(getPrimaryShape()
+					.getNameLabel());
 		} else
 			super.addChildVisual(childEditPart, index);
 	}

+ 7 - 1
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/StateTextCompartmentExpressionEditPart.java

@@ -1,5 +1,6 @@
 package org.yakindu.sct.statechart.diagram.editparts;
 
+import org.eclipse.gef.EditPolicy;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.swt.SWT;
 
@@ -16,7 +17,12 @@ public class StateTextCompartmentExpressionEditPart extends
 	public StateTextCompartmentExpressionEditPart(View view) {
 		super(view);
 	}
-
+	
+	@Override
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		removeEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);		
+	}
 
 	@Override
 	protected int getEditorStyles() {

+ 10 - 1
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/StatechartTextEditPart.java

@@ -3,6 +3,8 @@ package org.yakindu.sct.statechart.diagram.editparts;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.StackLayout;
 import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
 import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
@@ -29,6 +31,14 @@ public class StatechartTextEditPart extends ShapeNodeEditPart implements
 		return figure;
 	}
 
+	@Override
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		// Disables deletion of the text compartment view via keyboard
+		installEditPolicy(EditPolicy.COMPONENT_ROLE,
+				new RootComponentEditPolicy());
+	}
+
 	@Override
 	protected void addChildVisual(EditPart childEditPart, int index) {
 		if (childEditPart instanceof StatechartTextExpressionEditPart) {
@@ -55,5 +65,4 @@ public class StatechartTextEditPart extends ShapeNodeEditPart implements
 	private StatechartTextFigure getPrimaryShape() {
 		return (StatechartTextFigure) getFigure().getChildren().get(0);
 	}
-
 }

+ 11 - 0
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/StatechartTextExpressionEditPart.java

@@ -1,5 +1,7 @@
 package org.yakindu.sct.statechart.diagram.editparts;
 
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.swt.SWT;
 
@@ -15,6 +17,15 @@ public class StatechartTextExpressionEditPart extends
 		super(view);
 	}
 
+	@Override
+	protected void createDefaultEditPolicies() {
+		super.createDefaultEditPolicies();
+		// Disables deletion of the text compartment view via keyboard
+		installEditPolicy(EditPolicy.COMPONENT_ROLE,
+				new RootComponentEditPolicy());
+		removeEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);	
+	}
+
 	@Override
 	protected int getEditorStyles() {
 		return SWT.MULTI;

+ 28 - 0
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/policies/OneWayConnectionHandlesEditPolicy.java

@@ -0,0 +1,28 @@
+package org.yakindu.sct.statechart.diagram.policies;
+
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConnectionHandleEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.handles.ConnectionHandle.HandleDirection;
+
+/**
+ * Shows the connection handles only for one direction
+ * 
+ * @author muelder
+ * 
+ */
+public class OneWayConnectionHandlesEditPolicy extends
+		ConnectionHandleEditPolicy {
+
+	private final HandleDirection direction;
+
+	public OneWayConnectionHandlesEditPolicy(HandleDirection direction) {
+		this.direction = direction;
+	}
+
+	@Override
+	protected String buildTooltip(HandleDirection direction) {
+		if (direction == this.direction) {
+			return super.buildTooltip(direction);
+		}
+		return null;
+	}
+}