]> 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 9229932400a8ff12b964621a3643c2102bb0b634..1e577e97a4553faebcfebd82659f56c4a8c96894 100644 (file)
@@ -6,26 +6,29 @@ 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 {
+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 static final Stroke STROKE = new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
+    private Line2D path;
+
+    private static final BasicStroke STROKE = new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
     private boolean scaleStroke = true;
 
     private Color color;
@@ -35,68 +38,81 @@ public class DistrictNetworkEdgeNode extends G2DNode {
     @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();
-//        boolean selected = isSelected();
-//        if (selected) {
-//            Path2D selectionPath = edge.getPath();
-//            Shape selectionShape = SELECTION_STROKE.createStrokedShape(selectionPath);
-//            g2d.setColor(SELECTION_COLOR);
-//            g2d.fill(selectionShape);
-//        }
-//        
+
         g2d.setColor(color);
-        if (STROKE != null) {
-            if (scaleStroke && STROKE instanceof BasicStroke) {
-                double str;
-                if (stroke != null)
-                    str = Math.abs(stroke);
-                else
-                    str = 1.0;
-                BasicStroke bs = GeometryUtils.scaleStroke(STROKE, (float) (str / GeometryUtils.getScale(g2d.getTransform())));
-                g2d.setStroke(bs);
-            } else {
-                g2d.setStroke(STROKE);
-            }
+        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;
         }
 
-        g2d.draw(calculatePath(edge));
-        
+        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 Path2D calculatePath(DistrictNetworkEdge edge) {
+
+    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
-        
-        // render
-        Path2D path = new Path2D.Double();
-        path.moveTo(startX, startY);
-        path.lineTo(endX, endY);
-        return path;
+
+        if (result == null) {
+             result = new Path2D.Double();
+        } else {
+             result.reset();
+        }
+        result.moveTo(startX, startY);
+        result.lineTo(endX, endY);
+        return result;
     }
 
     private boolean isSelected() {
@@ -107,7 +123,7 @@ public class DistrictNetworkEdgeNode extends G2DNode {
     public Rectangle2D getBoundsInLocal() {
         return bounds;
     }
-    
+
     private void updateBounds() {
         Rectangle2D oldBounds = bounds;
         if (oldBounds == null)
@@ -116,7 +132,7 @@ public class DistrictNetworkEdgeNode extends G2DNode {
     }
 
     private Rectangle2D calculateBounds(Rectangle2D rect) {
-        return calculatePath(edge).getBounds2D();
+        return calculatePath(edge, null).getBounds2D();
     }
 
     public void setDNEdge(DistrictNetworkEdge edge) {
@@ -127,7 +143,7 @@ public class DistrictNetworkEdgeNode extends G2DNode {
     public void setColor(Color color) {
         this.color = color;
     }
-    
+
     public Color getColor() {
         return color;
     }