]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.debug.graphical.model;\r
2 \r
3 import java.awt.Graphics2D;\r
4 import java.awt.geom.AffineTransform;\r
5 import java.awt.geom.Line2D;\r
6 import java.awt.geom.Path2D;\r
7 import java.awt.geom.Point2D;\r
8 \r
9 public class Edge {\r
10     private static final double ARROW_LENGTH = 10.0;\r
11     private static final double ARROW_MIDDLE_LENGTH = 8.0;\r
12     private static final double ARROW_RADIUS = 4.0;\r
13     \r
14     Node a;\r
15     Node b;\r
16     Content content;\r
17     \r
18     public Edge(Node a, Node b) {\r
19         this.a = a;\r
20         this.b = b;\r
21     }\r
22     \r
23     public Node getA() {\r
24         return a;\r
25     }\r
26     \r
27     public Node getB() {\r
28         return b;\r
29     }    \r
30     \r
31     public void setContent(Content content) {\r
32         this.content = content;\r
33     }\r
34     \r
35     public void render(Graphics2D g) {\r
36         Point2D pa = a.clipLineFromCenter(b.x, b.y);\r
37         Point2D pb = b.clipLineFromCenter(a.x, a.y);\r
38 \r
39         double dx, dy;\r
40         double l;\r
41         drawArrow: {\r
42             Path2D path = new Path2D.Double();\r
43             \r
44             double x = pb.getX();\r
45             double y = pb.getY();\r
46             dx = pa.getX() - x;\r
47             dy = pa.getY() - y;\r
48             l = Math.sqrt(dx*dx + dy*dy);\r
49             if(l < 0.1)\r
50                 break drawArrow;\r
51             \r
52             dx /= l;\r
53             dy /= l;\r
54             \r
55             path.moveTo(x, y);\r
56             path.lineTo(x+ARROW_LENGTH*dx+ARROW_RADIUS*dy, y+ARROW_LENGTH*dy-ARROW_RADIUS*dx);\r
57             path.lineTo(x+ARROW_MIDDLE_LENGTH*dx, y+ARROW_MIDDLE_LENGTH*dy);\r
58             path.lineTo(x+ARROW_LENGTH*dx-ARROW_RADIUS*dy, y+ARROW_LENGTH*dy+ARROW_RADIUS*dx);\r
59             path.closePath();\r
60             \r
61             g.fill(path);\r
62             \r
63             pb.setLocation(pb.getX()+dx*ARROW_MIDDLE_LENGTH, \r
64                     pb.getY()+dy*ARROW_MIDDLE_LENGTH);\r
65         }\r
66         \r
67         g.draw(new Line2D.Double(pa, pb));\r
68         \r
69         if(content != null) {\r
70             if(l < content.radiusX*2.1) {\r
71                 /*double ss = - Math.abs(dy)*content.radiusX + Math.abs(dx)*content.radiusY + 3.0;\r
72                 double tx = 0.5*(pa.getX() + pb.getX()) - dy*ss;\r
73                 double ty = 0.5*(pa.getY() + pb.getY()) + dx*ss;        \r
74                 */\r
75                 double tx = 0.5*(pa.getX() + pb.getX()) + Math.signum(dy) * content.radiusX;\r
76                 double ty = 0.5*(pa.getY() + pb.getY()) - Math.signum(dx) * content.radiusY;\r
77                 \r
78                 content.render(g, tx, ty);\r
79             }\r
80             else {\r
81                 double ss = content.radiusY*0.5+1.0;\r
82                 double tx = 0.5*(pa.getX() + pb.getX()) - dy*ss;\r
83                 double ty = 0.5*(pa.getY() + pb.getY()) + dx*ss;\r
84                 \r
85                 content.render(g, new AffineTransform(-dx, -dy, dy, -dx, tx, ty));\r
86             }\r
87         }\r
88     }\r
89 }\r