]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java
Some cleaning and fixing of district functionalities
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / NetworkDrawingNode.java
index a9c96e9b37c3e295b452c33eb521374079af9f3d..1ccde2c7b18db0c459648af546428b57c3205428 100644 (file)
@@ -17,6 +17,7 @@ import org.simantics.db.WriteGraph;
 import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.diagram.ui.DiagramModelHints;
+import org.simantics.district.network.ModelledCRS;
 import org.simantics.district.network.ui.DNEdgeBuilder;
 import org.simantics.district.network.ui.NetworkDrawingParticipant;
 import org.simantics.g2d.canvas.Hints;
@@ -24,6 +25,7 @@ import org.simantics.g2d.canvas.IToolMode;
 import org.simantics.g2d.diagram.IDiagram;
 import org.simantics.scenegraph.g2d.G2DNode;
 import org.simantics.scenegraph.g2d.events.EventTypes;
+import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
@@ -35,6 +37,8 @@ public class NetworkDrawingNode extends G2DNode {
 
     private static final long serialVersionUID = -3475301184009620573L;
     
+    private Point2D currentMousePos = null;
+    
     private List<Point2D> nodes = new ArrayList<>();
 
     private Resource diagramResource;
@@ -73,6 +77,8 @@ public class NetworkDrawingNode extends G2DNode {
 
     @Override
     public void render(Graphics2D g2d) {
+        if (nodes.isEmpty())
+            return;
         
         Path2D path = new Path2D.Double();
         Iterator<Point2D> nodeIter = nodes.iterator();
@@ -84,6 +90,8 @@ public class NetworkDrawingNode extends G2DNode {
             Point2D node = nodeIter.next();
             path.lineTo(node.getX(), node.getY());
         }
+        if (currentMousePos != null)
+            path.lineTo(currentMousePos.getX(), currentMousePos.getY());
         
         Color old = g2d.getColor();
         Stroke oldStroke = g2d.getStroke();
@@ -112,7 +120,7 @@ public class NetworkDrawingNode extends G2DNode {
     
     @Override
     public int getEventMask() {
-        return EventTypes.MouseMask;
+        return EventTypes.AnyMask;
     }
     
     @Override
@@ -143,22 +151,41 @@ public class NetworkDrawingNode extends G2DNode {
         }
         return super.mouseDoubleClicked(e);
     }
-    
+
     private void createEdge(Point2D start, Point2D end) {
-        double[] startCoords = new double[] { start.getX(), start.getY() };
-        double[] endCoords = new double[] { end.getX(), end.getY() };
+        
+        double padding = GeometryUtils.getScale(getTransform());
+        
+        /*
+         *  To convert y-coordinates to map coordinates in ruler, use:
+         *    double val = (y-offsetY)/scaleY;
+         *    val = Math.toDegrees(Math.atan(Math.sinh(Math.toRadians(val))));
+         *    String str = formatValue(val);
+         */
+        // TODO: fix scale
+        double scaleY = getTransform().getScaleY();
+        double scaleX = getTransform().getScaleX();
+        
+        double startLat = ModelledCRS.yToLatitude(start.getY() / scaleY);
+        double startLon = ModelledCRS.xToLongitude(start.getX() / scaleX);
+        
+        double endLat = ModelledCRS.yToLatitude(end.getY() / scaleY);
+        double endLon = ModelledCRS.xToLongitude(end.getX() / scaleX);
+        
+        double[] startCoords = new double[] { startLon, startLat };
+        double[] endCoords = new double[] { endLon, endLat };
         
         DNEdgeBuilder builder = new DNEdgeBuilder(diagramResource, diagram);
         Simantics.getSession().asyncRequest(new WriteRequest() {
             
             @Override
             public void perform(WriteGraph graph) throws DatabaseException {
-                builder.create(graph, startCoords, endCoords);
+                builder.create(graph, startCoords, endCoords, 1 / padding);
             }
         });
         
     }
-    
+
     @Override
     protected boolean mouseClicked(MouseClickEvent e) {
         // check ToolMode
@@ -168,9 +195,12 @@ public class NetworkDrawingNode extends G2DNode {
                 committed = false;
                 return false;
             }
-            Point2D localPos = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
-            nodes.add(new Point2D.Double(localPos.getX(), localPos.getY()));
-            
+            if (e.button == MouseEvent.RIGHT_BUTTON && !nodes.isEmpty()) {
+                nodes.remove(nodes.size() - 1);
+            } else if (e.button == MouseEvent.LEFT_BUTTON) {
+                Point2D localPos = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
+                nodes.add(new Point2D.Double(localPos.getX(), localPos.getY()));
+            }
             repaint();
             return true;
         }
@@ -183,6 +213,34 @@ public class NetworkDrawingNode extends G2DNode {
 
     @Override
     protected boolean mouseMoved(MouseMovedEvent e) {
+        IToolMode mode = getToolMode();
+        if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) {
+            boolean repaint = false;
+            Point2D p = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
+            if (participant.pickHoveredElement(p)) {
+                repaint = true;
+            }
+            if (!nodes.isEmpty()) {
+                currentMousePos = p;
+                
+                repaint();
+                return true;
+            }
+            currentMousePos = null;
+            if (repaint == true)
+                repaint();
+        }
         return super.mouseMoved(e);
     }
+    
+    @Override
+    protected boolean keyPressed(KeyPressedEvent e) {
+        if (e.keyCode == java.awt.event.KeyEvent.VK_ESCAPE) {
+            nodes.clear();
+            repaint();
+            return true;
+        }
+        return super.keyPressed(e);
+            
+    }
 }
\ No newline at end of file