]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/ModelingUIUtils.java
Sync git svn branch with SVN repository r33319.
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / ModelingUIUtils.java
1 package org.simantics.modeling.ui;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.Map;\r
5 import java.util.function.Consumer;\r
6 \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
33 \r
34 public class ModelingUIUtils {\r
35 \r
36     public static DiagramViewer tryGetDiagramViewer(ExecutionEvent event) {\r
37 \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
42         }\r
43         \r
44         return null;\r
45         \r
46     }\r
47     \r
48     public static ICanvasContext tryGetCanvasContext(ExecutionEvent event) {\r
49         \r
50         DiagramViewer viewer = tryGetDiagramViewer(event);\r
51         if(viewer != null) return (ICanvasContext)viewer.getAdapter(ICanvasContext.class);\r
52         else return null;\r
53         \r
54     }\r
55         \r
56         protected static void findSCLQueryTypes(ReadGraph graph, Resource indexRoot, Map<Resource, Pair<String, ImageDescriptor>> map) throws DatabaseException {\r
57 \r
58                 Layer0 L0 = Layer0.getInstance(graph);\r
59                 ModelingResources MOD = ModelingResources.getInstance(graph);\r
60 \r
61                 Instances query = graph.adapt(MOD.SCLQueryType, Instances.class);\r
62 \r
63                 String modelURI = graph.getURI(indexRoot);\r
64                 \r
65                 for(Resource _res : query.find(graph, indexRoot)) {\r
66                         \r
67                         // Don't allow instantiation of abstract query types.\r
68                         if (graph.hasStatement(_res, L0.Abstract))\r
69                                 continue;\r
70 \r
71                         Resource res = graph.getPossibleObject(_res, L0.HasRange_Inverse);\r
72                         if(res == null) {\r
73                                 \r
74                                 // Entry type\r
75 \r
76                                 String name = graph.getPossibleRelatedValue(_res, L0.HasName, Bindings.STRING);\r
77                                 if (name == null)\r
78                                         continue;\r
79                                 String label = graph.getPossibleRelatedValue2(_res, L0.HasLabel, Bindings.STRING);\r
80 \r
81                                 if (label != null && !name.equals(label)) {\r
82                                         name = label + " (" + name + ")";\r
83                                 }\r
84 \r
85                                 Resource parent = graph.getPossibleObject(_res, L0.PartOf);\r
86                                 if(parent == null) continue;\r
87 \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
92                                 }\r
93 \r
94                                 name = name + " - " + URIStringUtils.unescape(parentURI);\r
95 \r
96                                 map.put(_res, new Pair<String, ImageDescriptor>(name, null));\r
97                                 \r
98                         } else {\r
99                                 \r
100                                 // Property type\r
101                         \r
102                                 String name = graph.getPossibleRelatedValue(res, L0.HasName, Bindings.STRING);\r
103                                 if (name == null)\r
104                                         continue;\r
105                                 String label = graph.getPossibleRelatedValue2(res, L0.HasLabel, Bindings.STRING);\r
106 \r
107                                 if (label != null && !name.equals(label)) {\r
108                                         name = label + " (" + name + ")";\r
109                                 }\r
110 \r
111                                 Resource parent = graph.getPossibleObject(_res, L0.PartOf);\r
112                                 if(parent == null) continue;\r
113 \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
118                                 }\r
119 \r
120                                 name = name + " - " + URIStringUtils.unescape(parentURI);\r
121 \r
122                                 map.put(_res, new Pair<String, ImageDescriptor>(name, null));\r
123                         \r
124                         }\r
125                         \r
126                 }\r
127 \r
128         }\r
129         \r
130         public static void queryUserSelectedQueryType(\r
131                         final Map<Resource, Pair<String, ImageDescriptor>> map,\r
132                         final Consumer<Resource> selectionCallback)\r
133         {\r
134                 Display.getDefault().asyncExec(new Runnable() {\r
135                         @Override\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
139                                         @Override\r
140                                         protected IDialogSettings getBaseDialogSettings() {\r
141                                                 return Activator.getDefault().getDialogSettings();\r
142                                         }\r
143                                 };\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
149                                         }\r
150                                 }\r
151                         }\r
152                 });\r
153         }\r
154         \r
155         public static void newSCLQuery(final Resource parent, final Resource indexRoot) throws DatabaseException {\r
156         if (indexRoot == null)\r
157             return;\r
158         Simantics.getSession().syncRequest(new ReadRequest() {\r
159             @Override\r
160             public void run(ReadGraph graph) throws DatabaseException {\r
161                 \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
166                         @Override\r
167                         public void perform(WriteGraph g) throws DatabaseException {\r
168                             g.markUndoPoint();\r
169                             Simantics.applySCL("Simantics/Query", "createSCLQueryDefault", g, parent, selected);\r
170                         }\r
171                     });\r
172                 });\r
173             }\r
174         });\r
175     }\r
176     \r
177 }\r