]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/DiagramNodeUtil.java
Merge "(refs #7519) Added old constructor back to ConnectionVisuals."
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / DiagramNodeUtil.java
1 package org.simantics.diagram.elements;
2
3 import java.awt.Component;
4 import java.util.Collection;
5 import java.util.HashSet;
6 import java.util.Set;
7
8 import org.simantics.Simantics;
9 import org.simantics.db.ReadGraph;
10 import org.simantics.db.Resource;
11 import org.simantics.db.WriteGraph;
12 import org.simantics.db.common.request.Queries;
13 import org.simantics.db.common.request.ResourceRead;
14 import org.simantics.db.common.request.WriteRequest;
15 import org.simantics.db.exception.DatabaseException;
16 import org.simantics.db.request.Read;
17 import org.simantics.db.service.VirtualGraphSupport;
18 import org.simantics.diagram.stubs.DiagramResource;
19 import org.simantics.diagram.ui.DiagramModelHints;
20 import org.simantics.g2d.canvas.ICanvasContext;
21 import org.simantics.g2d.chassis.AWTChassis;
22 import org.simantics.g2d.diagram.DiagramHints;
23 import org.simantics.g2d.diagram.IDiagram;
24 import org.simantics.g2d.diagram.handler.DataElementMap;
25 import org.simantics.g2d.element.ElementHints;
26 import org.simantics.g2d.element.IElement;
27 import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;
28 import org.simantics.modeling.ModelingResources;
29 import org.simantics.scenegraph.INode;
30 import org.simantics.scenegraph.adapters.ISceneGraphProvider;
31 import org.simantics.scenegraph.g2d.G2DSceneGraph;
32 import org.simantics.scenegraph.g2d.IG2DNode;
33 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
34 import org.simantics.scenegraph.utils.NodeUtil;
35 import org.simantics.simulation.ontology.SimulationResource;
36
37 /**
38  * Temporary transitory utils for handling some scene graph <-> g2d
39  * interactions.
40  * 
41  * @author Antti Villberg
42  */
43 public class DiagramNodeUtil {
44
45     public static ICanvasContext getCanvasContext(IG2DNode node) {
46         G2DSceneGraph sg = node.getRootNode2D();
47         if (sg == null)
48             return null;
49         Component rootPane = sg.getRootPane();
50         if(rootPane == null) {
51                 throw new IllegalStateException("No root pane for scenegraph" + sg);
52         }
53         AWTChassis chassis = (AWTChassis)(rootPane.getParent());
54         return chassis.getCanvasContext();
55     }
56
57     public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
58         G2DSceneGraph sg = node.getRootNode2D();
59         if (sg == null)
60             return null;
61         Component rootPane = sg.getRootPane();
62         if(rootPane == null) {
63                 return null;
64         }
65         AWTChassis chassis = (AWTChassis)(rootPane.getParent());
66         return chassis.getCanvasContext();
67     }
68
69     public static IElement getElement(ICanvasContext ctx, IG2DNode node) {
70         IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
71         if (diagram != null) {
72             SingleElementNode eNode = NodeUtil.findNearestParentNode(node, SingleElementNode.class);
73             for (IElement e : diagram.getElements()) {
74                 INode n = e.getHint(ElementHints.KEY_SG_NODE);
75                 if (n != null && (node == n || eNode == n))
76                     return e;
77             }
78         }
79         return null;
80     }
81
82     public static IElement getElement(IG2DNode node) {
83         ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
84         if (ctx == null)
85             return null;
86         return getElement(ctx, node);
87     }
88
89     
90     public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
91         
92         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
93         Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
94
95             @Override
96             public void perform(WriteGraph graph) throws DatabaseException {
97                 DiagramResource DIA = DiagramResource.getInstance(graph);
98                 SimulationResource SIMU = SimulationResource.getInstance(graph);
99                 graph.deny(runtime, DIA.RuntimeDiagram_HasRuntimeProfile);
100                 graph.claim(runtime, DIA.RuntimeDiagram_HasRuntimeProfile, profile);
101                 for(Resource entry : entries)
102                         graph.claim(profile, SIMU.IsActive, entry);
103             }
104             
105         });
106         
107     }
108
109     private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
110         return new ResourceRead<Resource>(diagram) {
111             @Override
112             public Resource perform(ReadGraph graph) throws DatabaseException {
113                 ModelingResources mr = ModelingResources.getInstance(graph);
114                 return graph.getPossibleObject(resource, mr.DiagramToComposite);
115             }
116         };
117     }
118
119     public static ICanvasSceneGraphProvider loadSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
120         Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
121         return loadSceneGraphProviderForComposite(model, composite, diagramRVI);
122     }
123
124     public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
125         // Default timeout is 30s
126         return loadSceneGraphProvider(context, model, diagram, diagramRVI, 30000);
127     }
128
129     public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
130         Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
131         if(composite != null)
132                 return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, timeoutMs);
133         else
134                 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
135     }
136
137     /**
138      * @deprecated this leaks ICanvasSceneGraphProvider, use
139      *             {@link #loadSceneGraphProvider(Resource, Resource, String)}
140      *             instead
141      */
142     public static ICanvasContext loadDiagram(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
143         String modelURI = Simantics.getSession().syncRequest( Queries.uri(model) );
144         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
145         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
146         G2DSceneGraph sg = provider.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
147
148         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
149
150         return cp.getCanvasContext();
151     }
152
153     /**
154      * @deprecated this leaks ICanvasSceneGraphProvider, use
155      *             {@link #loadSceneGraphProvider(ICanvasContext, Resource, Resource, String)}
156      *             instead
157      */
158     public static ICanvasContext loadDiagram(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
159         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
160         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
161         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
162         cp.initializeSceneGraph(context, modelURI, diagramRVI);
163
164         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
165
166         return cp.getCanvasContext();
167     }
168
169     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
170         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
171         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
172         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
173         G2DSceneGraph sg = cp.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
174
175         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
176
177         return cp;
178     }
179
180     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
181         // Default timeout is 30s
182         return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, 30000);
183     }
184
185     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
186         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
187         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
188         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
189         cp.initializeSceneGraph(context, modelURI, diagramRVI);
190         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph(), timeoutMs);
191         return cp;
192     }
193
194     public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
195         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
196         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( diagram, ISceneGraphProvider.class ) );
197         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
198         cp.initializeSceneGraph(context, modelURI, diagramRVI);
199         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
200         return cp;
201     }
202
203     public static IElement findElement(ICanvasContext ctx, Resource element) {
204         
205         IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
206         DataElementMap dmap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
207         return dmap.getElement(diagram, element);
208         
209     }
210
211     public static INode findNode(ICanvasContext ctx, Resource element) {
212         
213         IElement e = findElement(ctx, element);
214         return e.getHint(ElementHints.KEY_SG_NODE);
215         
216     }
217
218     public static Resource getRuntime(ICanvasContext ctx) {
219         
220         IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
221         return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
222         
223     }
224
225     public static Resource getElementResource(Resource configuration) throws DatabaseException {
226         
227         return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {
228
229             @Override
230             public Resource perform(ReadGraph graph) throws DatabaseException {
231                 return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);
232             }
233             
234         });
235         
236     }
237     
238     public static final Set<String> getTexts(Set<TextNode> nodes) {
239         Set<String> result = new HashSet<String>(nodes.size());
240         for(TextNode n : nodes) result.add(n.getText());
241         return result;
242     }
243     
244 }