]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/model/Edge.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.debug.graphical / src / org / simantics / debug / graphical / model / Edge.java
diff --git a/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/model/Edge.java b/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/model/Edge.java
new file mode 100644 (file)
index 0000000..1b7f317
--- /dev/null
@@ -0,0 +1,89 @@
+package org.simantics.debug.graphical.model;\r
+\r
+import java.awt.Graphics2D;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Line2D;\r
+import java.awt.geom.Path2D;\r
+import java.awt.geom.Point2D;\r
+\r
+public class Edge {\r
+    private static final double ARROW_LENGTH = 10.0;\r
+    private static final double ARROW_MIDDLE_LENGTH = 8.0;\r
+    private static final double ARROW_RADIUS = 4.0;\r
+    \r
+    Node a;\r
+    Node b;\r
+    Content content;\r
+    \r
+    public Edge(Node a, Node b) {\r
+        this.a = a;\r
+        this.b = b;\r
+    }\r
+    \r
+    public Node getA() {\r
+        return a;\r
+    }\r
+    \r
+    public Node getB() {\r
+        return b;\r
+    }    \r
+    \r
+    public void setContent(Content content) {\r
+        this.content = content;\r
+    }\r
+    \r
+    public void render(Graphics2D g) {\r
+        Point2D pa = a.clipLineFromCenter(b.x, b.y);\r
+        Point2D pb = b.clipLineFromCenter(a.x, a.y);\r
+\r
+        double dx, dy;\r
+        double l;\r
+        drawArrow: {\r
+            Path2D path = new Path2D.Double();\r
+            \r
+            double x = pb.getX();\r
+            double y = pb.getY();\r
+            dx = pa.getX() - x;\r
+            dy = pa.getY() - y;\r
+            l = Math.sqrt(dx*dx + dy*dy);\r
+            if(l < 0.1)\r
+                break drawArrow;\r
+            \r
+            dx /= l;\r
+            dy /= l;\r
+            \r
+            path.moveTo(x, y);\r
+            path.lineTo(x+ARROW_LENGTH*dx+ARROW_RADIUS*dy, y+ARROW_LENGTH*dy-ARROW_RADIUS*dx);\r
+            path.lineTo(x+ARROW_MIDDLE_LENGTH*dx, y+ARROW_MIDDLE_LENGTH*dy);\r
+            path.lineTo(x+ARROW_LENGTH*dx-ARROW_RADIUS*dy, y+ARROW_LENGTH*dy+ARROW_RADIUS*dx);\r
+            path.closePath();\r
+            \r
+            g.fill(path);\r
+            \r
+            pb.setLocation(pb.getX()+dx*ARROW_MIDDLE_LENGTH, \r
+                    pb.getY()+dy*ARROW_MIDDLE_LENGTH);\r
+        }\r
+        \r
+        g.draw(new Line2D.Double(pa, pb));\r
+        \r
+        if(content != null) {\r
+            if(l < content.radiusX*2.1) {\r
+                /*double ss = - Math.abs(dy)*content.radiusX + Math.abs(dx)*content.radiusY + 3.0;\r
+                double tx = 0.5*(pa.getX() + pb.getX()) - dy*ss;\r
+                double ty = 0.5*(pa.getY() + pb.getY()) + dx*ss;        \r
+                */\r
+                double tx = 0.5*(pa.getX() + pb.getX()) + Math.signum(dy) * content.radiusX;\r
+                double ty = 0.5*(pa.getY() + pb.getY()) - Math.signum(dx) * content.radiusY;\r
+                \r
+                content.render(g, tx, ty);\r
+            }\r
+            else {\r
+                double ss = content.radiusY*0.5+1.0;\r
+                double tx = 0.5*(pa.getX() + pb.getX()) - dy*ss;\r
+                double ty = 0.5*(pa.getY() + pb.getY()) + dx*ss;\r
+                \r
+                content.render(g, new AffineTransform(-dx, -dy, dy, -dx, tx, ty));\r
+            }\r
+        }\r
+    }\r
+}\r