Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/policies/AdjustImplicitlyMovedLinksEditPolicy.java')
-rwxr-xr-xplugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/policies/AdjustImplicitlyMovedLinksEditPolicy.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/policies/AdjustImplicitlyMovedLinksEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/policies/AdjustImplicitlyMovedLinksEditPolicy.java
new file mode 100755
index 00000000000..db60274ea26
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/policies/AdjustImplicitlyMovedLinksEditPolicy.java
@@ -0,0 +1,125 @@
+/*****************************************************************************
+ * Copyright (c) 2014 Montages AG and others
+ *
+ *
+ * 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:
+ * Michael Golubev (Montages) - Initial API and implementation
+ * Anatoly Tishenko (ticher777@gmail.com) - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.gmfdiag.tooling.runtime.linklf.policies;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
+import org.eclipse.papyrus.infra.gmfdiag.tooling.runtime.linklf.AbsoluteBendpointsConvention;
+
+/**
+ * This edit policy adjusts bendpoints for links between the nodes moved at the
+ * same time. Only absolute bendpoints (also possibly stored as relative, see
+ * {@link AbsoluteBendpointsConvention}) require adjustment.
+ * <p/>
+ *
+ * @since 3.3
+ */
+public class AdjustImplicitlyMovedLinksEditPolicy extends
+ AdjustAbsoluteBendpointsEditPolicyBase {
+
+ /**
+ * Default role for registering this edit policy.
+ * <p/>
+ * The value is prefixed by class FQN in order to avoid conflicts, but the
+ * literal should NOT be used anywhere.
+ */
+ public static final String ROLE = AdjustImplicitlyMovedLinksEditPolicy.class
+ .getName() + ":Role";
+
+ @Override
+ protected Command getAdjustLinksCommand(ChangeBoundsRequest req) {
+ return getAdjustImplicitlyMovedLinksCommand(req);
+ }
+
+ /**
+ * Link is implicitly moved when its source and target are both moved
+ * (directly or indirectly). In this case, {@link RelativeBendpoints} should
+ * not be adjusted. But when the link has effectively absolute bendpoints
+ * (see {@link AbsoluteBendpointsConvention}) all of them must be also moved
+ * to the same {@link ChangeBoundsRequest#getMoveDelta()}
+ * <p/>
+ * Default implementation of this method will only affect the
+ * <strong>outgoing</strong> links from the host edit part to one of the
+ * edit parts being moved. This way all affected links will be modified only
+ * once.
+ */
+ protected Command getAdjustImplicitlyMovedLinksCommand(
+ ChangeBoundsRequest req) {
+ final Point moveDelta = req.getMoveDelta();
+ if (moveDelta.x == 0 && moveDelta.y == 0) {
+ return null;
+ }
+
+ CachedEditPartsSet allMoved = getMovedEditPartsSet(req);
+ ICommand result = null;
+ LinkedList<GraphicalEditPart> queue = new LinkedList<GraphicalEditPart>();
+ queue.add(getHost());
+
+ while (!queue.isEmpty()) {
+ GraphicalEditPart cur = queue.removeFirst();
+ for (Object nextLink : cur.getSourceConnections()) {
+ if (nextLink instanceof ConnectionEditPart) {
+ ConnectionEditPart nextLinkEP = (ConnectionEditPart) nextLink;
+ EditPart target = nextLinkEP.getTarget();
+ MovedNodeKind move = allMoved.isMoved(target);
+ if (move == MovedNodeKind.DIRECTLY
+ || move == MovedNodeKind.INDIRECTLY) {
+ ICommand nextAdjustment = getAdjustOneLinkCommand(
+ nextLinkEP, req);
+ result = compose(result, nextAdjustment);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ Collection<GraphicalEditPart> children = cur.getChildren();
+ queue.addAll(children);
+ }
+ return result == null ? null : new ICommandProxy(result.reduce());
+ }
+
+ private ICommand getAdjustOneLinkCommand(ConnectionEditPart linkEP,
+ ChangeBoundsRequest req) {
+ SetAbsoluteBendpointsCommand result = null;
+ Edge edge = (Edge) linkEP.getNotationView();
+ if (AbsoluteBendpointsConvention.getInstance()
+ .hasAbsoluteStoredAsRelativeBendpoints(edge)) {
+ PointList newPoints = AbsoluteBendpointsConvention
+ .getInstance()
+ .getPointList(edge,
+ linkEP.getConnectionFigure().getRoutingConstraint());
+ newPoints.translate(req.getMoveDelta());
+
+ result = new SetAbsoluteBendpointsCommand(getDomain());
+ result.setEdgeAdapter(new EObjectAdapter(edge));
+ result.setNewPointList(newPoints);
+ }
+
+ return result;
+ }
+
+}

Back to the top