1 package org.simantics.diagram.elements;
\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
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
38 * Temporary transitory utils for handling some scene graph <-> g2d
\r
41 * @author Antti Villberg
\r
43 public class DiagramNodeUtil {
\r
45 public static ICanvasContext getCanvasContext(IG2DNode node) {
\r
46 G2DSceneGraph sg = NodeUtil.getPossibleRootNode(node);
\r
49 Component rootPane = sg.getRootPane();
\r
50 if(rootPane == null) {
\r
51 throw new IllegalStateException("No root pane for scenegraph" + sg);
\r
53 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
\r
54 return chassis.getCanvasContext();
\r
57 public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
\r
58 G2DSceneGraph sg = NodeUtil.getPossibleRootNode(node);
\r
61 Component rootPane = sg.getRootPane();
\r
62 if(rootPane == null) {
\r
65 AWTChassis chassis = (AWTChassis)(rootPane.getParent());
\r
66 return chassis.getCanvasContext();
\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
82 public static IElement getElement(IG2DNode node) {
\r
83 ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
\r
86 return getElement(ctx, node);
\r
90 public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
\r
92 VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
\r
93 Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
\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
109 private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
\r
110 return new ResourceRead<Resource>(diagram) {
\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
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
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
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
134 return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
\r
138 * @deprecated this leaks ICanvasSceneGraphProvider, use
\r
139 * {@link #loadSceneGraphProvider(Resource, Resource, String)}
\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
148 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
\r
150 return cp.getCanvasContext();
\r
154 * @deprecated this leaks ICanvasSceneGraphProvider, use
\r
155 * {@link #loadSceneGraphProvider(ICanvasContext, Resource, Resource, String)}
\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
164 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
\r
166 return cp.getCanvasContext();
\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
175 NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
\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
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
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
203 public static IElement findElement(ICanvasContext ctx, Resource element) {
\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
211 public static INode findNode(ICanvasContext ctx, Resource element) {
\r
213 IElement e = findElement(ctx, element);
\r
214 return e.getHint(ElementHints.KEY_SG_NODE);
\r
218 public static Resource getRuntime(ICanvasContext ctx) {
\r
220 IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
\r
221 return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
\r
225 public static Resource getElementResource(Resource configuration) throws DatabaseException {
\r
227 return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {
\r
230 public Resource perform(ReadGraph graph) throws DatabaseException {
\r
231 return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);
\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