diff options
| author | Laurent Redor | 2015-06-24 13:29:55 +0000 |
|---|---|---|
| committer | Laurent Redor | 2015-07-06 06:50:36 +0000 |
| commit | 99616c78590a6f6d5f8eec8bd9249decce63b586 (patch) | |
| tree | 506ea0147aea4110d22345092b03d2ff96ee6109 | |
| parent | 6c1e6980a73095c67de71c78e246582e6510095a (diff) | |
| download | org.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>
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); |
