-package org.simantics.diagram.elements;\r
-\r
-import java.awt.Component;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import org.simantics.Simantics;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.request.Queries;\r
-import org.simantics.db.common.request.ResourceRead;\r
-import org.simantics.db.common.request.WriteRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.db.service.VirtualGraphSupport;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-import org.simantics.diagram.ui.DiagramModelHints;\r
-import org.simantics.g2d.canvas.ICanvasContext;\r
-import org.simantics.g2d.chassis.AWTChassis;\r
-import org.simantics.g2d.diagram.DiagramHints;\r
-import org.simantics.g2d.diagram.IDiagram;\r
-import org.simantics.g2d.diagram.handler.DataElementMap;\r
-import org.simantics.g2d.element.ElementHints;\r
-import org.simantics.g2d.element.IElement;\r
-import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.scenegraph.INode;\r
-import org.simantics.scenegraph.adapters.ISceneGraphProvider;\r
-import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
-import org.simantics.scenegraph.g2d.IG2DNode;\r
-import org.simantics.scenegraph.g2d.nodes.SingleElementNode;\r
-import org.simantics.scenegraph.utils.NodeUtil;\r
-import org.simantics.simulation.ontology.SimulationResource;\r
-\r
-/**\r
- * Temporary transitory utils for handling some scene graph <-> g2d\r
- * interactions.\r
- * \r
- * @author Antti Villberg\r
- */\r
-public class DiagramNodeUtil {\r
-\r
- public static ICanvasContext getCanvasContext(IG2DNode node) {\r
- G2DSceneGraph sg = NodeUtil.getPossibleRootNode(node);\r
- if (sg == null)\r
- return null;\r
- Component rootPane = sg.getRootPane();\r
- if(rootPane == null) {\r
- throw new IllegalStateException("No root pane for scenegraph" + sg);\r
- }\r
- AWTChassis chassis = (AWTChassis)(rootPane.getParent());\r
- return chassis.getCanvasContext();\r
- }\r
-\r
- public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {\r
- G2DSceneGraph sg = NodeUtil.getPossibleRootNode(node);\r
- if (sg == null)\r
- return null;\r
- Component rootPane = sg.getRootPane();\r
- if(rootPane == null) {\r
- return null;\r
- }\r
- AWTChassis chassis = (AWTChassis)(rootPane.getParent());\r
- return chassis.getCanvasContext();\r
- }\r
-\r
- public static IElement getElement(ICanvasContext ctx, IG2DNode node) {\r
- IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);\r
- if (diagram != null) {\r
- SingleElementNode eNode = NodeUtil.findNearestParentNode(node, SingleElementNode.class);\r
- for (IElement e : diagram.getElements()) {\r
- INode n = e.getHint(ElementHints.KEY_SG_NODE);\r
- if (n != null && (node == n || eNode == n))\r
- return e;\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- public static IElement getElement(IG2DNode node) {\r
- ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);\r
- if (ctx == null)\r
- return null;\r
- return getElement(ctx, node);\r
- }\r
-\r
- \r
- public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {\r
- \r
- VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
- Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {\r
-\r
- @Override\r
- public void perform(WriteGraph graph) throws DatabaseException {\r
- DiagramResource DIA = DiagramResource.getInstance(graph);\r
- SimulationResource SIMU = SimulationResource.getInstance(graph);\r
- graph.deny(runtime, DIA.RuntimeDiagram_HasRuntimeProfile);\r
- graph.claim(runtime, DIA.RuntimeDiagram_HasRuntimeProfile, profile);\r
- for(Resource entry : entries)\r
- graph.claim(profile, SIMU.IsActive, entry);\r
- }\r
- \r
- });\r
- \r
- }\r
-\r
- private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {\r
- return new ResourceRead<Resource>(diagram) {\r
- @Override\r
- public Resource perform(ReadGraph graph) throws DatabaseException {\r
- ModelingResources mr = ModelingResources.getInstance(graph);\r
- return graph.getPossibleObject(resource, mr.DiagramToComposite);\r
- }\r
- };\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {\r
- Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );\r
- return loadSceneGraphProviderForComposite(model, composite, diagramRVI);\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {\r
- // Default timeout is 30s\r
- return loadSceneGraphProvider(context, model, diagram, diagramRVI, 30000);\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {\r
- Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );\r
- if(composite != null)\r
- return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, timeoutMs);\r
- else\r
- return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);\r
- }\r
-\r
- /**\r
- * @deprecated this leaks ICanvasSceneGraphProvider, use\r
- * {@link #loadSceneGraphProvider(Resource, Resource, String)}\r
- * instead\r
- */\r
- public static ICanvasContext loadDiagram(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {\r
- String modelURI = Simantics.getSession().syncRequest( Queries.uri(model) );\r
- ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );\r
- ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;\r
- G2DSceneGraph sg = provider.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);\r
-\r
- NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);\r
-\r
- return cp.getCanvasContext();\r
- }\r
-\r
- /**\r
- * @deprecated this leaks ICanvasSceneGraphProvider, use\r
- * {@link #loadSceneGraphProvider(ICanvasContext, Resource, Resource, String)}\r
- * instead\r
- */\r
- public static ICanvasContext loadDiagram(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {\r
- String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));\r
- ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );\r
- ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;\r
- cp.initializeSceneGraph(context, modelURI, diagramRVI);\r
-\r
- NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());\r
-\r
- return cp.getCanvasContext();\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {\r
- String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));\r
- ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );\r
- ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;\r
- G2DSceneGraph sg = cp.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);\r
-\r
- NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);\r
-\r
- return cp;\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {\r
- // Default timeout is 30s\r
- return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, 30000);\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {\r
- String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));\r
- ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );\r
- ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;\r
- cp.initializeSceneGraph(context, modelURI, diagramRVI);\r
- NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph(), timeoutMs);\r
- return cp;\r
- }\r
-\r
- public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {\r
- String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));\r
- ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( diagram, ISceneGraphProvider.class ) );\r
- ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;\r
- cp.initializeSceneGraph(context, modelURI, diagramRVI);\r
- NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());\r
- return cp;\r
- }\r
-\r
- public static IElement findElement(ICanvasContext ctx, Resource element) {\r
- \r
- IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);\r
- DataElementMap dmap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);\r
- return dmap.getElement(diagram, element);\r
- \r
- }\r
-\r
- public static INode findNode(ICanvasContext ctx, Resource element) {\r
- \r
- IElement e = findElement(ctx, element);\r
- return e.getHint(ElementHints.KEY_SG_NODE);\r
- \r
- }\r
-\r
- public static Resource getRuntime(ICanvasContext ctx) {\r
- \r
- IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);\r
- return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);\r
- \r
- }\r
-\r
- public static Resource getElementResource(Resource configuration) throws DatabaseException {\r
- \r
- return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {\r
-\r
- @Override\r
- public Resource perform(ReadGraph graph) throws DatabaseException {\r
- return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);\r
- }\r
- \r
- });\r
- \r
- }\r
- \r
- public static final Set<String> getTexts(Set<TextNode> nodes) {\r
- Set<String> result = new HashSet<String>();\r
- for(TextNode n : nodes) result.add(n.getText());\r
- return result;\r
- }\r
- \r
-}\r
+package org.simantics.diagram.elements;
+
+import java.awt.Component;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.simantics.Simantics;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.Queries;
+import org.simantics.db.common.request.ResourceRead;
+import org.simantics.db.common.request.WriteRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.request.Read;
+import org.simantics.db.service.TransactionSupport;
+import org.simantics.db.service.VirtualGraphSupport;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.diagram.ui.DiagramModelHints;
+import org.simantics.g2d.canvas.ICanvasContext;
+import org.simantics.g2d.chassis.AWTChassis;
+import org.simantics.g2d.diagram.DiagramHints;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.diagram.handler.DataElementMap;
+import org.simantics.g2d.element.ElementHints;
+import org.simantics.g2d.element.IElement;
+import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.scenegraph.INode;
+import org.simantics.scenegraph.adapters.ISceneGraphProvider;
+import org.simantics.scenegraph.g2d.G2DSceneGraph;
+import org.simantics.scenegraph.g2d.IG2DNode;
+import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
+import org.simantics.scenegraph.utils.NodeUtil;
+import org.simantics.simulation.ontology.SimulationResource;
+
+/**
+ * Temporary transitory utils for handling some scene graph <-> g2d
+ * interactions.
+ *
+ * @author Antti Villberg
+ */
+public class DiagramNodeUtil {
+
+ public static ICanvasContext getCanvasContext(IG2DNode node) {
+ G2DSceneGraph sg = node.getRootNode2D();
+ if (sg == null)
+ return null;
+ Component rootPane = sg.getRootPane();
+ if(rootPane == null) {
+ throw new IllegalStateException("No root pane for scenegraph" + sg);
+ }
+ AWTChassis chassis = (AWTChassis)(rootPane.getParent());
+ return chassis.getCanvasContext();
+ }
+
+ public static ICanvasContext getPossibleCanvasContext(IG2DNode node) {
+ G2DSceneGraph sg = node.getRootNode2D();
+ if (sg == null)
+ return null;
+ Component rootPane = sg.getRootPane();
+ if(rootPane == null) {
+ return null;
+ }
+ AWTChassis chassis = (AWTChassis)(rootPane.getParent());
+ return chassis.getCanvasContext();
+ }
+
+ public static IElement getElement(ICanvasContext ctx, IG2DNode node) {
+ IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
+ if (diagram != null) {
+ SingleElementNode eNode = NodeUtil.findNearestParentNode(node, SingleElementNode.class);
+ for (IElement e : diagram.getElements()) {
+ INode n = e.getHint(ElementHints.KEY_SG_NODE);
+ if (n != null && (node == n || eNode == n))
+ return e;
+ }
+ }
+ return null;
+ }
+
+ public static IElement getElement(IG2DNode node) {
+ ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(node);
+ if (ctx == null)
+ return null;
+ return getElement(ctx, node);
+ }
+
+
+ public static void activateProfileWithEntries(final Resource runtime, final Resource profile, final Collection<Resource> entries) throws DatabaseException {
+
+ VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
+ Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {
+
+ @Override
+ public void perform(WriteGraph graph) throws DatabaseException {
+ DiagramResource DIA = DiagramResource.getInstance(graph);
+ SimulationResource SIMU = SimulationResource.getInstance(graph);
+ graph.deny(runtime, DIA.RuntimeDiagram_HasRuntimeProfile);
+ graph.claim(runtime, DIA.RuntimeDiagram_HasRuntimeProfile, profile);
+ for(Resource entry : entries)
+ graph.claim(profile, SIMU.IsActive, entry);
+ }
+
+ });
+
+ }
+
+ private static Read<Resource> diagramToComposite(Resource diagram) throws DatabaseException {
+ return new ResourceRead<Resource>(diagram) {
+ @Override
+ public Resource perform(ReadGraph graph) throws DatabaseException {
+ ModelingResources mr = ModelingResources.getInstance(graph);
+ return graph.getPossibleObject(resource, mr.DiagramToComposite);
+ }
+ };
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException {
+ Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
+ return loadSceneGraphProviderForComposite(model, composite, diagramRVI);
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
+ // Default timeout is 30s
+ return loadSceneGraphProvider(context, model, diagram, diagramRVI, 30000);
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProvider(ICanvasContext context, Resource model, Resource diagram, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
+ Resource composite = Simantics.getSession().syncRequest( diagramToComposite(diagram) );
+ if(composite != null)
+ return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, timeoutMs);
+ else
+ return loadSceneGraphProviderForDiagram(context, model, diagram, diagramRVI);
+ }
+
+ /**
+ * @deprecated this leaks ICanvasSceneGraphProvider, use
+ * {@link #loadSceneGraphProvider(Resource, Resource, String)}
+ * instead
+ */
+ public static ICanvasContext loadDiagram(Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
+ String modelURI = Simantics.getSession().syncRequest( Queries.uri(model) );
+ ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
+ ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
+ G2DSceneGraph sg = provider.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
+
+ NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
+ Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
+
+ return cp.getCanvasContext();
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(Resource model, Resource composite, String diagramRVI) throws DatabaseException {
+ String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
+ ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
+ ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
+ G2DSceneGraph sg = cp.initializeSceneGraph(new G2DSceneGraph(), modelURI, diagramRVI);
+
+ NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), sg);
+ Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
+
+ return cp;
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI) throws DatabaseException, InterruptedException {
+ // Default timeout is 30s
+ return loadSceneGraphProviderForComposite(context, model, composite, diagramRVI, 30000);
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProviderForComposite(ICanvasContext context, Resource model, Resource composite, String diagramRVI, int timeoutMs) throws DatabaseException, InterruptedException {
+ String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
+ ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( composite, ISceneGraphProvider.class ) );
+ ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
+ cp.initializeSceneGraph(context, modelURI, diagramRVI);
+ NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph(), timeoutMs);
+ Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
+ return cp;
+ }
+
+ public static ICanvasSceneGraphProvider loadSceneGraphProviderForDiagram(ICanvasContext context, Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
+ String modelURI = Simantics.getSession().syncRequest(Queries.uri(model));
+ ISceneGraphProvider provider = Simantics.getSession().syncRequest( Queries.adapt( diagram, ISceneGraphProvider.class ) );
+ ICanvasSceneGraphProvider cp = (ICanvasSceneGraphProvider) provider;
+ cp.initializeSceneGraph(context, modelURI, diagramRVI);
+ NodeUtil.waitPending(cp.getCanvasContext().getThreadAccess(), context.getSceneGraph());
+ Simantics.getSession().getService(TransactionSupport.class).waitCompletion();
+ return cp;
+ }
+
+ public static IElement findElement(ICanvasContext ctx, Resource element) {
+
+ IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
+ DataElementMap dmap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
+ return dmap.getElement(diagram, element);
+
+ }
+
+ public static INode findNode(ICanvasContext ctx, Resource element) {
+
+ IElement e = findElement(ctx, element);
+ return e.getHint(ElementHints.KEY_SG_NODE);
+
+ }
+
+ public static Resource getRuntime(ICanvasContext ctx) {
+
+ IDiagram diagram = ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
+ return diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
+
+ }
+
+ public static Resource getElementResource(Resource configuration) throws DatabaseException {
+
+ return Simantics.getSession().syncRequest(new ResourceRead<Resource>(configuration) {
+
+ @Override
+ public Resource perform(ReadGraph graph) throws DatabaseException {
+ return graph.getPossibleObject(resource, ModelingResources.getInstance(graph).ComponentToElement);
+ }
+
+ });
+
+ }
+
+ public static final Set<String> getTexts(Set<TextNode> nodes) {
+ Set<String> result = new HashSet<String>(nodes.size());
+ for(TextNode n : nodes) result.add(n.getText());
+ return result;
+ }
+
+}