]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java
Implement district features to Simantics platform
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / NetworkDrawingNode.java
diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/NetworkDrawingNode.java
new file mode 100644 (file)
index 0000000..4862942
--- /dev/null
@@ -0,0 +1,157 @@
+package org.simantics.district.network.ui.nodes;\r
+\r
+import java.awt.Color;\r
+import java.awt.Graphics2D;\r
+import java.awt.geom.Path2D;\r
+import java.awt.geom.Point2D;\r
+import java.awt.geom.Rectangle2D;\r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.simantics.Simantics;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.diagram.ui.DiagramModelHints;\r
+import org.simantics.district.network.ui.DNEdgeBuilder;\r
+import org.simantics.district.network.ui.NetworkDrawingParticipant;\r
+import org.simantics.g2d.canvas.Hints;\r
+import org.simantics.g2d.canvas.IToolMode;\r
+import org.simantics.g2d.diagram.IDiagram;\r
+import org.simantics.scenegraph.g2d.G2DNode;\r
+import org.simantics.scenegraph.g2d.events.EventTypes;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
+import org.simantics.scenegraph.utils.NodeUtil;\r
+\r
+public class NetworkDrawingNode extends G2DNode {\r
+\r
+    private static final long serialVersionUID = -3475301184009620573L;\r
+    \r
+    private List<Point2D> nodes = new ArrayList<>();\r
+\r
+    private Rectangle2D rect = new Rectangle2D.Double(10, 10, 10, 10);\r
+\r
+    private Set<Path2D> paths = new HashSet<>();\r
+\r
+    private Resource diagramResource;\r
+\r
+    private boolean committed;\r
+\r
+    private NetworkDrawingParticipant participant;\r
+\r
+    private IDiagram diagram;\r
+    \r
+    @Override\r
+    public void init() {\r
+        super.init();\r
+        addEventHandler(this);\r
+    }\r
+    \r
+    public void setNetworkDrawingParticipant(NetworkDrawingParticipant participant) {\r
+        this.participant = participant;\r
+    }\r
+    \r
+    public void setDiagram(IDiagram diagram) {\r
+        if (diagram != null) {\r
+            this.diagram = diagram;\r
+            this.diagramResource = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE);\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void render(Graphics2D g2d) {\r
+        Color old = g2d.getColor();\r
+        g2d.setColor(Color.BLUE);\r
+        \r
+        paths.forEach(p -> {\r
+            g2d.draw(p);\r
+        });\r
+        \r
+        g2d.setColor(old);\r
+    }\r
+\r
+    @Override\r
+    public Rectangle2D getBoundsInLocal() {\r
+        return rect.getBounds2D();\r
+    }\r
+    \r
+    @Override\r
+    public int getEventMask() {\r
+        return EventTypes.MouseMask;\r
+    }\r
+    \r
+    @Override\r
+    protected boolean mouseDoubleClicked(MouseDoubleClickedEvent e) {\r
+        // nodes to path2d\r
+        IToolMode mode = getToolMode();\r
+        if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) {\r
+            Point2D start = null;\r
+            Point2D end = null;\r
+            Iterator<Point2D> nodeIter = nodes.iterator();\r
+            while (nodeIter.hasNext()) {\r
+                if (end == null) {\r
+                    start = nodeIter.next();\r
+                } else {\r
+                    start = end;\r
+                }\r
+                end = nodeIter.next();\r
+                \r
+                createEdge(start, end);\r
+            }\r
+            \r
+            nodes.clear();\r
+            committed = true;\r
+            \r
+            repaint();\r
+            \r
+            return true;\r
+        }\r
+        return super.mouseDoubleClicked(e);\r
+    }\r
+    \r
+    private void createEdge(Point2D start, Point2D end) {\r
+        double[] startCoords = new double[] { start.getX(), start.getY() };\r
+        double[] endCoords = new double[] { end.getX(), end.getY() };\r
+        \r
+        DNEdgeBuilder builder = new DNEdgeBuilder(diagramResource, diagram);\r
+        Simantics.getSession().asyncRequest(new WriteRequest() {\r
+            \r
+            @Override\r
+            public void perform(WriteGraph graph) throws DatabaseException {\r
+                builder.create(graph, startCoords, endCoords);\r
+            }\r
+        });\r
+        \r
+    }\r
+    \r
+    @Override\r
+    protected boolean mouseClicked(MouseClickEvent e) {\r
+        // check ToolMode\r
+        IToolMode mode = getToolMode();\r
+        if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) {\r
+            if (committed) {\r
+                committed = false;\r
+                return false;\r
+            }\r
+            Point2D localPos = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());\r
+            nodes.add(new Point2D.Double(localPos.getX(), localPos.getY()));\r
+        }\r
+        return super.mouseClicked(e);\r
+    }\r
+    \r
+    private IToolMode getToolMode() {\r
+        return participant.getHint(Hints.KEY_TOOL);\r
+    }\r
+\r
+    @Override\r
+    protected boolean mouseMoved(MouseMovedEvent e) {\r
+        return super.mouseMoved(e);\r
+    }\r
+}
\ No newline at end of file