]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/TerminalUtil.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / pointertool / TerminalUtil.java
index 85f75a06638150f83af0fc4f413836a7f6a6d0b9..462569451ac6363baed8a969b3ad48bc76cb2709 100644 (file)
@@ -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<ArrayList<Terminal>> TERMINALS = new ThreadLocal<ArrayList<Terminal>>() {
         @Override
         protected ArrayList<Terminal> initialValue() {
-            return new ArrayList<Terminal>();
+            return new ArrayList<>();
         }
     };
 
@@ -54,7 +55,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<>();
         }
     };
 
@@ -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<TerminalInfo> pickTerminals(IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals)
+    public static List<TerminalInfo> pickTerminals(ICanvasContext ctx, IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals)
     {
         boolean clearElements = false;
         List<IElement> 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<TerminalInfo> result = new ArrayList<TerminalInfo>();
+        List<TerminalInfo> result = new ArrayList<>();
         ArrayList<Terminal> 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<IElement> 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<TerminalLayout>   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<IElement> elements = ELEMENTS.get();
         elements.clear();
-        PickRequest req = new PickRequest(pickShape);
+        PickRequest req = new PickRequest(pickShape).context(ctx);
         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())
         {
@@ -401,7 +414,7 @@ public class TerminalUtil {
     public static boolean isSameTerminal(TerminalInfo t1, TerminalInfo t2) {
         if (t1 == null || t2 == null)
             return false;
-        return t1.e.equals(t2.e) && t1.t.equals(t2.e);
+        return t1.e.equals(t2.e) && t1.t.equals(t2.t);
     }
 
     /**
@@ -430,7 +443,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 +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;
+    }
+
 }