]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java
First draft of vertex size adjusting district network diagram profiles
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkEdgeNode.java
index 6001365346506306827e10c10d4c8c7ed62e599c..1e577e97a4553faebcfebd82659f56c4a8c96894 100644 (file)
-package org.simantics.district.network.ui.nodes;\r
-\r
-import java.awt.BasicStroke;\r
-import java.awt.Color;\r
-import java.awt.Graphics2D;\r
-import java.awt.RenderingHints;\r
-import java.awt.Shape;\r
-import java.awt.Stroke;\r
-import java.awt.geom.AffineTransform;\r
-import java.awt.geom.Path2D;\r
-import java.awt.geom.Rectangle2D;\r
-\r
-import org.simantics.district.network.ui.DistrictNetworkEdge;\r
-import org.simantics.scenegraph.g2d.G2DNode;\r
-import org.simantics.scenegraph.utils.NodeUtil;\r
-\r
-public class DistrictNetworkEdgeNode extends G2DNode {\r
-\r
-    private static final long serialVersionUID = 8049769475036519806L;\r
-    \r
-    private static final Stroke     SELECTION_STROKE = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);\r
-    private static final Color      SELECTION_COLOR  = new Color(255, 0, 255, 96);\r
-    \r
-    private DistrictNetworkEdge edge;\r
-    private Rectangle2D bounds;\r
-\r
-    @Override\r
-    public void render(Graphics2D g2d) {\r
-        \r
-        AffineTransform ot = null;\r
-        AffineTransform t = getTransform();\r
-        if (t != null && !t.isIdentity()) {\r
-            ot = g2d.getTransform();\r
-            g2d.transform(getTransform());\r
-        }\r
-        \r
-        Object aaHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);\r
-        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);\r
-\r
-        Color oldColor = g2d.getColor();\r
-        boolean selected = isSelected();\r
-        if (selected) {\r
-            Path2D selectionPath = edge.getPath();\r
-            Shape selectionShape = SELECTION_STROKE.createStrokedShape(selectionPath);\r
-            g2d.setColor(SELECTION_COLOR);\r
-            g2d.fill(selectionShape);\r
-        }\r
-        \r
-        g2d.setColor(Color.BLUE);\r
-        // render\r
-        g2d.draw(edge.getPath());\r
-        \r
-        // Reset\r
-        g2d.setColor(oldColor);\r
-        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, aaHint);\r
-        \r
-        if (ot != null)\r
-            g2d.setTransform(ot);\r
-    }\r
-\r
-    private boolean isSelected() {\r
-        return NodeUtil.isSelected(this, 1);\r
-    }\r
-\r
-    @Override\r
-    public Rectangle2D getBoundsInLocal() {\r
-        return bounds;\r
-    }\r
-    \r
-    private void updateBounds() {\r
-        Rectangle2D oldBounds = bounds;\r
-        if (oldBounds == null)\r
-            oldBounds = new Rectangle2D.Double();\r
-        bounds = calculateBounds(oldBounds);\r
-    }\r
-\r
-    private Rectangle2D calculateBounds(Rectangle2D rect) {\r
-        return edge.getBounds(rect);\r
-    }\r
-\r
-    public void setDNEdge(DistrictNetworkEdge edge) {\r
-        this.edge = edge;\r
-    }\r
-\r
-}\r
+package org.simantics.district.network.ui.nodes;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Line2D;
+import java.awt.geom.Path2D;
+import java.awt.geom.Rectangle2D;
+
+import org.simantics.district.network.ModelledCRS;
+import org.simantics.district.network.ui.DistrictNetworkEdge;
+import org.simantics.scenegraph.ISelectionPainterNode;
+import org.simantics.scenegraph.g2d.G2DNode;
+import org.simantics.scenegraph.utils.GeometryUtils;
+import org.simantics.scenegraph.utils.NodeUtil;
+
+public class DistrictNetworkEdgeNode extends G2DNode implements ISelectionPainterNode {
+
+    private static final long serialVersionUID = 8049769475036519806L;
+
+    private static final Stroke     SELECTION_STROKE = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
+    private static final Color      SELECTION_COLOR  = new Color(255, 0, 255, 96);
+
+    private DistrictNetworkEdge edge;
+    private Rectangle2D bounds;
+    private Line2D path;
+
+    private static final BasicStroke STROKE = new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
+    private boolean scaleStroke = true;
+
+    private Color color;
+
+    private Double stroke;
+
+    @Override
+    public void init() {
+    }
+
+    @Override
+    public void render(Graphics2D g2d) {
+        AffineTransform ot = null;
+        AffineTransform t = getTransform();
+        if (t != null && !t.isIdentity()) {
+            ot = g2d.getTransform();
+            g2d.transform(getTransform());
+        }
+
+        Object aaHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        Color oldColor = g2d.getColor();
+        BasicStroke oldStroke = (BasicStroke) g2d.getStroke();
+
+        g2d.setColor(color);
+        BasicStroke bs = null;
+        if (scaleStroke) {
+            double scale = GeometryUtils.getScale(g2d.getTransform());
+            scale = Math.max(10000, Math.min(scale, 50000));
+            double str = stroke != null ? Math.abs(stroke) : 1.0;
+            bs = GeometryUtils.scaleStroke(STROKE, (float) (str / scale));
+        } else {
+            bs = STROKE;
+        }
+
+        path = calculateLine(edge, path);
+
+        if (isSelected()) {
+            g2d.setColor(SELECTION_COLOR);
+            g2d.setStroke(GeometryUtils.scaleStroke(bs, 4f));
+            g2d.draw(path);
+        }
+
+        g2d.setStroke(bs);
+        g2d.draw(path);
+
+        // Reset
+        g2d.setStroke(oldStroke);
+        g2d.setColor(oldColor);
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, aaHint);
+
+        if (ot != null)
+            g2d.setTransform(ot);
+    }
+
+    public static Line2D calculateLine(DistrictNetworkEdge edge, Line2D result) {
+        // Convert to screen coordinates
+        double startX = ModelledCRS.longitudeToX(edge.getStartPoint().getX());
+        double startY = ModelledCRS.latitudeToY(-edge.getStartPoint().getY()); // Invert for Simantics
+        double endX = ModelledCRS.longitudeToX(edge.getEndPoint().getX());
+        double endY = ModelledCRS.latitudeToY(-edge.getEndPoint().getY());// Invert for Simantics
+
+        if (result == null)
+            result = new Line2D.Double();
+        result.setLine(startX, startY, endX, endY);
+        return result;
+    }
+
+    public static Path2D calculatePath(DistrictNetworkEdge edge, Path2D result) {
+        // Convert to screen coordinates
+        double startX = ModelledCRS.longitudeToX(edge.getStartPoint().getX());
+        double startY = ModelledCRS.latitudeToY(-edge.getStartPoint().getY()); // Invert for Simantics
+        double endX = ModelledCRS.longitudeToX(edge.getEndPoint().getX());
+        double endY = ModelledCRS.latitudeToY(-edge.getEndPoint().getY());// Invert for Simantics
+
+        if (result == null) {
+             result = new Path2D.Double();
+        } else {
+             result.reset();
+        }
+        result.moveTo(startX, startY);
+        result.lineTo(endX, endY);
+        return result;
+    }
+
+    private boolean isSelected() {
+        return NodeUtil.isSelected(this, 1);
+    }
+
+    @Override
+    public Rectangle2D getBoundsInLocal() {
+        return bounds;
+    }
+
+    private void updateBounds() {
+        Rectangle2D oldBounds = bounds;
+        if (oldBounds == null)
+            oldBounds = new Rectangle2D.Double();
+        bounds = calculateBounds(oldBounds);
+    }
+
+    private Rectangle2D calculateBounds(Rectangle2D rect) {
+        return calculatePath(edge, null).getBounds2D();
+    }
+
+    public void setDNEdge(DistrictNetworkEdge edge) {
+        this.edge = edge;
+        updateBounds();
+    }
+
+    public void setColor(Color color) {
+        this.color = color;
+    }
+
+    public Color getColor() {
+        return color;
+    }
+
+    @PropertySetter(value = "stroke")
+    public void setStroke(Double stroke) {
+        this.stroke = stroke;
+    }
+
+}