]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/ModelingUIUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / ModelingUIUtils.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/ModelingUIUtils.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/ModelingUIUtils.java
new file mode 100644 (file)
index 0000000..db434ba
--- /dev/null
@@ -0,0 +1,177 @@
+package org.simantics.modeling.ui;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.function.Consumer;\r
+\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.jface.dialogs.IDialogSettings;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.window.Window;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.handlers.HandlerUtil;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.util.URIStringUtils;\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.ReadRequest;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.Instances;\r
+import org.simantics.g2d.canvas.ICanvasContext;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.modeling.ui.diagramEditor.DiagramEditor;\r
+import org.simantics.modeling.ui.diagramEditor.DiagramViewer;\r
+import org.simantics.ui.workbench.dialogs.ResourceSelectionDialog3;\r
+import org.simantics.utils.datastructures.Pair;\r
+\r
+public class ModelingUIUtils {\r
+\r
+    public static DiagramViewer tryGetDiagramViewer(ExecutionEvent event) {\r
+\r
+       IEditorPart editorPart = HandlerUtil.getActiveEditor(event);\r
+       if(editorPart == null) return null;\r
+       if(editorPart instanceof DiagramEditor) {\r
+               return (DiagramViewer)editorPart.getAdapter(DiagramViewer.class);\r
+       }\r
+       \r
+       return null;\r
+       \r
+    }\r
+    \r
+    public static ICanvasContext tryGetCanvasContext(ExecutionEvent event) {\r
+       \r
+       DiagramViewer viewer = tryGetDiagramViewer(event);\r
+       if(viewer != null) return (ICanvasContext)viewer.getAdapter(ICanvasContext.class);\r
+       else return null;\r
+       \r
+    }\r
+       \r
+       protected static void findSCLQueryTypes(ReadGraph graph, Resource indexRoot, Map<Resource, Pair<String, ImageDescriptor>> map) throws DatabaseException {\r
+\r
+               Layer0 L0 = Layer0.getInstance(graph);\r
+               ModelingResources MOD = ModelingResources.getInstance(graph);\r
+\r
+               Instances query = graph.adapt(MOD.SCLQueryType, Instances.class);\r
+\r
+               String modelURI = graph.getURI(indexRoot);\r
+               \r
+               for(Resource _res : query.find(graph, indexRoot)) {\r
+                       \r
+                       // Don't allow instantiation of abstract query types.\r
+                       if (graph.hasStatement(_res, L0.Abstract))\r
+                               continue;\r
+\r
+                       Resource res = graph.getPossibleObject(_res, L0.HasRange_Inverse);\r
+                       if(res == null) {\r
+                               \r
+                               // Entry type\r
+\r
+                               String name = graph.getPossibleRelatedValue(_res, L0.HasName, Bindings.STRING);\r
+                               if (name == null)\r
+                                       continue;\r
+                               String label = graph.getPossibleRelatedValue2(_res, L0.HasLabel, Bindings.STRING);\r
+\r
+                               if (label != null && !name.equals(label)) {\r
+                                       name = label + " (" + name + ")";\r
+                               }\r
+\r
+                               Resource parent = graph.getPossibleObject(_res, L0.PartOf);\r
+                               if(parent == null) continue;\r
+\r
+                               String parentURI = graph.getURI(parent);\r
+                               if(parentURI.startsWith(modelURI)) {\r
+                                       parentURI = parentURI.substring(modelURI.length());\r
+                                       if(parentURI.startsWith("/")) parentURI = parentURI.substring(1);\r
+                               }\r
+\r
+                               name = name + " - " + URIStringUtils.unescape(parentURI);\r
+\r
+                               map.put(_res, new Pair<String, ImageDescriptor>(name, null));\r
+                               \r
+                       } else {\r
+                               \r
+                               // Property type\r
+                       \r
+                               String name = graph.getPossibleRelatedValue(res, L0.HasName, Bindings.STRING);\r
+                               if (name == null)\r
+                                       continue;\r
+                               String label = graph.getPossibleRelatedValue2(res, L0.HasLabel, Bindings.STRING);\r
+\r
+                               if (label != null && !name.equals(label)) {\r
+                                       name = label + " (" + name + ")";\r
+                               }\r
+\r
+                               Resource parent = graph.getPossibleObject(_res, L0.PartOf);\r
+                               if(parent == null) continue;\r
+\r
+                               String parentURI = graph.getURI(parent);\r
+                               if(parentURI.startsWith(modelURI)) {\r
+                                       parentURI = parentURI.substring(modelURI.length());\r
+                                       if(parentURI.startsWith("/")) parentURI = parentURI.substring(1);\r
+                               }\r
+\r
+                               name = name + " - " + URIStringUtils.unescape(parentURI);\r
+\r
+                               map.put(_res, new Pair<String, ImageDescriptor>(name, null));\r
+                       \r
+                       }\r
+                       \r
+               }\r
+\r
+       }\r
+       \r
+       public static void queryUserSelectedQueryType(\r
+                       final Map<Resource, Pair<String, ImageDescriptor>> map,\r
+                       final Consumer<Resource> selectionCallback)\r
+       {\r
+               Display.getDefault().asyncExec(new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();\r
+                               ResourceSelectionDialog3<Resource> dialog = new ResourceSelectionDialog3<Resource>(shell, map, "Select query type from list") {\r
+                                       @Override\r
+                                       protected IDialogSettings getBaseDialogSettings() {\r
+                                               return Activator.getDefault().getDialogSettings();\r
+                                       }\r
+                               };\r
+                               if (dialog.open() == Window.OK) {\r
+                                       Object[] result = dialog.getResult();\r
+                                       if (result != null && result.length == 1) {\r
+                                               final Resource res = (Resource)result[0];\r
+                                               selectionCallback.accept(res);\r
+                                       }\r
+                               }\r
+                       }\r
+               });\r
+       }\r
+       \r
+       public static void newSCLQuery(final Resource parent, final Resource indexRoot) throws DatabaseException {\r
+        if (indexRoot == null)\r
+            return;\r
+        Simantics.getSession().syncRequest(new ReadRequest() {\r
+            @Override\r
+            public void run(ReadGraph graph) throws DatabaseException {\r
+                \r
+                final Map<Resource, Pair<String, ImageDescriptor>> map = new HashMap<Resource, Pair<String,ImageDescriptor>>();\r
+                findSCLQueryTypes(graph, indexRoot, map);\r
+                queryUserSelectedQueryType(map, selected -> {\r
+                    Simantics.getSession().async(new WriteRequest() {\r
+                        @Override\r
+                        public void perform(WriteGraph g) throws DatabaseException {\r
+                            g.markUndoPoint();\r
+                            Simantics.applySCL("Simantics/Query", "createSCLQueryDefault", g, parent, selected);\r
+                        }\r
+                    });\r
+                });\r
+            }\r
+        });\r
+    }\r
+    \r
+}\r