Browse Source

add action to toggle sub region layout

Andreas Mülder 14 years ago
parent
commit
cc306af49a

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

@@ -487,7 +487,19 @@
                label="Initial"
                menubarPath="Entry/group1">
          </action>
-      </objectContribution>                    
+      </objectContribution>       
+      <objectContribution
+            adaptable="false"
+            id="org.yakindu.sct.statechart.diagram.regionLayout"
+            objectClass="org.yakindu.sct.statechart.diagram.editparts.StateEditPart">
+          <action
+               class="org.yakindu.sct.statechart.diagram.actions.ToggleSubRegionLayoutCommand"
+               definitionId="org.yakindu.sct.statechart.diagram.regionLayout"
+               id="org.yakindu.sct.statechart.diagram.regionLayout"
+               label="Toggle subregion alignment"
+               menubarPath="additions">
+         </action>    
+      </objectContribution>           
 </extension>
 
 </plugin>

+ 52 - 0
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/actions/ToggleSubRegionLayoutCommand.java

@@ -0,0 +1,52 @@
+package org.yakindu.sct.statechart.diagram.actions;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.yakindu.sct.statechart.diagram.editparts.StateEditPart;
+
+/**
+ * Action that toggles the alignment flag in the notation view element
+ * 
+ * @author andreas muelder
+ * 
+ */
+public class ToggleSubRegionLayoutCommand implements IActionDelegate {
+
+	private View view;
+
+	public void run(IAction arg0) {
+		BooleanValueStyle style = (BooleanValueStyle) view
+				.getStyle(NotationPackage.Literals.BOOLEAN_VALUE_STYLE);
+		SetValueCommand setCommand = new SetValueCommand(new SetRequest(style,
+				NotationPackage.Literals.BOOLEAN_VALUE_STYLE__BOOLEAN_VALUE,
+				!style.isBooleanValue()));
+		try {
+			setCommand.execute(new NullProgressMonitor(), null);
+		} catch (ExecutionException e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	protected View unwrap(ISelection selection) {
+		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+		Object firstElement = structuredSelection.getFirstElement();
+		if (firstElement == null)
+			return null;
+		return ((StateEditPart) firstElement).getNotationView();
+	}
+
+	public void selectionChanged(IAction arg0, ISelection selection) {
+		view = unwrap(selection);
+	}
+
+}

+ 54 - 7
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/editparts/StateFigureCompartmentEditPart.java

@@ -12,12 +12,15 @@ package org.yakindu.sct.statechart.diagram.editparts;
 
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.ResizableCompartmentEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
 import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
 import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.model.sct.statechart.StatechartPackage;
 import org.yakindu.sct.statechart.diagram.policies.CompartmentCreationEditPolicy;
@@ -25,19 +28,33 @@ import org.yakindu.sct.statechart.diagram.policies.StateCompartmentCanonicalEdit
 
 import de.itemis.gmf.runtime.commons.editpolicies.CompartmentEditPolicy;
 
-
 /**
  * 
- * @author muelder
+ * @author andreas muelder
  * 
  */
 public class StateFigureCompartmentEditPart extends
 		ResizableCompartmentEditPart {
 
+	private static final String PARENT_VIEW = "parent_view";
+
 	public StateFigureCompartmentEditPart(View view) {
 		super(view);
 	}
 
+	// Listeners for the parent view to get notified when layout is changed
+	@Override
+	protected void addNotationalListeners() {
+		addListenerFilter(PARENT_VIEW, this, getParent().getNotationView());
+		super.addNotationalListeners();
+	}
+
+	@Override
+	protected void removeNotationalListeners() {
+		removeListenerFilter(PARENT_VIEW);
+		super.removeNotationalListeners();
+	}
+
 	@Override
 	protected void createDefaultEditPolicies() {
 		super.createDefaultEditPolicies();
@@ -62,16 +79,47 @@ public class StateFigureCompartmentEditPart extends
 		ResizableCompartmentFigure figure = (ResizableCompartmentFigure) super
 				.createFigure();
 		figure.getContentPane().setLayoutManager(
-				new StateFigureCompartmentLayout());
+				new StateFigureCompartmentLayout(getAlignment()));
 		figure.setBorder(null);
 		return figure;
 	}
 
+	@Override
+	public ResizableCompartmentFigure getFigure() {
+		return (ResizableCompartmentFigure) super.getFigure();
+	}
+
+	@Override
+	public StateEditPart getParent() {
+		return (StateEditPart) super.getParent();
+	}
+
+	protected boolean getAlignment() {
+		// We use a BooleanValueStyle to carry the alignment value
+		BooleanValueStyle style = (BooleanValueStyle) getParent()
+				.getNotationView().getStyle(
+						NotationPackage.Literals.BOOLEAN_VALUE_STYLE);
+		return style.isBooleanValue();
+	}
+
+	@Override
+	protected void handleNotificationEvent(Notification event) {
+		if (event.getFeature() == NotationPackage.Literals.BOOLEAN_VALUE_STYLE__BOOLEAN_VALUE) {
+			updateLayout();
+		}
+		super.handleNotificationEvent(event);
+	}
+
+	private void updateLayout() {
+		getFigure().getContentPane().setLayoutManager(
+				new StateFigureCompartmentLayout(getAlignment()));
+	}
+
 	private static final class StateFigureCompartmentLayout extends
 			ConstrainedToolbarLayout {
-		public StateFigureCompartmentLayout() {
-			super(false);
-			setSpacing(-1); // make lines overlap so it looks like a shared line 
+		public StateFigureCompartmentLayout(boolean alignment) {
+			super(alignment);
+			setSpacing(-1); // make lines overlap so it looks like a shared line
 		}
 
 		@Override
@@ -79,6 +127,5 @@ public class StateFigureCompartmentEditPart extends
 				int wHint, int hHint) {
 			return new Dimension(1, 1);
 		}
-
 	}
 }

+ 11 - 3
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/factories/StateViewFactory.java

@@ -19,6 +19,7 @@ import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
 import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
 import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
 import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 import org.eclipse.gmf.runtime.notation.NotationFactory;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.gmf.runtime.notation.ShapeStyle;
@@ -34,6 +35,7 @@ import org.yakindu.sct.statechart.diagram.providers.SemanticHints;
  */
 public class StateViewFactory extends AbstractShapeViewFactory {
 
+	@SuppressWarnings("unchecked")
 	@Override
 	protected void decorateView(View containerView, View view,
 			IAdaptable semanticAdapter, String semanticHint, int index,
@@ -51,7 +53,6 @@ public class StateViewFactory extends AbstractShapeViewFactory {
 		getViewService().createNode(eObjectAdapter, view,
 				SemanticHints.STATE_TEXT_COMPARTMENT, ViewUtil.APPEND, true,
 				getPreferencesHint());
-		
 
 		getViewService().createNode(eObjectAdapter, view,
 				SemanticHints.STATE_FIGURE_COMPARTMENT, ViewUtil.APPEND, true,
@@ -64,9 +65,16 @@ public class StateViewFactory extends AbstractShapeViewFactory {
 				.RGBToInteger(StatechartColorConstants.STATE_BG_COLOR.getRGB()));
 		style.setLineColor(FigureUtilities
 				.RGBToInteger(ColorConstants.lightGray.getRGB()));
-		
+
+		// Create a boolean value style that indicates the alignment of
+		// subregions
+		BooleanValueStyle layout = (BooleanValueStyle) NotationFactory.eINSTANCE
+				.createBooleanValueStyle();
+		layout.setBooleanValue(false);
+		view.getStyles().add(layout);
+
 	}
-	
+
 	@Override
 	protected List<Style> createStyles(View view) {
 		@SuppressWarnings("unchecked")