1 package org.simantics.diagram.elements;
3 import java.awt.Component;
4 import java.util.Collection;
5 import java.util.HashSet;
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;
41 * Temporary transitory utils for handling some scene graph <-> g2d
44 * @author Antti Villberg
46 public class DiagramNodeUtil {
48 public static ICanvasContext getCanvasContext(IG2DNode node) {
49 G2DSceneGraph sg = node.getRootNode2D();
52 Component rootPane = sg.getRootPane();
53 if(rootPane == null) {
54 throw new IllegalStateException("No root pane for scenegraph" + sg);
56 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
57 return chassis.getCanvasContext();
60 public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
61 G2DSceneGraph sg = node.getRootNode2D();
64 Component rootPane = sg.getRootPane();
65 if(rootPane == null) {
68 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
69 return chassis.getCanvasContext();
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))
85 public static IElement getElement(IG2DNode node) {
86 ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
89 return getElement(ctx, node);
93 public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
95 VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
96 Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
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);
112 private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
113 return new ResourceRead<Resource>(diagram) {
115 public Resource perform(ReadGraph graph) throws DatabaseException {
116 ModelingResources mr = ModelingResources.getInstance(graph);
117 return graph.getPossibleObject(resource, mr.DiagramToComposite);
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);
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);
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);
137 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
141 * @deprecated this leaks ICanvasSceneGraphProvider, use
142 * {@link #loadSceneGraphProvider(Resource, Resource, String)}
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);
151 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
152 Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
154 return cp.getCanvasContext();
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);
163 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
164 Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
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);
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();
184 public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
185 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI, null);
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);
196 cp.initializeSceneGraph(context, modelURI, diagramRVI);
198 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
199 Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
203 public static IElement findElement(ICanvasContext ctx, Resource element) {
205 IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
206 DataElementMap dmap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
207 return dmap.getElement(diagram, element);
211 public static INode findNode(ICanvasContext ctx, Resource element) {
213 IElement e = findElement(ctx, element);
214 return e.getHint(ElementHints.KEY_SG_NODE);
218 public static Resource getRuntime(ICanvasContext ctx) {
220 IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
221 return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
225 public static Resource getElementResource(Resource configuration) throws DatabaseException {
227 return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {
230 public Resource perform(ReadGraph graph) throws DatabaseException {
231 return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);
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());