X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram.connection%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fconnection%2FRouteTerminal.java;h=3d6bd182f664b9146c5686155ac8d4f541e6f8cf;hb=HEAD;hp=c43c7de1c4996914d8ac6bbc5c208e4c9b2c64ff;hpb=2b0fe692f116091f8d65da664174c92591a077b8;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteTerminal.java b/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteTerminal.java index c43c7de1c..3d6bd182f 100644 --- a/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteTerminal.java +++ b/bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/RouteTerminal.java @@ -44,7 +44,7 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable RouteLine line; - RouteTerminal(double x, double y, double minX, double minY, + public RouteTerminal(double x, double y, double minX, double minY, double maxX, double maxY, int allowedDirections, boolean routeToBounds, ILineEndStyle style, RouteTerminalPosition dynamicPosition) { @@ -98,7 +98,7 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable * adding necessary transient route lines. * @param cache */ - void route(ArrayList lines, IntervalCache cache, boolean boundingBoxesIntersect) { + protected void route(ArrayList lines, IntervalCache cache, boolean boundingBoxesIntersect) { if(routeToBounds) { int lineDir; boolean routeLineDoesNotIntersectTerminal; @@ -139,7 +139,8 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable return; } else { - line.addPoint(this); + if (!line.getPoints().contains(this)) + line.addPoint(this); Interval interval = cache.get(line); if(line.isHorizontal) { if(interval.min < minX) @@ -163,18 +164,31 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable boolean routeLineDoesNotIntersectTerminal; double linePosition = line.position; if(line.isHorizontal) { + if (linePosition == y) { + // direct route to terminal + line.addPoint(this); + return; + } lineDir = linePosition < y ? 3 : 1; routeLineDoesNotIntersectTerminal = linePosition <= minY || linePosition >= maxY || boundingBoxesIntersect /* we ignore intersection in this case */; } else { + if (linePosition == x) { + // direct route to terminal + line.addPoint(this); + return; + } lineDir = linePosition < x ? 2 : 0; routeLineDoesNotIntersectTerminal = linePosition <= minX || linePosition >= maxX || boundingBoxesIntersect /* we ignore intersection in this case */; } // We can route the connection directly to the right direction - if(routeLineDoesNotIntersectTerminal && + if((routeLineDoesNotIntersectTerminal || + (line.isHorizontal && (x == minX || x == maxX)) || // already on the top/bottom edge + (!line.isHorizontal && (y == minY || y == maxY)) // already on the left/right edge + ) && Directions.isAllowed(allowedDirections, lineDir)) { RouteLine line0 = createLine0(lineDir); new RouteLink(line0, line); @@ -257,7 +271,7 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable } } - private RouteLine createLine0(int dir) { + protected RouteLine createLine0(int dir) { RouteLine line0 = (dir&1) == 0 ? new RouteLine(true, y) : new RouteLine(false, x) @@ -377,7 +391,7 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable } } - RouteTerminal copy(THashMap map) { + public RouteTerminal copy(THashMap map) { RouteTerminal copy = (RouteTerminal)map.get(this); if(copy == null) { copy = new RouteTerminal(x, y, minX, minY, maxX, maxY, @@ -418,6 +432,10 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable return line; } + public void setLine(RouteLine line) { + this.line = line; + } + public void setMinX(double minX) { this.minX = minX; } @@ -456,6 +474,8 @@ public class RouteTerminal extends RoutePoint implements RouteNode, Serializable public RouteTerminalPosition getDynamicPosition() { return dynamicPosition; } + + public boolean updateDynamicPosition() { boolean changed = false;