1 package org.simantics.debug.graphical.model;
\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
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
18 public Edge(Node a, Node b) {
\r
23 public Node getA() {
\r
27 public Node getB() {
\r
31 public void setContent(Content content) {
\r
32 this.content = content;
\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
42 Path2D path = new Path2D.Double();
\r
44 double x = pb.getX();
\r
45 double y = pb.getY();
\r
48 l = Math.sqrt(dx*dx + dy*dy);
\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
63 pb.setLocation(pb.getX()+dx*ARROW_MIDDLE_LENGTH,
\r
64 pb.getY()+dy*ARROW_MIDDLE_LENGTH);
\r
67 g.draw(new Line2D.Double(pa, pb));
\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
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
78 content.render(g, tx, ty);
\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
85 content.render(g, new AffineTransform(-dx, -dy, dy, -dx, tx, ty));
\r