From 129c74a550b1b205240dc70e68fe12a8ac5a7662 Mon Sep 17 00:00:00 2001
From: Klaus Becker <becker@fortiss.org>
Date: Thu, 5 Jan 2012 15:19:28 +0000
Subject: [PATCH] done, but for components the ports of components should also
 be moved therewith it makes sense and looks ok refs 400

---
 .../command/MoveWithinDiagramCommand.java     |  44 +------
 .../DiagramLayoutConfigurationBase.java       |  10 +-
 .../base/ui/utils/LayoutDataUtils.java        | 119 ++++++++++++++++--
 3 files changed, 126 insertions(+), 47 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/command/MoveWithinDiagramCommand.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/command/MoveWithinDiagramCommand.java
index 8e112065d..a25e266be 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/command/MoveWithinDiagramCommand.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/command/MoveWithinDiagramCommand.java
@@ -17,17 +17,14 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.ui.editpart.command;
 
-import static org.fortiss.tooling.base.ui.utils.LayoutDataUtils.changeAllConnectionPoints;
-
 import java.util.List;
 
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.requests.ChangeBoundsRequest;
 import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
-import org.fortiss.tooling.base.ui.editpart.ConnectionEditPartBase;
-import org.fortiss.tooling.base.ui.editpart.ConnectorEditPartBase;
 import org.fortiss.tooling.base.ui.editpart.ElementEditPartBase;
 import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
+import org.fortiss.tooling.base.ui.utils.LayoutDataUtils;
 
 /**
  * A command to move the elements and free connectors within a diagram.
@@ -36,7 +33,7 @@ import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
  * @author hoelzl
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: 54B9F493565F91469FF3EE1CF7BBD74C
+ * @ConQAT.Rating YELLOW Hash: B6F68F3F16FCCB14CEA9010FAF6E9253
  */
 public class MoveWithinDiagramCommand extends ChangeBoundsRequestCommandBase {
 
@@ -49,7 +46,9 @@ public class MoveWithinDiagramCommand extends ChangeBoundsRequestCommandBase {
 	@SuppressWarnings("unchecked")
 	@Override
 	public void execute() {
-		bendpointGroupMove(request.getEditParts());
+		LayoutDataUtils.bendpointGroupMove(request.getEditParts(),
+				request.getMoveDelta().x, request.getMoveDelta().y);
+
 		for (EditPart editpart : (List<EditPart>) getRequest().getEditParts()) {
 			if (editpart instanceof ElementEditPartBase) {
 				ElementEditPartBase<? extends ILayoutedModelElement> elementEditPart = (ElementEditPartBase<? extends ILayoutedModelElement>) editpart;
@@ -62,37 +61,4 @@ public class MoveWithinDiagramCommand extends ChangeBoundsRequestCommandBase {
 			}
 		}
 	}
-
-	/** Move bend points along with a group of selected elements */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	private void bendpointGroupMove(List<EditPart> parts) {
-		// TODO (FH): https://af3.fortiss.org/issues/376
-		// This has to be reworked to delegate to diagram configuration
-		for (EditPart part : parts) {
-			// cover also sticky connectors
-			if (part.getChildren().size() > 0) {
-				bendpointGroupMove(part.getChildren());
-			}
-			// filter non connective edit parts
-			if (!(part instanceof ConnectorEditPartBase)) {
-				break;
-			}
-
-			ConnectorEditPartBase connector = (ConnectorEditPartBase) part;
-
-			for (ConnectionEditPartBase connection : (List<ConnectionEditPartBase>) connector
-					.getSourceConnections()) {
-				// IF two states where selected, OR IF the 'connection' is a
-				// self-transition, THEN move also the bendpoints of the
-				// connections between these states.
-				if ((connection.getTarget().getSelected() != EditPart.SELECTED_NONE)
-						|| (connection.getTarget().getParent().getSelected() != EditPart.SELECTED_NONE)) {
-					changeAllConnectionPoints(
-							(ILayoutedModelElement) connection.getModel(),
-							request.getMoveDelta().x, request.getMoveDelta().y);
-				}
-
-			}
-		}
-	}
 }
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/DiagramLayoutConfigurationBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/DiagramLayoutConfigurationBase.java
index 89688f8fe..bad375d86 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/DiagramLayoutConfigurationBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/DiagramLayoutConfigurationBase.java
@@ -25,6 +25,7 @@ import org.eclipse.gef.requests.ChangeBoundsRequest;
 import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
 import org.fortiss.tooling.base.ui.editpart.ElementEditPartBase;
 import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
+import org.fortiss.tooling.base.ui.utils.LayoutDataUtils;
 
 /**
  * Base implementation of {@link IDiagramLayoutConfiguration}. It provides the
@@ -34,7 +35,7 @@ import org.fortiss.tooling.base.ui.editpart.FreeConnectorEditPartBase;
  * @author hoelzl
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: 3029D5370491A9EE8B79A8080CBF7CC5
+ * @ConQAT.Rating YELLOW Hash: 3FC45A524204AC8017B6BD0DD6C39F53
  */
 public abstract class DiagramLayoutConfigurationBase implements
 		IDiagramLayoutConfiguration {
@@ -64,6 +65,13 @@ public abstract class DiagramLayoutConfigurationBase implements
 		int minHeight = getMinimalElementSize().height;
 		moveAndResizeNode(editPart.getModel(), dx, dy, dw, dh, minWidth,
 				minHeight);
+
+		// if an element was resized, move the bendpoints of
+		// self-transitions/self-channels
+		if (dx == 0 && dy == 0) {
+			LayoutDataUtils.bendpointGroupResize(editPart.getModel(),
+					request.getEditParts(), dw, dh);
+		}
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/LayoutDataUtils.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/LayoutDataUtils.java
index 2e0a7db9d..e7c837cd8 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/LayoutDataUtils.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/LayoutDataUtils.java
@@ -17,8 +17,11 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.ui.utils;
 
+import java.util.List;
+
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gef.EditPart;
 import org.fortiss.tooling.base.layout.DefaultLayoutConstants;
 import org.fortiss.tooling.base.layout.LayoutKeyConstants;
 import org.fortiss.tooling.base.model.layout.Angle;
@@ -30,6 +33,9 @@ import org.fortiss.tooling.base.model.layout.Offset;
 import org.fortiss.tooling.base.model.layout.OffsetOrientation;
 import org.fortiss.tooling.base.model.layout.Point;
 import org.fortiss.tooling.base.model.layout.Points;
+import org.fortiss.tooling.base.ui.editpart.ConnectionEditPartBase;
+import org.fortiss.tooling.base.ui.editpart.ConnectorEditPartBase;
+import org.fortiss.tooling.base.ui.editpart.ElementEditPartBase;
 import org.fortiss.tooling.base.utils.AngleUtils;
 import org.fortiss.tooling.base.utils.DimensionUtils;
 import org.fortiss.tooling.base.utils.LayoutModelElementFactory;
@@ -50,7 +56,7 @@ import org.fortiss.tooling.base.utils.PointsUtils;
  * @author hummel
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: DC17063D1F5AA00AD9D32A1CB6637542
+ * @ConQAT.Rating YELLOW Hash: 3B5CA0DFFEFF93D1CA616DF968FB6B38
  */
 public class LayoutDataUtils {
 
@@ -267,13 +273,15 @@ public class LayoutDataUtils {
 			int dx, int dy) {
 		Points pts = getConnectionPoints(lobject);
 		Points newPoints = LayoutModelElementFactory.createPoints(null);
-		for (Point p : pts.getPointsList()) {
-			Point np = LayoutModelElementFactory.createPoint(p.getX() + dx,
-					p.getY() + dy, null);
-			newPoints.getPointsList().add(np);
+		if (pts != null) {
+			for (Point p : pts.getPointsList()) {
+				Point np = LayoutModelElementFactory.createPoint(p.getX() + dx,
+						p.getY() + dy, null);
+				newPoints.getPointsList().add(np);
+			}
+			PointsUtils.setPoints(lobject,
+					LayoutKeyConstants.CONNECTION_POINTS, newPoints);
 		}
-		PointsUtils.setPoints(lobject, LayoutKeyConstants.CONNECTION_POINTS,
-				newPoints);
 	}
 
 	/**
@@ -288,4 +296,101 @@ public class LayoutDataUtils {
 				pts);
 
 	}
+
+	/** Move bend points along with a group of selected elements */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public static void bendpointGroupMove(List<EditPart> parts, int deltaX,
+			int deltaY) {
+		// TODO (FH): https://af3.fortiss.org/issues/376
+		// This has to be reworked to delegate to diagram configuration
+		for (EditPart part : parts) {
+			// cover also sticky connectors
+			if (part.getChildren().size() > 0) {
+				bendpointGroupMove(part.getChildren(), deltaX, deltaY);
+			}
+			// filter non connective edit parts
+			if (!(part instanceof ConnectorEditPartBase)) {
+				break;
+			}
+
+			ConnectorEditPartBase connector = (ConnectorEditPartBase) part;
+
+			for (ConnectionEditPartBase connection : (List<ConnectionEditPartBase>) connector
+					.getSourceConnections()) {
+				// IF two states where selected, OR IF the 'connection' is a
+				// self-transition, THEN move also the bendpoints of the
+				// connections between these states.
+				if ((connection.getTarget().getSelected() != EditPart.SELECTED_NONE)
+						|| (connection.getTarget().getParent().getSelected() != EditPart.SELECTED_NONE)) {
+					changeAllConnectionPoints(connection.getModel(), deltaX,
+							deltaY);
+				}
+
+			}
+		}
+	}
+
+	/** Move bend points of self-connections, if theirs parent is resized */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public static void bendpointGroupResize(ILayoutedModelElement layouted,
+			List<EditPart> parts, int deltaWidth, int deltaHeight) {
+
+		if (parts.size() == 1 && parts.get(0) instanceof ElementEditPartBase) {
+			ElementEditPartBase element = (ElementEditPartBase) parts.get(0);
+
+			Point partPos = PointUtils.getPosition(layouted, "pos");
+			Dimension partDim = DimensionUtils.getDimension(layouted, "dim");
+
+			for (ConnectorEditPartBase connector : (List<ConnectorEditPartBase>) element
+					.getChildren()) {
+				for (ConnectionEditPartBase connection : (List<ConnectionEditPartBase>) connector
+						.getSourceConnections()) {
+					// IF it is a self-transition/self-channel, THEN move also
+					// the bendpoints of the connections/channels.
+					if ((connection.getTarget().getParent().getSelected() != EditPart.SELECTED_NONE)
+							&& (connection.getSource().getParent()
+									.getSelected() != EditPart.SELECTED_NONE)) {
+
+						// get list of all bendpoints of the connections
+						Points points = getConnectionPoints(connection
+								.getModel());
+
+						for (int index = 0; index < points.getPointsLength(); index++) {
+							Point p = points.getPoints(index);
+
+							// left from EditPart
+							if (p.getX() < partPos.getX()) {
+								changeConnectionPoint(connection.getModel(),
+										index, p.getX(), p.getY() + deltaHeight
+												/ 2);
+							}
+							// above EditPart
+							else if (p.getY() < partPos.getY()) {
+								changeConnectionPoint(connection.getModel(),
+										index, p.getX() + deltaWidth / 2,
+										p.getY());
+							}
+							// right from EditPart
+							else if (p.getX() > partPos.getX()
+									+ partDim.getWidth() - deltaWidth) {
+								changeConnectionPoint(connection.getModel(),
+										index, p.getX() + deltaWidth, p.getY()
+												+ deltaHeight / 2);
+
+							}
+							// below EditPart
+							else if (p.getY() > partPos.getY()
+									+ partDim.getHeight() - deltaHeight) {
+								changeConnectionPoint(connection.getModel(),
+										index, p.getX() + deltaWidth / 2,
+										p.getY() + deltaHeight);
+							} else {
+								// nothing
+							}
+						}
+					}
+				}
+			}
+		}
+	}
 }
-- 
GitLab