diff options
| author | Florian Barbin | 2014-09-05 13:23:53 +0000 |
|---|---|---|
| committer | Florian Barbin | 2014-09-09 16:37:47 +0000 |
| commit | 3e7acc0a5429c7377c7f58d86d55954955b469ef (patch) | |
| tree | f4fd63158033c22f7028d6e7eda35981e9da1def | |
| parent | 22fdbad2930c29b82bfce91eabede1a699afa1a4 (diff) | |
| download | org.eclipse.sirius-3e7acc0a5429c7377c7f58d86d55954955b469ef.tar.gz org.eclipse.sirius-3e7acc0a5429c7377c7f58d86d55954955b469ef.tar.xz org.eclipse.sirius-3e7acc0a5429c7377c7f58d86d55954955b469ef.zip | |
[437528] Fix wrong centering behavior when moving toward node corner.
* In some cases, when moving an edge connection toward the top-left
corner for instance, the edge orientation was badly computed (from north
instead of west in this case) and the edge could appear toward the node
top-left corner instead of the center.
Bug: 437528
Change-Id: Id3b4ffdd8615935c0f831dc16d11591219682acb
Signed-off-by: Florian Barbin <florian.barbin@obeo.fr>
| -rw-r--r-- | plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/operation/CenterEdgeEndModelChangeOperation.java | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/operation/CenterEdgeEndModelChangeOperation.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/operation/CenterEdgeEndModelChangeOperation.java index f8e34d9f1b..e163e6f0fc 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/operation/CenterEdgeEndModelChangeOperation.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/operation/CenterEdgeEndModelChangeOperation.java @@ -232,8 +232,8 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat */ private void handleRectilinearCase(CenteringStyle center, Rectangle sourceBounds, Rectangle targetBounds, PointList existingPointList) { - int sourceAnchorRelativeLocation = PositionConstants.NONE; - int targetAnchorRelativeLocation = PositionConstants.NONE; + int sourceAnchorOrientation = PositionConstants.NONE; + int targetAnchorOrientation = PositionConstants.NONE; PointList rectilinear = null; // If the connection is available (the edge already exist) we retrieve @@ -241,8 +241,8 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat if (connection != null) { rectilinear = getRectilinearPointListFromConnection(); - sourceAnchorRelativeLocation = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getFirstPoint(), sourceBounds); - targetAnchorRelativeLocation = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getLastPoint(), targetBounds); + sourceAnchorOrientation = computeSourceOrientation(rectilinear); + targetAnchorOrientation = computeTargetOrientation(rectilinear); } else { rectilinear = existingPointList.getCopy(); @@ -255,18 +255,19 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat computePointListByIntersections(rectilinear, sourceBounds, targetBounds); } - sourceAnchorRelativeLocation = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getFirstPoint(), sourceBounds); - targetAnchorRelativeLocation = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getLastPoint(), targetBounds); - - RectilinearHelper.transformToRectilinear(rectilinear, sourceAnchorRelativeLocation, targetAnchorRelativeLocation); + int sourceAnchorSide = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getFirstPoint(), sourceBounds); + int targetAnchorSide = RectilinearHelper.getAnchorOffRectangleDirection(rectilinear.getLastPoint(), targetBounds); + RectilinearHelper.transformToRectilinear(rectilinear, sourceAnchorSide, targetAnchorSide); + sourceAnchorOrientation = computeSourceOrientation(rectilinear); + targetAnchorOrientation = computeTargetOrientation(rectilinear); } if (rectilinear.size() >= 2) { if (center == CenteringStyle.BOTH || center == CenteringStyle.SOURCE) { - handleSourceRectilinearRoutingStyle(sourceBounds, rectilinear, sourceAnchorRelativeLocation); + handleSourceRectilinearRoutingStyle(sourceBounds, rectilinear, sourceAnchorOrientation); } if (center == CenteringStyle.BOTH || center == CenteringStyle.TARGET) { - handleTargetRectilinearRoutingStyle(targetBounds, rectilinear, targetAnchorRelativeLocation); + handleTargetRectilinearRoutingStyle(targetBounds, rectilinear, targetAnchorOrientation); } existingPointList.removeAllPoints(); @@ -274,6 +275,20 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat } } + private int computeSourceOrientation(PointList rectilinear) { + if (rectilinear.size() >= 2) { + return (rectilinear.getPoint(0).x() == rectilinear.getPoint(1).x()) ? PositionConstants.VERTICAL : PositionConstants.HORIZONTAL; + } + return PositionConstants.NONE; + } + + private int computeTargetOrientation(PointList rectilinear) { + if (rectilinear.size() >= 2) { + return (rectilinear.getPoint(rectilinear.size() - 1).x() == rectilinear.getPoint(rectilinear.size() - 2).x()) ? PositionConstants.VERTICAL : PositionConstants.HORIZONTAL; + } + return PositionConstants.NONE; + } + private void computePointListByIntersections(PointList rectilinear, Rectangle sourceBounds, Rectangle targetBounds) { Option<Point> sourceConnectionPoint = GraphicalHelper.getIntersection(existingSourceAnchorAbsoluteLocation, existingTargetAnchorAbsoluteLocation, sourceBounds, false); Option<Point> targetConnectionPoint = GraphicalHelper.getIntersection(existingSourceAnchorAbsoluteLocation, existingTargetAnchorAbsoluteLocation, targetBounds, false); @@ -289,14 +304,12 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat Point newConnectionPoint = rectilinear.getFirstPoint().getCopy(); Point secondFromSrc = rectilinear.getPoint(1); switch (sourceAnchorRelativeLocation) { - case PositionConstants.WEST: - case PositionConstants.EAST: + case PositionConstants.HORIZONTAL: newConnectionPoint.setY(newSourceAnchorAbsoluteLocation.y()); secondFromSrc.setY(newSourceAnchorAbsoluteLocation.y()); break; - case PositionConstants.NORTH: - case PositionConstants.SOUTH: + case PositionConstants.VERTICAL: newConnectionPoint.setX(newSourceAnchorAbsoluteLocation.x()); secondFromSrc.setX(newSourceAnchorAbsoluteLocation.x()); break; @@ -317,14 +330,12 @@ public class CenterEdgeEndModelChangeOperation extends AbstractModelChangeOperat Point newConnectionPoint = rectilinear.getLastPoint().getCopy(); Point secondFromTgt = rectilinear.getPoint(rectilinear.size() - 2); switch (targetAnchorRelativeLocation) { - case PositionConstants.WEST: - case PositionConstants.EAST: + case PositionConstants.HORIZONTAL: newConnectionPoint.setY(newTargetAnchorAbsoluteLocation.y()); secondFromTgt.setY(newTargetAnchorAbsoluteLocation.y()); break; - case PositionConstants.NORTH: - case PositionConstants.SOUTH: + case PositionConstants.VERTICAL: newConnectionPoint.setX(newTargetAnchorAbsoluteLocation.x()); secondFromTgt.setX(newTargetAnchorAbsoluteLocation.x()); break; |
