]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/DiagramNodeUtil.java
Support selection of experiment run for scene graph provider
[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.layer0.variable.Variable;
17 import org.simantics.db.request.Read;
18 import org.simantics.db.service.TransactionSupport;
19 import org.simantics.db.service.VirtualGraphSupport;
20 import org.simantics.diagram.stubs.DiagramResource;
21 import org.simantics.diagram.ui.DiagramModelHints;
22 import org.simantics.g2d.canvas.ICanvasContext;
23 import org.simantics.g2d.chassis.AWTChassis;
24 import org.simantics.g2d.diagram.DiagramHints;
25 import org.simantics.g2d.diagram.IDiagram;
26 import org.simantics.g2d.diagram.handler.DataElementMap;
27 import org.simantics.g2d.element.ElementHints;
28 import org.simantics.g2d.element.IElement;
29 import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;
30 import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider2;
31 import org.simantics.modeling.ModelingResources;
32 import org.simantics.scenegraph.INode;
33 import org.simantics.scenegraph.adapters.ISceneGraphProvider;
34 import org.simantics.scenegraph.g2d.G2DSceneGraph;
35 import org.simantics.scenegraph.g2d.IG2DNode;
36 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
37 import org.simantics.scenegraph.utils.NodeUtil;
38 import org.simantics.simulation.ontology.SimulationResource;
39
40 /**
41  * Temporary transitory utils for handling some scene graph <-> g2d
42  * interactions.
43  * 
44  * @author Antti Villberg
45  */
46 public class DiagramNodeUtil {
47
48     public static ICanvasContext getCanvasContext(IG2DNode node) {
49         G2DSceneGraph sg = node.getRootNode2D();
50         if (sg == null)
51             return null;
52         Component rootPane = sg.getRootPane();
53         if(rootPane == null) {
54                 throw new IllegalStateException("No root pane for scenegraph" + sg);
55         }
56         AWTChassis chassis = (AWTChassis)(rootPane.getParent());
57         return chassis.getCanvasContext();
58     }
59
60     public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
61         G2DSceneGraph sg = node.getRootNode2D();
62         if (sg == null)
63             return null;
64         Component rootPane = sg.getRootPane();
65         if(rootPane == null) {
66                 return null;
67         }
68         AWTChassis chassis = (AWTChassis)(rootPane.getParent());
69         return chassis.getCanvasContext();
70     }
71
72     public static IElement getElement(ICanvasContext ctx, IG2DNode node) {
73         IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
74         if (diagram != null) {
75             SingleElementNode eNode = NodeUtil.findNearestParentNode(node, SingleElementNode.class);
76             for (IElement e : diagram.getElements()) {
77                 INode n = e.getHint(ElementHints.KEY_SG_NODE);
78                 if (n != null && (node == n || eNode == n))
79                     return e;
80             }
81         }
82         return null;
83     }
84
85     public static IElement getElement(IG2DNode node) {
86         ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
87         if (ctx == null)
88             return null;
89         return getElement(ctx, node);
90     }
91
92     
93     public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
94         
95         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
96         Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
97
98             @Override
99             public void perform(WriteGraph graph) throws DatabaseException {
100                 DiagramResource DIA = DiagramResource.getInstance(graph);
101                 SimulationResource SIMU = SimulationResource.getInstance(graph);
102                 graph.deny(runtime, DIA.RuntimeDiagram_HasRuntimeProfile);
103                 graph.claim(runtime, DIA.RuntimeDiagram_HasRuntimeProfile, profile);
104                 for(Resource entry : entries)
105                         graph.claim(profile, SIMU.IsActive, entry);
106             }
107             
108         });
109         
110     }
111
112     private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
113         return new ResourceRead<Resource>(diagram) {
114             @Override
115             public Resource perform(ReadGraph graph) throws DatabaseException {
116                 ModelingResources mr = ModelingResources.getInstance(graph);
117                 return graph.getPossibleObject(resource, mr.DiagramToComposite);
118             }
119         };
120     }
121
122     public static ICanvasSceneGraphProvider loadSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException {
123         Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
124         return loadSceneGraphProviderForComposite(model, composite, diagramRVI);
125     }
126
127     public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
128         // Default timeout is 30s
129         return loadSceneGraphProvider(context, model, diagram, diagramRVI, 30000);
130     }
131
132     public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
133         Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
134         if(composite != null)
135                 return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, timeoutMs);
136         else
137                 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
138     }
139
140     /**
141      * @deprecated this leaks ICanvasSceneGraphProvider, use
142      *             {@link #loadSceneGraphProvider(Resource, Resource, String)}
143      *             instead
144      */
145     public static ICanvasContext loadDiagram(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
146         String modelURI = Simantics.getSession().syncRequest( Queries.uri(model) );
147         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
148         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
149         G2DSceneGraph sg = provider.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
150
151         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
152         Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
153
154         return cp.getCanvasContext();
155     }
156
157     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(Resource model, Resource composite, String diagramRVI) throws DatabaseException {
158         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
159         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
160         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
161         G2DSceneGraph sg = cp.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
162
163         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
164         Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
165
166         return cp;
167     }
168
169     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
170         // Default timeout is 30s
171         return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, 30000);
172     }
173
174     public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
175         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
176         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
177         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
178         cp.initializeSceneGraph(context, modelURI, diagramRVI);
179         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph(), timeoutMs);
180         Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
181         return cp;
182     }
183
184     public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
185         return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI, null);
186     }
187
188     public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI, Variable run) throws DatabaseException, InterruptedException {
189         String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
190         ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( diagram, ISceneGraphProvider.class ) );
191         ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
192         if(cp instanceof ICanvasSceneGraphProvider2) {
193             ((ICanvasSceneGraphProvider2)cp).initializeSceneGraph(context, modelURI, diagramRVI, run);
194             
195         } else {
196             cp.initializeSceneGraph(context, modelURI, diagramRVI);
197         }
198         NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
199         Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
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 }