1 package org.simantics.modeling.ui;
\r
3 import java.util.HashMap;
\r
4 import java.util.Map;
\r
5 import java.util.function.Consumer;
\r
7 import org.eclipse.core.commands.ExecutionEvent;
\r
8 import org.eclipse.jface.dialogs.IDialogSettings;
\r
9 import org.eclipse.jface.resource.ImageDescriptor;
\r
10 import org.eclipse.jface.window.Window;
\r
11 import org.eclipse.swt.widgets.Display;
\r
12 import org.eclipse.swt.widgets.Shell;
\r
13 import org.eclipse.ui.IEditorPart;
\r
14 import org.eclipse.ui.PlatformUI;
\r
15 import org.eclipse.ui.handlers.HandlerUtil;
\r
16 import org.simantics.Simantics;
\r
17 import org.simantics.databoard.Bindings;
\r
18 import org.simantics.databoard.util.URIStringUtils;
\r
19 import org.simantics.db.ReadGraph;
\r
20 import org.simantics.db.Resource;
\r
21 import org.simantics.db.WriteGraph;
\r
22 import org.simantics.db.common.request.ReadRequest;
\r
23 import org.simantics.db.common.request.WriteRequest;
\r
24 import org.simantics.db.exception.DatabaseException;
\r
25 import org.simantics.db.layer0.adapter.Instances;
\r
26 import org.simantics.g2d.canvas.ICanvasContext;
\r
27 import org.simantics.layer0.Layer0;
\r
28 import org.simantics.modeling.ModelingResources;
\r
29 import org.simantics.modeling.ui.diagramEditor.DiagramEditor;
\r
30 import org.simantics.modeling.ui.diagramEditor.DiagramViewer;
\r
31 import org.simantics.ui.workbench.dialogs.ResourceSelectionDialog3;
\r
32 import org.simantics.utils.datastructures.Pair;
\r
34 public class ModelingUIUtils {
\r
36 public static DiagramViewer tryGetDiagramViewer(ExecutionEvent event) {
\r
38 IEditorPart editorPart = HandlerUtil.getActiveEditor(event);
\r
39 if(editorPart == null) return null;
\r
40 if(editorPart instanceof DiagramEditor) {
\r
41 return (DiagramViewer)editorPart.getAdapter(DiagramViewer.class);
\r
48 public static ICanvasContext tryGetCanvasContext(ExecutionEvent event) {
\r
50 DiagramViewer viewer = tryGetDiagramViewer(event);
\r
51 if(viewer != null) return (ICanvasContext)viewer.getAdapter(ICanvasContext.class);
\r
56 protected static void findSCLQueryTypes(ReadGraph graph, Resource indexRoot, Map<Resource, Pair<String, ImageDescriptor>> map) throws DatabaseException {
\r
58 Layer0 L0 = Layer0.getInstance(graph);
\r
59 ModelingResources MOD = ModelingResources.getInstance(graph);
\r
61 Instances query = graph.adapt(MOD.SCLQueryType, Instances.class);
\r
63 String modelURI = graph.getURI(indexRoot);
\r
65 for(Resource _res : query.find(graph, indexRoot)) {
\r
67 // Don't allow instantiation of abstract query types.
\r
68 if (graph.hasStatement(_res, L0.Abstract))
\r
71 Resource res = graph.getPossibleObject(_res, L0.HasRange_Inverse);
\r
76 String name = graph.getPossibleRelatedValue(_res, L0.HasName, Bindings.STRING);
\r
79 String label = graph.getPossibleRelatedValue2(_res, L0.HasLabel, Bindings.STRING);
\r
81 if (label != null && !name.equals(label)) {
\r
82 name = label + " (" + name + ")";
\r
85 Resource parent = graph.getPossibleObject(_res, L0.PartOf);
\r
86 if(parent == null) continue;
\r
88 String parentURI = graph.getURI(parent);
\r
89 if(parentURI.startsWith(modelURI)) {
\r
90 parentURI = parentURI.substring(modelURI.length());
\r
91 if(parentURI.startsWith("/")) parentURI = parentURI.substring(1);
\r
94 name = name + " - " + URIStringUtils.unescape(parentURI);
\r
96 map.put(_res, new Pair<String, ImageDescriptor>(name, null));
\r
102 String name = graph.getPossibleRelatedValue(res, L0.HasName, Bindings.STRING);
\r
105 String label = graph.getPossibleRelatedValue2(res, L0.HasLabel, Bindings.STRING);
\r
107 if (label != null && !name.equals(label)) {
\r
108 name = label + " (" + name + ")";
\r
111 Resource parent = graph.getPossibleObject(_res, L0.PartOf);
\r
112 if(parent == null) continue;
\r
114 String parentURI = graph.getURI(parent);
\r
115 if(parentURI.startsWith(modelURI)) {
\r
116 parentURI = parentURI.substring(modelURI.length());
\r
117 if(parentURI.startsWith("/")) parentURI = parentURI.substring(1);
\r
120 name = name + " - " + URIStringUtils.unescape(parentURI);
\r
122 map.put(_res, new Pair<String, ImageDescriptor>(name, null));
\r
130 public static void queryUserSelectedQueryType(
\r
131 final Map<Resource, Pair<String, ImageDescriptor>> map,
\r
132 final Consumer<Resource> selectionCallback)
\r
134 Display.getDefault().asyncExec(new Runnable() {
\r
136 public void run() {
\r
137 Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
\r
138 ResourceSelectionDialog3<Resource> dialog = new ResourceSelectionDialog3<Resource>(shell, map, "Select query type from list") {
\r
140 protected IDialogSettings getBaseDialogSettings() {
\r
141 return Activator.getDefault().getDialogSettings();
\r
144 if (dialog.open() == Window.OK) {
\r
145 Object[] result = dialog.getResult();
\r
146 if (result != null && result.length == 1) {
\r
147 final Resource res = (Resource)result[0];
\r
148 selectionCallback.accept(res);
\r
155 public static void newSCLQuery(final Resource parent, final Resource indexRoot) throws DatabaseException {
\r
156 if (indexRoot == null)
\r
158 Simantics.getSession().syncRequest(new ReadRequest() {
\r
160 public void run(ReadGraph graph) throws DatabaseException {
\r
162 final Map<Resource, Pair<String, ImageDescriptor>> map = new HashMap<Resource, Pair<String,ImageDescriptor>>();
\r
163 findSCLQueryTypes(graph, indexRoot, map);
\r
164 queryUserSelectedQueryType(map, selected -> {
\r
165 Simantics.getSession().async(new WriteRequest() {
\r
167 public void perform(WriteGraph g) throws DatabaseException {
\r
169 Simantics.applySCL("Simantics/Query", "createSCLQueryDefault", g, parent, selected);
\r