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