--- /dev/null
+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