]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/DiagramNodeUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / DiagramNodeUtil.java
diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/elements/DiagramNodeUtil.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/elements/DiagramNodeUtil.java
new file mode 100644 (file)
index 0000000..8e6a2f9
--- /dev/null
@@ -0,0 +1,244 @@
+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