]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java
Some cleaning and fixing of district functionalities
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkVertexNode.java
index e9d0713ddb2d4bb34758ad8e279cacae64308263..011d682eb2a419f9dc7e02e4706e39c16850d24c 100644 (file)
@@ -37,6 +37,8 @@ public class DistrictNetworkVertexNode extends G2DNode {
 
     private Color color;
 
+    private Rectangle2D bounds;
+
     @Override
     public void init() {
         setZIndex(2);
@@ -68,11 +70,14 @@ public class DistrictNetworkVertexNode extends G2DNode {
         }
         scaleRecip = 8.0 * scaleRecip;
         
+        // Translate lat and lon to X and Y
+        Point2D res = calculatePoint2D(vertex);
+        
         Rectangle2D toDraw;
         if (hover) {
-            toDraw = new Rectangle2D.Double(HOVERED.getX() * scaleRecip, HOVERED.getY() * scaleRecip, HOVERED.getWidth() * scaleRecip, HOVERED.getHeight() * scaleRecip);
+            toDraw = new Rectangle2D.Double(res.getX() - (HOVERED.getWidth() / 2 * scaleRecip), res.getY() - (HOVERED.getHeight() / 2 * scaleRecip), HOVERED.getWidth() * scaleRecip, HOVERED.getHeight() * scaleRecip);
         } else {
-            toDraw = new Rectangle2D.Double(NORMAL.getX() * scaleRecip, NORMAL.getY() * scaleRecip, NORMAL.getWidth() * scaleRecip, NORMAL.getHeight() * scaleRecip);
+            toDraw = new Rectangle2D.Double(res.getX() - (NORMAL.getWidth() / 2 * scaleRecip), res.getY() - (NORMAL.getHeight() / 2 * scaleRecip), NORMAL.getWidth() * scaleRecip, NORMAL.getHeight() * scaleRecip);
         }
         // render
         g2d.fill(toDraw);
@@ -87,15 +92,49 @@ public class DistrictNetworkVertexNode extends G2DNode {
             g2d.setTransform(ot);
     }
 
+    @Override
+    public Rectangle2D getBounds() {
+        return super.getBounds();
+    }
+    
     @Override
     public Rectangle2D getBoundsInLocal() {
-        if (hover)
-            return HOVERED;
-        return NORMAL;
+        return bounds;
+    }
+    
+    private void updateBounds() {
+        Rectangle2D oldBounds = bounds;
+        if (oldBounds == null)
+            oldBounds = new Rectangle2D.Double();
+        bounds = calculateBounds(oldBounds);
+    }
+
+    @Override
+    public void setTransform(AffineTransform transform) {
+        super.setTransform(transform);
+        // Update bounds
+        updateBounds();
+    }
+    
+    private Rectangle2D calculateBounds(Rectangle2D rect) {
+        Point2D calcPoint = calculatePoint2D(vertex);
+        AffineTransform at = getTransform();
+        return new Rectangle2D.Double(calcPoint.getX(), calcPoint.getY(), 1 / at.getScaleX(), 1 / at.getScaleY()).getBounds2D();
+    }
+
+    private static Point2D calculatePoint2D(DistrictNetworkVertex vertex) {
+        Point2D point= vertex.getPoint();
+        double x = ModelledCRS.longitudeToX(point.getX());
+        double y = ModelledCRS.latitudeToY(point.getY());
+
+        // Apply the scaling
+        Point2D res = new Point2D.Double(x, y);
+        return res;
     }
 
     public void setVertex(DistrictNetworkVertex vertex) {
         this.vertex = vertex;
+        updateBounds();
     }
     
     public boolean hover(boolean hover) {