X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fdiagram%2Fparticipant%2Fpointertool%2FTerminalUtil.java;h=da98294284aba29e314ee056168004c91d92189b;hb=refs%2Fchanges%2F64%2F1964%2F9;hp=85f75a06638150f83af0fc4f413836a7f6a6d0b9;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java index 85f75a066..da9829428 100644 --- a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.simantics.g2d.canvas.ICanvasContext; import org.simantics.g2d.diagram.DiagramUtils; import org.simantics.g2d.diagram.IDiagram; import org.simantics.g2d.diagram.handler.PickRequest; @@ -44,7 +45,7 @@ public class TerminalUtil { private static final ThreadLocal> TERMINALS = new ThreadLocal>() { @Override protected ArrayList initialValue() { - return new ArrayList(); + return new ArrayList<>(); } }; @@ -54,7 +55,7 @@ public class TerminalUtil { private static final ThreadLocal> ELEMENTS = new ThreadLocal>() { @Override protected ArrayList initialValue() { - return new ArrayList(); + return new ArrayList<>(); } }; @@ -118,7 +119,7 @@ public class TerminalUtil { * @param pickAreaTerminals pick terminals that have a shape * @return terminals in z-order (bottom to top) */ - public static List pickTerminals(IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals) + public static List pickTerminals(ICanvasContext ctx, IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals) { boolean clearElements = false; List elements = null; @@ -127,7 +128,7 @@ public class TerminalUtil { elements = ELEMENTS.get(); elements.clear(); clearElements = true; - PickRequest req = new PickRequest(pickShape); + PickRequest req = new PickRequest(pickShape).context(ctx); DiagramUtils.pick(d, req, elements); } else { // Select all terminals @@ -144,7 +145,7 @@ public class TerminalUtil { pickCenterY = bounds.getCenterY(); } - List result = new ArrayList(); + List result = new ArrayList<>(); ArrayList terminals = TERMINALS.get(); for (IElement e : elements) { @@ -160,8 +161,10 @@ public class TerminalUtil { { Shape terminalShape = getTerminalShape(tls, e, t); if ( terminalShape==null /* point terminal */ && !pickPointTerminals ) continue; - if ( terminalShape!=null /* are terminal */ && !pickAreaTerminals ) continue; - AffineTransform terminalToDiagram = getTerminalPosOnDiagram(e, t); + if ( terminalShape!=null /* area terminal */ && !pickAreaTerminals ) continue; + + AffineTransform terminalToElement = getTerminalPosOnElement0(e, t); + AffineTransform terminalToDiagram = concatenate(ElementUtils.getTransform(e), terminalToElement); // Pick distance will is set to 0 if there was no pick shape, // i.e. everything is picked. @@ -175,11 +178,10 @@ public class TerminalUtil { pickDist = Point2D.distance(pickCenterX, pickCenterY, terminalToDiagram.getTranslateX(), terminalToDiagram.getTranslateY()); } - AffineTransform terminalToElement = getTerminalPosOnElement(e, t); TerminalInfo ti = new TerminalInfo(); ti.e = e; ti.posDia = terminalToDiagram; - ti.posElem = terminalToElement; + ti.posElem = terminalToElement != null ? new AffineTransform(terminalToElement) : new AffineTransform(); ti.t = t; ti.shape = terminalShape; ti.distance = pickDist; @@ -200,11 +202,11 @@ public class TerminalUtil { * @param pickShape pick area (in diagram coordinate system) * @return terminals in z-order (bottom to top) */ - public static TerminalInfo pickTerminal(IDiagram diagram, Shape pickShape) + public static TerminalInfo pickTerminal(ICanvasContext ctx, IDiagram diagram, Shape pickShape) { ArrayList elements = ELEMENTS.get(); elements.clear(); - PickRequest req = new PickRequest(pickShape); + PickRequest req = new PickRequest(pickShape).context(ctx); DiagramUtils.pick(diagram, req, elements); if (elements.isEmpty()) return null; @@ -224,8 +226,10 @@ public class TerminalUtil { tt.getTerminals(e, terminals); for (Terminal t : terminals) { + AffineTransform terminalToElement = getTerminalPosOnElement0(e, t); + AffineTransform terminalToDiagram = concatenate(ElementUtils.getTransform(e), terminalToElement); + Shape terminalShape = getTerminalShape(e, t); - AffineTransform terminalToDiagram = getTerminalPosOnDiagram(e, t); Shape pickTargetShape = terminalShape != null ? terminalShape : POINT_PICK_SHAPE; pickTargetShape = GeometryUtils.transformShape(pickTargetShape, terminalToDiagram); if (!GeometryUtils.intersects(pickShape, pickTargetShape)) continue; @@ -235,7 +239,7 @@ public class TerminalUtil { result.e = e; result.posDia = terminalToDiagram; - result.posElem = getTerminalPosOnElement(e, t); + result.posElem = terminalToElement != null ? new AffineTransform(terminalToElement) : new AffineTransform(); result.t = t; result.shape = terminalShape; result.distance = Math.sqrt(pickDist); @@ -300,11 +304,8 @@ public class TerminalUtil { */ public static AffineTransform getTerminalPosOnDiagram(IElement e, Terminal t) { - AffineTransform pos = getTerminalPosOnElement(e, t); - AffineTransform at = ElementUtils.getTransform(e); - AffineTransform result = new AffineTransform(at); - result.concatenate(pos); - return result; + AffineTransform pos = getTerminalPosOnElement0(e, t); + return concatenate(ElementUtils.getTransform(e), pos); } /** @@ -314,6 +315,18 @@ public class TerminalUtil { * @return Transform of a terminal */ public static AffineTransform getTerminalPosOnElement(IElement e, Terminal t) + { + AffineTransform tr = getTerminalPosOnElement0(e, t); + return tr != null ? new AffineTransform(tr) : null; + } + + /** + * Get position of a terminal in element + * @param e element + * @param t terminal + * @return Transform of a terminal + */ + private static AffineTransform getTerminalPosOnElement0(IElement e, Terminal t) { List tls = e.getElementClass().getItemsByClass(TerminalLayout.class); AffineTransform result = null; @@ -351,7 +364,7 @@ public class TerminalUtil { * @param pickShape * @return bends or null */ - public BendsInfo pickBends(IDiagram diagram, Shape pickShape) + public BendsInfo pickBends(ICanvasContext ctx, IDiagram diagram, Shape pickShape) { BendsInfo result = null; double bestShortestDist = Double.MAX_VALUE; @@ -360,10 +373,10 @@ public class TerminalUtil { ArrayList elements = ELEMENTS.get(); elements.clear(); - PickRequest req = new PickRequest(pickShape); + PickRequest req = new PickRequest(pickShape).context(ctx); DiagramUtils.pick(diagram, req, elements); - ArrayList bends = new ArrayList(); + ArrayList bends = new ArrayList<>(); Point2D bendPos = new Point2D.Double(); for (IElement e : diagram.getElements()) { @@ -430,7 +443,7 @@ public class TerminalUtil { } } - ArrayList result = new ArrayList(len); + ArrayList result = new ArrayList<>(len); for (int i = 0; i < len; ++i) { TerminalInfo ti = tis.get(i); if (ti.distance == nearest.distance @@ -444,4 +457,11 @@ public class TerminalUtil { return result; } + private static AffineTransform concatenate(AffineTransform a, AffineTransform b) { + AffineTransform result = new AffineTransform(a); + if (b != null) + result.concatenate(b); + return result; + } + }