Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Barbin2014-09-05 13:23:53 +0000
committerFlorian Barbin2014-09-09 16:37:47 +0000
commit3e7acc0a5429c7377c7f58d86d55954955b469ef (patch)
treef4fd63158033c22f7028d6e7eda35981e9da1def
parent22fdbad2930c29b82bfce91eabede1a699afa1a4 (diff)
downloadorg.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.java47
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;

Back to the top