]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/NetworkDrawingParticipant.java
Add UI for resetting component values
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / NetworkDrawingParticipant.java
1
2 package org.simantics.district.network.ui;
3
4 import java.awt.geom.AffineTransform;
5 import java.awt.geom.Point2D;
6 import java.awt.geom.Rectangle2D;
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.util.List;
10
11 import org.simantics.db.Resource;
12 import org.simantics.diagram.ui.DiagramModelHints;
13 import org.simantics.district.network.ui.adapters.DistrictNetworkEdgeElement;
14 import org.simantics.district.network.ui.adapters.DistrictNetworkVertexElement;
15 import org.simantics.district.network.ui.nodes.DistrictNetworkVertexNode;
16 import org.simantics.district.network.ui.nodes.NetworkDrawingNode;
17 import org.simantics.district.network.ui.participants.DNPickSorter;
18 import org.simantics.district.network.ui.participants.DynamicVisualisationContributionsParticipant;
19 import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency;
20 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit;
21 import org.simantics.g2d.diagram.IDiagram;
22 import org.simantics.g2d.diagram.handler.PickContext;
23 import org.simantics.g2d.diagram.handler.PickRequest;
24 import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant;
25 import org.simantics.g2d.element.ElementHints;
26 import org.simantics.g2d.element.IElement;
27 import org.simantics.maps.MapScalingTransform;
28 import org.simantics.scenegraph.INode;
29 import org.simantics.scenegraph.Node;
30 import org.simantics.scenegraph.g2d.G2DParentNode;
31 import org.simantics.scenegraph.utils.GeometryUtils;
32
33 public class NetworkDrawingParticipant extends AbstractDiagramParticipant {
34
35     public static final String NETWORK_DRAWING_NODE = "networkDrawingNode";
36
37     @Dependency
38     PickContext pick;
39
40     private NetworkDrawingNode node;
41     private DynamicVisualisationContributionsParticipant dynamicVisualisationContributionsParticipant;
42     private AffineTransform transform;
43
44     /**
45      * Holds the current element for which hover information is shown.
46      * This exists only to optimize the hover updating procedure.
47      */
48     private IElement currentHoverElement;
49
50     public NetworkDrawingParticipant(DynamicVisualisationContributionsParticipant dynamicVisualisationContributionsParticipant, AffineTransform transform) {
51         this.dynamicVisualisationContributionsParticipant = dynamicVisualisationContributionsParticipant;
52         this.transform = transform;
53     }
54
55     @SGInit
56     public void initSG(G2DParentNode parent) {
57         node = parent.addNode(NETWORK_DRAWING_NODE, NetworkDrawingNode.class);
58         node.setTransform(transform);
59         node.setNetworkDrawingParticipant(this);
60     }
61
62     @Override
63     protected void onDiagramSet(IDiagram newDiagram, IDiagram oldDiagram) {
64         node.setDiagram(newDiagram);
65     }
66
67     public boolean pickHoveredElement(Point2D canvasPos, boolean isConnectionTool, AffineTransform viewTransform) {
68         PickRequest req = new PickRequest(getPickRect(canvasPos, viewTransform)).context(getContext());
69         List<IElement> pickables = new ArrayList<>();
70         pick.pick(diagram, req, pickables);
71
72         Collections.sort(pickables, DNPickSorter.nearestVerticesFirst(false, DNPickSorter.centerDistSq(canvasPos.getX(), canvasPos.getY())));
73
74         updateHoveredElement(pickables, true, isConnectionTool, viewTransform);
75         // Will repaint once the async hover info calculation is ready, no need to do it here
76         return false;
77     }
78
79     private boolean updateHoveredElement(List<IElement> elements, boolean hover, boolean isConnectionTool, AffineTransform viewTransform) {
80         if (elements == null || elements.isEmpty()) {
81             currentHoverElement = null;
82             return dynamicVisualisationContributionsParticipant.doHover(false, isConnectionTool);
83         } else {
84             dynamicVisualisationContributionsParticipant.doHover(true, isConnectionTool);
85
86             // we prefer the first picked element only
87             IElement elem = elements.get(0);
88             if (elem.equals(currentHoverElement))
89                 return false;
90
91             INode node = elem.getHint(DistrictNetworkVertexElement.KEY_DN_VERTEX_NODE);
92             if (node == null)
93                 node = elem.getHint(DistrictNetworkEdgeElement.KEY_DN_EDGE_NODE);
94             if (node == null)
95                 return false;
96
97             Resource mapElement = elem.getHint(ElementHints.KEY_OBJECT);
98             Resource runtimeDiagram = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
99             currentHoverElement = elem;
100             dynamicVisualisationContributionsParticipant.hoverNode(runtimeDiagram, mapElement, node, MapScalingTransform.zoomLevel(viewTransform));
101             return true;
102         }
103     }
104
105     public boolean isHoveringOverNode(Point2D canvasPos, AffineTransform viewTransform) {
106         PickRequest req = new PickRequest(getPickRect(canvasPos, viewTransform)).context(getContext());
107         List<IElement> pickables = new ArrayList<>();
108         pick.pick(diagram, req, pickables);
109         for (IElement elem : pickables) {
110             Node node = elem.getHint(DistrictNetworkVertexElement.KEY_DN_VERTEX_NODE);
111             if (node instanceof DistrictNetworkVertexNode) {
112                 return true;
113             }
114         }
115         return false;
116     }
117
118     private Rectangle2D getPickRect(Point2D canvasPos, AffineTransform viewTransform) {
119         double pixelScale = 1.0 / GeometryUtils.getScale(viewTransform);
120         if (Double.isInfinite(pixelScale))
121             pixelScale = 1e-8;
122
123         Rectangle2D pickRect = GeometryUtils.expandRectangle(
124                 new Rectangle2D.Double(canvasPos.getX(), canvasPos.getY(), 0, 0),
125                 pixelScale * 4);
126
127         return pickRect;
128     }
129
130     public AffineTransform getTransform() {
131         return transform;
132     }
133
134 }