]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java
Support for dynamic transforms for both elements and terminals
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / pointertool / TerminalUtil.java
index 85f75a06638150f83af0fc4f413836a7f6a6d0b9..677c97f0f4fa0062779d9688ea718e39218f4508 100644 (file)
@@ -44,7 +44,7 @@ public class TerminalUtil {
     private static final ThreadLocal<ArrayList<Terminal>> TERMINALS = new ThreadLocal<ArrayList<Terminal>>() {
         @Override
         protected ArrayList<Terminal> initialValue() {
-            return new ArrayList<Terminal>();
+            return new ArrayList<>();
         }
     };
 
@@ -54,7 +54,7 @@ public class TerminalUtil {
     private static final ThreadLocal<ArrayList<IElement>> ELEMENTS = new ThreadLocal<ArrayList<IElement>>() {
         @Override
         protected ArrayList<IElement> initialValue() {
-            return new ArrayList<IElement>();
+            return new ArrayList<>();
         }
     };
 
@@ -144,7 +144,7 @@ public class TerminalUtil {
             pickCenterY = bounds.getCenterY();
         }
 
-        List<TerminalInfo> result = new ArrayList<TerminalInfo>();
+        List<TerminalInfo> result = new ArrayList<>();
         ArrayList<Terminal> terminals = TERMINALS.get();
         for (IElement e : elements)
         {
@@ -160,8 +160,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 +177,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;
@@ -224,8 +225,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 +238,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 +303,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 +314,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<TerminalLayout>   tls = e.getElementClass().getItemsByClass(TerminalLayout.class);
         AffineTransform                        result = null;
@@ -363,7 +375,7 @@ public class TerminalUtil {
         PickRequest req = new PickRequest(pickShape);
         DiagramUtils.pick(diagram, req, elements);
 
-        ArrayList<Bend> bends = new ArrayList<Bend>();
+        ArrayList<Bend> bends = new ArrayList<>();
         Point2D bendPos = new Point2D.Double();
         for (IElement e : diagram.getElements())
         {
@@ -430,7 +442,7 @@ public class TerminalUtil {
             }
         }
 
-        ArrayList<TerminalInfo> result = new ArrayList<TerminalInfo>(len);
+        ArrayList<TerminalInfo> result = new ArrayList<>(len);
         for (int i = 0; i < len; ++i) {
             TerminalInfo ti = tis.get(i);
             if (ti.distance == nearest.distance
@@ -444,4 +456,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;
+    }
+
 }