]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeArrayNode.java
Fixed most warnings from district codebase after JavaSE-11 switch
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkEdgeArrayNode.java
1 package org.simantics.district.network.ui.nodes;
2
3 import java.awt.BasicStroke;
4 import java.awt.Color;
5 import java.awt.Graphics2D;
6 import java.awt.geom.Line2D;
7 import java.awt.geom.Path2D;
8 import java.awt.geom.Point2D;
9 import java.awt.geom.Rectangle2D;
10
11 import org.simantics.scenegraph.ParentNode;
12 import org.simantics.scenegraph.g2d.G2DNode;
13 import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;
14 import org.simantics.scenegraph.utils.NodeUtil;
15 import org.simantics.utils.datastructures.Pair;
16
17 public class DistrictNetworkEdgeArrayNode extends G2DNode implements DeferredNode {
18
19     private static final long serialVersionUID = -8377444630205663419L;
20
21     public static final String NODE_KEY = "DISTRICT_NETWORK_EDGE_ARRAY";
22
23     private static final String RENDERER_ID = "edgeArrayDeferredRenderer";
24
25     private DistrictNetworkEdgeNode edgeNode = null;
26     private Double arrowLength;
27     private Path2D arrowPath;
28
29     @Override
30     public void render(Graphics2D g2d) {
31         ParentNode<?> root = (ParentNode<?>) NodeUtil.getNearestParentOfType(this, RTreeNode.class);
32         DeferredRenderingNode deferred = root != null ? (DeferredRenderingNode) root.getNode(RENDERER_ID) : null;
33         if (deferred != null)
34             deferred.deferNode(g2d.getTransform(), this);
35         else
36             renderDeferred(g2d);
37     }
38
39     @Override
40     public void renderDeferred(Graphics2D g2d) {
41
42         // Draw arrow
43         if (arrowLength != null) {
44             double scale = DistrictNetworkEdgeNode.scaleStroke ? (Double) g2d.getRenderingHint(DistrictRenderingHints.KEY_VIEW_SCALE_UNDER_SPATIAL_ROOT) : 1.0;
45             g2d.setColor(Color.BLACK);
46             float lw = DistrictNetworkEdgeNode.STROKE.getLineWidth() / (float)scale;
47             g2d.setStroke(new BasicStroke(lw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
48
49             double l = arrowLength;
50             double w = 2 * (double) lw * Math.signum(l);
51             if (Math.abs(w) > Math.abs(l)) w = l;
52             double offset = 2 * (double) lw;
53
54             int zoomLevel = (Integer) g2d.getRenderingHint(DistrictRenderingHints.KEY_VIEW_ZOOM_LEVEL);
55             
56             Point2D centerPoint = edgeNode.getCenterPoint(zoomLevel);
57             Point2D direction = edgeNode.getDirection(zoomLevel);
58             double centerX = centerPoint.getX(), centerY = centerPoint.getY();
59             double deltaX = direction.getX(), deltaY = direction.getY();
60
61             // Ensure the line is always rendered on top of the edge
62             // to prevent overlap with static info rendered below it.
63             double odx = offset * deltaY;
64             double ody = offset * deltaX;
65             if (odx < 0) {
66                 odx = -odx;
67                 ody = -ody;
68             }
69
70             double x0 = centerX - l/2 * deltaX + ody;
71             double y0 = centerY - l/2 * deltaY - odx;
72             double x1 = centerX + (l/2 - w) * deltaX + ody;
73             double y1 = centerY + (l/2 - w) * deltaY - odx;
74
75             g2d.draw(new Line2D.Double(x0, y0, x1, y1));
76
77             arrowPath = new Path2D.Double();
78             arrowPath.moveTo(x1 + w * deltaX, y1 + w * deltaY);
79             arrowPath.lineTo(x1 + w * deltaY, y1 - w * deltaX);
80             arrowPath.lineTo(x1 - w * deltaY, y1 + w * deltaX);
81             arrowPath.closePath();
82             g2d.fill(arrowPath);
83         }
84     }
85
86     @Override
87     public Rectangle2D getBoundsInLocal() {
88         return null;
89     }
90     
91     public void setEdgeNode(DistrictNetworkEdgeNode edgeNode) {
92         this.edgeNode = edgeNode;
93     }
94
95     public void setArrowLength(Double length) {
96         this.arrowLength = length;
97     }
98
99     public static Pair<String, Class<DeferredRenderingNode>> renderer() {
100         return Pair.make(RENDERER_ID, DeferredRenderingNode.class);
101     }
102
103 }