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