--- /dev/null
+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