Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Redor2015-06-24 13:29:55 +0000
committerLaurent Redor2015-07-06 06:50:36 +0000
commit99616c78590a6f6d5f8eec8bd9249decce63b586 (patch)
tree506ea0147aea4110d22345092b03d2ff96ee6109
parent6c1e6980a73095c67de71c78e246582e6510095a (diff)
downloadorg.eclipse.sirius-99616c78590a6f6d5f8eec8bd9249decce63b586.tar.gz
org.eclipse.sirius-99616c78590a6f6d5f8eec8bd9249decce63b586.tar.xz
org.eclipse.sirius-99616c78590a6f6d5f8eec8bd9249decce63b586.zip
[463485] Add a snap to all shapes mode for edge bendpoints
The edge bendpoints are now snaped to all shape when F4 is pressed and snap mode is enabled (there is no guide in this case). Bug: 463485 Change-Id: Ifd353358be441a0768f38626e59aa2c863b60ff4 Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java10
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/TreeLayoutConnectionLineSegEditPolicy.java21
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/handles/SiriusBendpointMoveHandle.java56
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/DEdgeEditPart.java17
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SiriusConnectionBendpointEditPolicy.java50
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SnapBendpointRequest.java63
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ruler/SiriusSnapToGeometry.java9
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ui/SiriusConnectionBendpointTrackerEx.java107
-rw-r--r--plugins/org.eclipse.sirius.doc/doc/Release_Notes.html3
-rw-r--r--plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile2
-rw-r--r--plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/condition/BendpointLocationCondition.java92
-rw-r--r--plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/SnapAllShapesTest.java70
13 files changed, 495 insertions, 6 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
index 3904b6ea79..acfc660ef8 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.diagram.ui/META-INF/MANIFEST.MF
@@ -78,6 +78,7 @@ Export-Package: org.eclipse.sirius.diagram.description.concern.provider;version=
org.eclipse.sirius.diagram.ui.graphical.edit.policies;version="2.1.0",
org.eclipse.sirius.diagram.ui.graphical.figures;version="2.0.4",
org.eclipse.sirius.diagram.ui.internal.edit.commands;x-internal:=true;version="2.0.4",
+ org.eclipse.sirius.diagram.ui.internal.edit.handles;x-internal:=true;version="3.1.0",
org.eclipse.sirius.diagram.ui.internal.edit.parts;x-internal:=true;version="3.0.0",
org.eclipse.sirius.diagram.ui.internal.edit.policies;x-internal:=true;version="2.1.0",
org.eclipse.sirius.diagram.ui.internal.edit.policies.canonicals;x-internal:=true;version="3.0.0",
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
index 93d0d9911c..d77f9b8181 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramEdgeEditPart.java
@@ -25,6 +25,7 @@ import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
+import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.DirectEditRequest;
@@ -63,6 +64,7 @@ import org.eclipse.sirius.diagram.ui.tools.api.policy.CompoundEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants;
import org.eclipse.sirius.diagram.ui.tools.internal.graphical.edit.policies.SiriusConnectionEndPointEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.internal.routers.SiriusBendpointConnectionRouter;
+import org.eclipse.sirius.diagram.ui.tools.internal.ruler.SiriusSnapToHelperUtil;
import org.eclipse.sirius.ext.gef.editpolicies.SiriusSnapFeedbackPolicy;
import org.eclipse.sirius.viewpoint.description.tool.AbstractToolDescription;
import org.eclipse.sirius.viewpoint.description.tool.PaneBasedSelectionWizardDescription;
@@ -779,4 +781,12 @@ public abstract class AbstractDiagramEdgeEditPart extends ConnectionNodeEditPart
}
return result;
}
+
+ @Override
+ public Object getAdapter(Class key) {
+ if (key == SnapToHelper.class) {
+ return SiriusSnapToHelperUtil.getSnapHelper((org.eclipse.gef.GraphicalEditPart) this.getSource());
+ }
+ return super.getAdapter(key);
+ }
}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/TreeLayoutConnectionLineSegEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/TreeLayoutConnectionLineSegEditPolicy.java
index 782ba9208e..1331ca7c9b 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/TreeLayoutConnectionLineSegEditPolicy.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/TreeLayoutConnectionLineSegEditPolicy.java
@@ -10,8 +10,13 @@
*******************************************************************************/
package org.eclipse.sirius.diagram.ui.graphical.edit.policies;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.BendpointLocator;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
@@ -25,6 +30,7 @@ import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery;
import org.eclipse.sirius.diagram.ui.business.api.query.ConnectionQuery;
import org.eclipse.sirius.diagram.ui.business.internal.command.TreeLayoutSetConnectionBendpointsCommand;
+import org.eclipse.sirius.diagram.ui.internal.edit.handles.SiriusBendpointMoveHandle;
import org.eclipse.sirius.diagram.ui.internal.operation.CenterEdgeEndModelChangeOperation;
import org.eclipse.sirius.diagram.ui.tools.internal.edit.command.CommandFactory;
@@ -79,4 +85,19 @@ public class TreeLayoutConnectionLineSegEditPolicy extends ConnectionLineSegEdit
return new ICommandProxy(sbbCommand);
}
+
+ @Override
+ protected List createManualHandles() {
+ List list = new ArrayList();
+ ConnectionEditPart connEP = (ConnectionEditPart) getHost();
+ PointList points = getConnection().getPoints();
+ for (int i = 1; i < points.size() - 1; i++) {
+ addInvisibleCreationHandle(list, connEP, i - 1);
+ // Use a SiriusBendpointMoveHandle to handle the snap to all shapes
+ // feature
+ list.add(new SiriusBendpointMoveHandle(connEP, i, new BendpointLocator(getConnection(), i)));
+ }
+ addInvisibleCreationHandle(list, connEP, points.size() - 2);
+ return list;
+ }
}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/handles/SiriusBendpointMoveHandle.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/handles/SiriusBendpointMoveHandle.java
new file mode 100644
index 0000000000..c6d03c6032
--- /dev/null
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/handles/SiriusBendpointMoveHandle.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2015 THALES GLOBAL SERVICES.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.diagram.ui.internal.edit.handles;
+
+import org.eclipse.draw2d.Locator;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gmf.runtime.gef.ui.internal.handles.BendpointMoveHandleEx;
+import org.eclipse.gmf.runtime.gef.ui.internal.tools.ConnectionBendpointTrackerEx;
+import org.eclipse.sirius.diagram.ui.tools.internal.ui.SiriusConnectionBendpointTrackerEx;
+
+/**
+ * A specific BendpointMoveHandleEx to use SiriusConnectionBendpointTrackerEx as
+ * tracker.
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public class SiriusBendpointMoveHandle extends BendpointMoveHandleEx {
+
+ /**
+ * Default constructor.
+ *
+ * @param owner
+ * the ConnectionEditPart owner
+ * @param index
+ * the index
+ * @param locator
+ * the Locator
+ */
+ public SiriusBendpointMoveHandle(ConnectionEditPart owner, int index, Locator locator) {
+ super(owner, index, locator);
+ }
+
+ /**
+ * Creates and returns a new {@link ConnectionBendpointTrackerEx}.
+ *
+ * @return the new ConnectionBendpointTrackerEx
+ */
+ @Override
+ protected DragTracker createDragTracker() {
+ ConnectionBendpointTrackerEx tracker;
+ tracker = new SiriusConnectionBendpointTrackerEx((ConnectionEditPart) getOwner(), getIndex());
+ tracker.setType(RequestConstants.REQ_MOVE_BENDPOINT);
+ tracker.setDefaultCursor(getCursor());
+ return tracker;
+ }
+}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/DEdgeEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/DEdgeEditPart.java
index 6db5eabca3..5fc158012f 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/DEdgeEditPart.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/parts/DEdgeEditPart.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 THALES GLOBAL SERVICES.
+ * Copyright (c) 2007, 2015 THALES GLOBAL SERVICES.
* 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
@@ -14,6 +14,7 @@ import org.eclipse.draw2d.Connection;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.RootEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConnectionBendpointEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
import org.eclipse.gmf.runtime.diagram.ui.internal.editpolicies.ConnectionLineSegEditPolicy;
import org.eclipse.gmf.runtime.notation.View;
@@ -23,6 +24,7 @@ import org.eclipse.sirius.diagram.ui.graphical.edit.policies.HideSiriusElementEd
import org.eclipse.sirius.diagram.ui.graphical.edit.policies.SiriusGraphicalNodeEditPolicy;
import org.eclipse.sirius.diagram.ui.graphical.edit.policies.TreeLayoutConnectionLineSegEditPolicy;
import org.eclipse.sirius.diagram.ui.internal.edit.policies.DEdgeItemSemanticEditPolicy;
+import org.eclipse.sirius.diagram.ui.internal.edit.policies.SiriusConnectionBendpointEditPolicy;
import org.eclipse.sirius.diagram.ui.tools.api.policy.CompoundEditPolicy;
/**
@@ -45,6 +47,7 @@ public class DEdgeEditPart extends AbstractDiagramEdgeEditPart {
/**
* @not-generated
*/
+ @Override
protected void createDefaultEditPolicies() {
super.createDefaultEditPolicies();
removeEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE);
@@ -79,6 +82,7 @@ public class DEdgeEditPart extends AbstractDiagramEdgeEditPart {
/**
* @was-generated
*/
+ @Override
protected void addChildVisual(EditPart childEditPart, int index) {
if (addFixedChild(childEditPart)) {
return;
@@ -94,6 +98,7 @@ public class DEdgeEditPart extends AbstractDiagramEdgeEditPart {
*
* @was-generated
*/
+ @Override
protected Connection createConnectionFigure() {
return super.createConnectionFigure();
}
@@ -135,8 +140,14 @@ public class DEdgeEditPart extends AbstractDiagramEdgeEditPart {
*/
@Override
public void installEditPolicy(Object key, EditPolicy editPolicy) {
- if (EditPolicy.CONNECTION_BENDPOINTS_ROLE.equals(key) && editPolicy instanceof ConnectionLineSegEditPolicy) {
- super.installEditPolicy(key, new TreeLayoutConnectionLineSegEditPolicy());
+ if (EditPolicy.CONNECTION_BENDPOINTS_ROLE.equals(key)) {
+ if (editPolicy instanceof ConnectionLineSegEditPolicy) {
+ super.installEditPolicy(key, new TreeLayoutConnectionLineSegEditPolicy());
+ } else if (editPolicy.getClass().equals(ConnectionBendpointEditPolicy.class)) {
+ super.installEditPolicy(key, new SiriusConnectionBendpointEditPolicy());
+ } else {
+ super.installEditPolicy(key, editPolicy);
+ }
} else {
super.installEditPolicy(key, editPolicy);
}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SiriusConnectionBendpointEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SiriusConnectionBendpointEditPolicy.java
new file mode 100644
index 0000000000..29369580ba
--- /dev/null
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SiriusConnectionBendpointEditPolicy.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2015 THALES GLOBAL SERVICES.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.diagram.ui.internal.edit.policies;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.BendpointLocator;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConnectionBendpointEditPolicy;
+import org.eclipse.gmf.runtime.gef.ui.internal.editpolicies.LineMode;
+import org.eclipse.sirius.diagram.ui.internal.edit.handles.SiriusBendpointMoveHandle;
+
+/**
+ * A specific policy to handle the snapToAll feature.
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public class SiriusConnectionBendpointEditPolicy extends ConnectionBendpointEditPolicy {
+ /**
+ * Default constructor.
+ */
+ public SiriusConnectionBendpointEditPolicy() {
+ super(LineMode.OBLIQUE);
+ }
+
+ @Override
+ protected List createManualHandles() {
+ List list = new ArrayList();
+ ConnectionEditPart connEP = (ConnectionEditPart) getHost();
+ PointList points = getConnection().getPoints();
+ for (int i = 1; i < points.size() - 1; i++) {
+ addInvisibleCreationHandle(list, connEP, i - 1);
+ // Use a SiriusBendpointMoveHandle to handle the snap to all shapes
+ // feature
+ list.add(new SiriusBendpointMoveHandle(connEP, i, new BendpointLocator(getConnection(), i)));
+ }
+ addInvisibleCreationHandle(list, connEP, points.size() - 2);
+ return list;
+ }
+}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SnapBendpointRequest.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SnapBendpointRequest.java
new file mode 100644
index 0000000000..af42da017d
--- /dev/null
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/policies/SnapBendpointRequest.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2015 THALES GLOBAL SERVICES.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.diagram.ui.internal.edit.policies;
+
+import org.eclipse.gef.requests.BendpointRequest;
+import org.eclipse.gef.tools.ConnectionBendpointTracker;
+import org.eclipse.sirius.diagram.ui.tools.internal.ui.NoCopyDragEditPartsTrackerEx;
+
+/**
+ * A BendpointRequest with a specific data concerning the snapToAll feature. The
+ * {@link ConnectionBendpointTracker} does not allow to use the extendedMetaData
+ * of the Request because it is clean before it can be used in the
+ * {@link org.eclipse.gef.SnapToGeometry}.
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public class SnapBendpointRequest extends BendpointRequest {
+ /**
+ * Reflect the mode of the tracker concerning the snap to shape:
+ * <UL>
+ * <LI>true to snap to all shapes and not only brothers ones,</LI>
+ * <LI>false otherwise.</LI>
+ * </UL>
+ */
+ boolean snapToAllShape = NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE;
+
+ /**
+ * Creates a ChangeBoundsRequest with the given type.
+ *
+ * @param type
+ * The type of Request.
+ */
+ public SnapBendpointRequest() {
+ super();
+ }
+
+ /**
+ * Return true if the snap to all shape mode is activated, false otherwise.
+ *
+ * @return the snapToAllShape status
+ */
+ public boolean isSnapToAllShape() {
+ return snapToAllShape;
+ }
+
+ /**
+ * Activate or deactivate the snap to all shape mode.
+ *
+ * @param snapToAllShape
+ * the snapToAllShape to set
+ */
+ public void setSnapToAllShape(boolean snapToAllShape) {
+ this.snapToAllShape = snapToAllShape;
+ }
+}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ruler/SiriusSnapToGeometry.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ruler/SiriusSnapToGeometry.java
index c1bb672c86..b59466f136 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ruler/SiriusSnapToGeometry.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ruler/SiriusSnapToGeometry.java
@@ -24,6 +24,7 @@ import org.eclipse.gmf.runtime.diagram.ui.internal.ruler.SnapToGeometryEx;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractBorderedDiagramElementEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramBorderNodeEditPart;
import org.eclipse.sirius.diagram.ui.graphical.edit.policies.SnapChangeBoundsRequest;
+import org.eclipse.sirius.diagram.ui.internal.edit.policies.SnapBendpointRequest;
import org.eclipse.sirius.diagram.ui.tools.internal.ui.NoCopyDragEditPartsTrackerEx;
import org.eclipse.sirius.ext.gef.query.EditPartQuery;
import org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper;
@@ -67,8 +68,12 @@ public class SiriusSnapToGeometry extends SnapToGeometryEx {
Object snapToAllExtendedData = request.getExtendedData().get(NoCopyDragEditPartsTrackerEx.SNAP_TO_ALL_SHAPE_KEY);
boolean oldSnapToAll = snapToAll;
snapToAll = (snapToAllExtendedData == null && NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE) || (snapToAllExtendedData != null && ((Boolean) snapToAllExtendedData).booleanValue());
- if (!snapToAll && request instanceof SnapChangeBoundsRequest) {
- snapToAll = ((SnapChangeBoundsRequest) request).isSnapToAllShape();
+ if (!snapToAll) {
+ if (request instanceof SnapChangeBoundsRequest) {
+ snapToAll = ((SnapChangeBoundsRequest) request).isSnapToAllShape();
+ } else if (request instanceof SnapBendpointRequest) {
+ snapToAll = ((SnapBendpointRequest) request).isSnapToAllShape();
+ }
}
if (oldSnapToAll != snapToAll) {
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ui/SiriusConnectionBendpointTrackerEx.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ui/SiriusConnectionBendpointTrackerEx.java
new file mode 100644
index 0000000000..cc661bb738
--- /dev/null
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/ui/SiriusConnectionBendpointTrackerEx.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2015 THALES GLOBAL SERVICES.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.diagram.ui.tools.internal.ui;
+
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.BendpointRequest;
+import org.eclipse.gmf.runtime.gef.ui.internal.tools.ConnectionBendpointTrackerEx;
+import org.eclipse.sirius.diagram.ui.internal.edit.policies.SnapBendpointRequest;
+import org.eclipse.swt.events.KeyEvent;
+
+/**
+ * This tracker also allows to change the behavior of SnapToShape (capability to
+ * snap to all shapes).
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public class SiriusConnectionBendpointTrackerEx extends ConnectionBendpointTrackerEx {
+
+ /**
+ * The mode of this tracker concerning the snap to shape:
+ * <UL>
+ * <LI>true to snap to all shapes and not only brothers ones,</LI>
+ * <LI>false otherwise.</LI>
+ * </UL>
+ * This variable is used when the request is updated to add an extended data
+ * to the request.
+ */
+ boolean snapToAllShape = NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE;
+
+ /**
+ * Constructs a tracker for the given connection and index.
+ *
+ * @param editpart
+ * the connection
+ * @param i
+ * the index of the bendpoint
+ */
+ public SiriusConnectionBendpointTrackerEx(ConnectionEditPart editpart, int i) {
+ super(editpart, i);
+ }
+
+ @Override
+ protected Request createSourceRequest() {
+ BendpointRequest request = new SnapBendpointRequest();
+ request.setType(getType());
+ request.setIndex(getIndex());
+ request.setSource(getConnectionEditPart());
+ return request;
+ }
+
+ @Override
+ protected boolean handleKeyDown(KeyEvent event) {
+ if (NoCopyDragEditPartsTrackerEx.SNAP_TO_ALL == event.keyCode) {
+ snapToAllShape = !NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE;
+ return true;
+ }
+ return super.handleKeyDown(event);
+ }
+
+ @Override
+ protected boolean handleKeyUp(KeyEvent event) {
+ if (NoCopyDragEditPartsTrackerEx.SNAP_TO_ALL == event.keyCode) {
+ snapToAllShape = NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE;
+ return true;
+ }
+ return super.handleKeyUp(event);
+ }
+
+ /**
+ * Update the request with information about snapToAll mode.
+ */
+ @Override
+ protected void updateSourceRequest() {
+ if (getSourceRequest() instanceof SnapBendpointRequest) {
+ if (snapToAllShape) {
+ ((SnapBendpointRequest) getSourceRequest()).setSnapToAllShape(true);
+ } else {
+ ((SnapBendpointRequest) getSourceRequest()).setSnapToAllShape(false);
+ }
+ }
+ super.updateSourceRequest();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Cleans up the mode to original state.
+ *
+ * @see org.eclipse.gef.tools.ResizeTracker#handleButtonUp(int)
+ */
+ @Override
+ protected boolean handleButtonUp(int button) {
+ boolean result = super.handleButtonUp(button);
+ // Clean up the mode to original state.
+ snapToAllShape = NoCopyDragEditPartsTrackerEx.DEFAULT_SNAP_TO_SHAPE_MODE;
+ return result;
+ }
+}
diff --git a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html
index 8e70782444..63d8e52100 100644
--- a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html
+++ b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.html
@@ -96,6 +96,9 @@
<li><span class="label label-success">Added</span>
<code>org.eclipse.sirius.tests.swtbot.support.api.condition.TopCondition</code>: New condition to wait that top of the edit part is on the expected location.
</li>
+ <li><span class="label label-success">Added</span>
+ <code>org.eclipse.sirius.tests.swtbot.support.api.condition.BendpointLocationCondition</code>: New condition to wait that a bendpoint is on the expected x or y location.
+ </li>
</ul>
<h2 id="sirius3.0.0">Changes in Sirius 3.0.0</h2>
<h3 id="UserVisibleChanges2">User-Visible Changes</h3>
diff --git a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile
index 1f43fc6ed7..05c1f93705 100644
--- a/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile
+++ b/plugins/org.eclipse.sirius.doc/doc/Release_Notes.textile
@@ -22,7 +22,7 @@ h4. Changes in @org.eclipse.sirius.tests.swtbot.support@
* <span class="label label-success">Added</span> The @org.eclipse.sirius.tests.swtbot.support.api.condition.PerspectiveActivatedCondition@ new offers the capability to inverse the test. This condition becomes a DeactivatedCondition instead of an ActivatedCondition by using the new constructor with inverse parameter.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKey(int, int, int, int, int)@, and so @SWTBotSiriusGefViewer.dragWithKey@ and @SWTBotSiriusFigureCanvas.mouseDragWithKey@), has an additional parameter, compared to @drag(int, int, int, int)@ method, to precise the key code to press during the drag'n'drop. It is possible to call this method with SWT.None to retrieve the standard behavior of @drag@ method. This method also has a correct behavior for the move of bendpoints of edges.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.TopCondition@: New condition to wait that top of the edit part is on the expected location.
-
+* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.BendpointLocationCondition@: New condition to wait that a bendpoint is on the expected x or y location.
h2(#sirius3.0.0). Changes in Sirius 3.0.0
diff --git a/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/condition/BendpointLocationCondition.java b/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/condition/BendpointLocationCondition.java
new file mode 100644
index 0000000000..96d50cd31a
--- /dev/null
+++ b/plugins/org.eclipse.sirius.tests.swtbot.support/src/org/eclipse/sirius/tests/swtbot/support/api/condition/BendpointLocationCondition.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2015 THALES GLOBAL SERVICES.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.tests.swtbot.support.api.condition;
+
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+
+/**
+ * Condition to wait that a specific point of a {@link PolylineConnection} is on
+ * the expected axis.
+ *
+ * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a>
+ */
+public final class BendpointLocationCondition extends DefaultCondition {
+ /** Edge figure containing the point to check. */
+ private PolylineConnection edgeFigure;
+
+ /** Index of the point to check */
+ private int index;
+
+ /** True if the x axis is tested, false for y axis */
+ private boolean isHorizontalAxis;
+
+ /** The expected location on the given axis */
+ private int expectedLocation;
+
+ /** Failure message when a test fails */
+ private String message = "";
+
+ /**
+ * A delta of one pixel can be tolerated, in case of zoom different from
+ * 100% for example.
+ */
+ private boolean addOnePixelDelta;
+
+ private int actual;
+
+ /**
+ * Default constructor.
+ *
+ * @param edgeFigure
+ * Edge figure containing the point to check
+ * @param index
+ * Index of the point to check
+ * @param isHorizontalAxis
+ * True if the x axis is tested, false for y axis
+ * @param expectedLocation
+ * The expected location on the given axis
+ * @param message
+ * Failure message when a test fails
+ * @param addOnePixelDelta
+ * A delta of one pixel can be tolerated, in case of zoom
+ * different from 100% for example
+ */
+ public BendpointLocationCondition(PolylineConnection edgeFigure, int index, boolean isHorizontalAxis, int expectedLocation, String message, boolean addOnePixelDelta) {
+ this.edgeFigure = edgeFigure;
+ this.index = index;
+ this.isHorizontalAxis = isHorizontalAxis;
+ this.expectedLocation = expectedLocation;
+ this.message = message;
+ this.addOnePixelDelta = addOnePixelDelta;
+ }
+
+ @Override
+ public boolean test() throws Exception {
+ if (isHorizontalAxis) {
+ actual = edgeFigure.getPoints().getPoint(index).x;
+ } else {
+ actual = edgeFigure.getPoints().getPoint(index).y;
+ }
+ if (addOnePixelDelta) {
+ // A delta of one pixel is tolerated in case of zoom
+ // different from 100%
+ return (expectedLocation - 1) <= actual && actual <= (expectedLocation + 1);
+ } else {
+ return expectedLocation == actual;
+ }
+ }
+
+ @Override
+ public String getFailureMessage() {
+ return message + ", expected:<" + expectedLocation + "> but was:<" + actual + ">";
+ }
+}
diff --git a/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/SnapAllShapesTest.java b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/SnapAllShapesTest.java
index dbbe3c4431..ce5be1532a 100644
--- a/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/SnapAllShapesTest.java
+++ b/plugins/org.eclipse.sirius.tests.swtbot/src/org/eclipse/sirius/tests/swtbot/SnapAllShapesTest.java
@@ -10,20 +10,26 @@
*******************************************************************************/
package org.eclipse.sirius.tests.swtbot;
+import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.PrecisionPoint;
import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.sirius.diagram.DDiagram;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramBorderNodeEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramContainerEditPart;
+import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramEdgeEditPart;
+import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramEdgeEditPart.ViewEdgeFigure;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramNodeEditPart;
import org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper;
import org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase;
import org.eclipse.sirius.tests.swtbot.support.api.business.UIDiagramRepresentation.ZoomLevel;
import org.eclipse.sirius.tests.swtbot.support.api.business.UIResource;
+import org.eclipse.sirius.tests.swtbot.support.api.condition.BendpointLocationCondition;
import org.eclipse.sirius.tests.swtbot.support.api.condition.TopCondition;
import org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor;
import org.eclipse.sirius.tests.swtbot.support.api.view.DesignerViews;
@@ -178,6 +184,70 @@ public class SnapAllShapesTest extends AbstractSiriusSwtBotGefTestCase {
resizeTopOfElementNearBottomOfAnother("NC_C1", AbstractDiagramNodeEditPart.class, "Node_p1", AbstractDiagramNodeEditPart.class, ZoomLevel.ZOOM_125);
}
+ /**
+ * Move a bendpoint of an edge a first time without F4 and check the
+ * location is the expected one.<BR>
+ * Move a bendpoint of an edge a second time with F4 and check the location
+ * is the expected one (snap to another figure).<BR>
+ * This test also handles the case of scroll bar in diagram.
+ */
+ public void testMoveBendpoint() {
+ moveBendpoint(ZoomLevel.ZOOM_100);
+ }
+
+ /**
+ * Move a bendpoint of an edge a first time without F4 and check the
+ * location is the expected one.<BR>
+ * Move a bendpoint of an edge a second time with F4 and check the location
+ * is the expected one (snap to another figure).<BR>
+ * This test also handles the case of scroll bar in diagram and zoom
+ * different from 100%.
+ */
+ public void testMoveBendpointWithZoom50() {
+ moveBendpoint(ZoomLevel.ZOOM_50);
+ }
+
+ private void moveBendpoint(ZoomLevel zoomLevel) {
+ editor.zoom(zoomLevel);
+ editor.scrollTo(0, 0);
+ SWTBotGefEditPart elementToMove = editor.getEditPart("toC2", AbstractDiagramEdgeEditPart.class);
+
+ // Select the element to move
+ editor.select(elementToMove);
+
+ // Get the bendpoint to move
+ assertTrue(elementToMove.part() instanceof ConnectionEditPart);
+ ConnectionEditPart connectionEditPart = (ConnectionEditPart) elementToMove.part();
+ assertTrue(connectionEditPart.getFigure() instanceof ViewEdgeFigure);
+ PointList pointList = ((ViewEdgeFigure) connectionEditPart.getFigure()).getPoints().getCopy();
+ Point pointToMove = pointList.getPoint(1);
+
+ // Compute the drop destination (at 2 pixels of the bottom of another
+ // figure)
+ final Rectangle targetNodeBounds = GraphicalHelper.getAbsoluteBoundsIn100Percent((GraphicalEditPart) editor.getEditPart("BNBNC_att1", AbstractDiagramBorderNodeEditPart.class).part());
+ final Point endpoint = new Point(pointToMove.x, targetNodeBounds.getBottom().y - 4);
+
+ pointToMove.scale(zoomLevel.getAmount());
+ endpoint.scale(zoomLevel.getAmount());
+ // First move without F4 key pressed
+ editor.dragWithKey(pointToMove.x, pointToMove.y, endpoint.x, endpoint.y, SWT.None);
+ SWTBotUtils.waitAllUiEvents();
+ bot.waitUntil(new BendpointLocationCondition((PolylineConnection) connectionEditPart.getFigure(), 1, false, targetNodeBounds.getBottom().y - 4,
+ "Second bendpoint of edge is not at expected y location after resize without F4 key pressed", !ZoomLevel.ZOOM_100.equals(zoomLevel)));
+
+ // Move to initial location
+ undo(localSession.getOpenedSession());
+ // Scroll to 0, 0 is needed because the first move can cause a scroll of
+ // the diagram not reverted by the Undo.
+ editor.scrollTo(0, 0);
+
+ // Second move with F4 key pressed
+ editor.dragWithKey(pointToMove.x, pointToMove.y, endpoint.x, endpoint.y, SWT.F4);
+ SWTBotUtils.waitAllUiEvents();
+ bot.waitUntil(new BendpointLocationCondition((PolylineConnection) connectionEditPart.getFigure(), 1, false, targetNodeBounds.getBottom().y - 1,
+ "Second bendpoint of edge is not at expected y location after resize with F4 key pressed", false));
+ }
+
private void moveTopOfElementNearBottomOfAnother(String elementNameToMove, Class<? extends EditPart> expectedEditPartTypeOfMovedElement, String referenceElementName,
Class<? extends EditPart> expectedEditPartTypeOfReferenceElement) {
moveTopOfElementNearBottomOfAnother(elementNameToMove, expectedEditPartTypeOfMovedElement, referenceElementName, expectedEditPartTypeOfReferenceElement, ZoomLevel.ZOOM_100);

Back to the top