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