- private IElement rotatingPick(Set<IElement> sel, List<IElement> pickables) {\r
- int earliestIndex = pickables.size();\r
- for (int i = pickables.size() - 1; i >= 0; --i) {\r
- if (sel.contains(pickables.get(i))) {\r
- earliestIndex = i;\r
- break;\r
- }\r
- }\r
- if (earliestIndex == 0)\r
- earliestIndex = pickables.size();\r
- IElement selectedPick = pickables.get(earliestIndex - 1);\r
- return selectedPick;\r
- }\r
-\r
- public static 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
- @Override\r
- public void init() {\r
- super.init();\r
- addEventHandler(this);\r
- }\r
- \r
- public void setDiagram(IDiagram diagram) {\r
- if (diagram != null)\r
- this.diagramResource = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE);\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
- 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
- \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);\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
- 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
- return super.mouseClicked(e);\r
- }\r
- \r
- @Override\r
- protected boolean mouseMoved(MouseMovedEvent e) {\r
- return super.mouseMoved(e);\r
- }\r
- }\r