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.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;
39 * Temporary transitory utils for handling some scene graph <-> g2d
42 * @author Antti Villberg
44 public class DiagramNodeUtil {
46 public static ICanvasContext getCanvasContext(IG2DNode node) {
47 G2DSceneGraph sg = node.getRootNode2D();
50 Component rootPane = sg.getRootPane();
51 if(rootPane == null) {
52 throw new IllegalStateException("No root pane for scenegraph" + sg);
54 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
55 return chassis.getCanvasContext();
58 public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
59 G2DSceneGraph sg = node.getRootNode2D();
62 Component rootPane = sg.getRootPane();
63 if(rootPane == null) {
66 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
67 return chassis.getCanvasContext();
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))
83 public static IElement getElement(IG2DNode node) {
84 ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
87 return getElement(ctx, node);
91 public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
93 VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
94 Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
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);
110 private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
111 return new ResourceRead<Resource>(diagram) {
113 public Resource perform(ReadGraph graph) throws DatabaseException {
114 ModelingResources mr = ModelingResources.getInstance(graph);
115 return graph.getPossibleObject(resource, mr.DiagramToComposite);
120 public static ICanvasSceneGraphProvider loadSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException {
121 Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
122 return loadSceneGraphProviderForComposite(model, composite, diagramRVI);
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);
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);
135 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
139 * @deprecated this leaks ICanvasSceneGraphProvider, use
140 * {@link #loadSceneGraphProvider(Resource, Resource, String)}
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);
149 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
150 Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
152 return cp.getCanvasContext();
155 public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(Resource model, Resource composite, String diagramRVI) throws DatabaseException {
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);
161 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
162 Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
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);
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();
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();
192 public static IElement findElement(ICanvasContext ctx, Resource element) {
194 IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
195 DataElementMap dmap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
196 return dmap.getElement(diagram, element);
200 public static INode findNode(ICanvasContext ctx, Resource element) {
202 IElement e = findElement(ctx, element);
203 return e.getHint(ElementHints.KEY_SG_NODE);
207 public static Resource getRuntime(ICanvasContext ctx) {
209 IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
210 return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
214 public static Resource getElementResource(Resource configuration) throws DatabaseException {
216 return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {
219 public Resource perform(ReadGraph graph) throws DatabaseException {
220 return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);
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());