]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram.profile/src/org/simantics/diagram/profile/function/All.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram.profile / src / org / simantics / diagram / profile / function / All.java
1 package org.simantics.diagram.profile.function;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.Collections;\r
6 import java.util.HashSet;\r
7 import java.util.List;\r
8 import java.util.Set;\r
9 import java.util.TreeMap;\r
10 \r
11 import org.eclipse.swt.SWT;\r
12 import org.eclipse.swt.widgets.Event;\r
13 import org.eclipse.swt.widgets.Tree;\r
14 import org.eclipse.swt.widgets.TreeItem;\r
15 import org.simantics.Simantics;\r
16 import org.simantics.browsing.ui.BuiltinKeys;\r
17 import org.simantics.browsing.ui.GraphExplorer;\r
18 import org.simantics.browsing.ui.NodeContext;\r
19 import org.simantics.databoard.Bindings;\r
20 import org.simantics.db.ReadGraph;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.WriteGraph;\r
23 import org.simantics.db.common.request.WriteRequest;\r
24 import org.simantics.db.common.utils.ListUtils;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.db.layer0.adapter.Instances;\r
27 import org.simantics.db.layer0.variable.Variable;\r
28 import org.simantics.db.service.VirtualGraphSupport;\r
29 import org.simantics.diagram.profile.view.ResourcePair;\r
30 import org.simantics.diagram.stubs.DiagramResource;\r
31 import org.simantics.layer0.Layer0;\r
32 import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;\r
33 import org.simantics.scenegraph.profile.ProfileUtils;\r
34 import org.simantics.scl.reflection.annotations.SCLValue;\r
35 import org.simantics.scl.runtime.function.FunctionImpl1;\r
36 import org.simantics.scl.runtime.tuple.Tuple;\r
37 import org.simantics.scl.runtime.tuple.Tuple2;\r
38 import org.simantics.simulation.ontology.SimulationResource;\r
39 import org.simantics.utils.strings.StringUtils;\r
40 \r
41 public class All {\r
42 \r
43     @SCLValue(type = "ReadGraph -> Resource -> Resource -> [Resource]")\r
44     public static List<Resource> profileChildren(ReadGraph graph, Resource resource, Resource context) throws DatabaseException {\r
45         Layer0 L0 = Layer0.getInstance(graph);\r
46         List<Resource> listedChildren = ListUtils.toList(graph, context);\r
47         if(listedChildren.isEmpty()) {\r
48                 DiagramResource DIA = DiagramResource.getInstance(graph);\r
49                 TreeMap<Double,Resource> priorityChildren = new TreeMap<Double,Resource>();\r
50                 for(Resource child : graph.getObjects(context, L0.IsComposedOf)) {\r
51                         Double p = graph.getPossibleRelatedValue(child, DIA.Profile_priority, Bindings.DOUBLE);\r
52                         if(p != null)\r
53                                 priorityChildren.put(p, child);\r
54                 }\r
55                         return new ArrayList<Resource>(priorityChildren.values());\r
56         } else {\r
57                 return listedChildren;\r
58         }\r
59     }\r
60 \r
61     @SCLValue(type = "ReadGraph -> Resource -> Variable -> [(String, Resource)]")\r
62     public static List<Tuple> availableProfiles(ReadGraph graph, Resource resource, Variable context) throws DatabaseException {\r
63         \r
64         Resource runtimeDiagram = ScenegraphLoaderUtils.getPossibleResourceSelection(graph, context);\r
65         if(runtimeDiagram == null) return Collections.emptyList();\r
66 \r
67         Layer0 L0 = Layer0.getInstance(graph);\r
68         DiagramResource DIA = DiagramResource.getInstance(graph);\r
69 \r
70         String modelURI = graph.getPossibleRelatedValue(runtimeDiagram, DIA.RuntimeDiagram_HasModelURI);\r
71         if (modelURI == null)\r
72             return Collections.emptyList();\r
73 \r
74         Resource model = graph.getPossibleResource(modelURI);\r
75         if (model == null)\r
76             return Collections.emptyList();\r
77 \r
78         Instances query = graph.adapt(DIA.Profile, Instances.class);\r
79 \r
80         ArrayList<Tuple> result = new ArrayList<Tuple>();\r
81         for(Resource profile : query.find(graph, model)) {\r
82             if(!graph.hasStatement(profile, L0.Abstract)) {\r
83                 String name = graph.getRelatedValue(profile, L0.HasName, Bindings.STRING);\r
84                 result.add(new Tuple2(name, profile));\r
85             }\r
86         }\r
87         return result;\r
88         \r
89     }\r
90 \r
91     @SCLValue(type = "ReadGraph -> Resource -> Variable -> b")\r
92     public static Object profileEntrySelected(ReadGraph graph, Resource resource, Variable context) throws DatabaseException {\r
93         \r
94         return new FunctionImpl1<Object, Boolean>() {\r
95 \r
96                 public void processRecursively(WriteGraph graph, Resource runtimeProfile, Resource entry, boolean checked) throws DatabaseException {\r
97 \r
98                 DiagramResource DIA = DiagramResource.getInstance(graph);\r
99                         \r
100                 if(graph.isInstanceOf(entry, DIA.Profile)) {\r
101                         Set<Resource> singleSelGroups = new HashSet<Resource>();\r
102                         \r
103                         for(Resource child : ProfileUtils.getProfileChildren(graph, entry)) {\r
104                                 if(checked && graph.isInstanceOf(child, DIA.ProfileEntry)) {\r
105                                         //enable only one item from single selection groups.\r
106                                         Resource group = graph.getPossibleObject(child, DIA.ProfileEntry_HasGroup);\r
107                                 if (group != null && graph.isInstanceOf(group, DIA.SingleSelectionGroup)) {\r
108                                         if (singleSelGroups.contains(group))\r
109                                                 continue;\r
110                                         singleSelGroups.add(group);\r
111                                 }\r
112                                 }\r
113                                 processRecursively(graph, runtimeProfile, child, checked);\r
114                         }\r
115                         \r
116                 } else if(graph.isInstanceOf(entry, DIA.ProfileEntry)) {\r
117                         Resource group = graph.getPossibleObject(entry, DIA.ProfileEntry_HasGroup);\r
118                         if (group != null && graph.isInstanceOf(group, DIA.SingleSelectionGroup)) {\r
119                                  if(checked) {\r
120                                          //enable selected item from single selection groups, disable the rest.\r
121                                          Collection<Resource> entries = graph.getObjects(group, DIA.ProfileEntry_HasGroup_Inverse);\r
122                                          for (Resource e : entries) {\r
123                                                  graph.denyStatement(runtimeProfile, SimulationResource.getInstance(graph).IsActive, e);\r
124                                          }\r
125                                          graph.claim(runtimeProfile, SimulationResource.getInstance(graph).IsActive, null, entry);\r
126                                  } else {\r
127                                          graph.denyStatement(runtimeProfile, SimulationResource.getInstance(graph).IsActive, entry);\r
128                                  }\r
129                         } else {\r
130                                     if(checked) {\r
131                                         graph.claim(runtimeProfile, SimulationResource.getInstance(graph).IsActive, null, entry);\r
132                                     } else {\r
133                                         graph.denyStatement(runtimeProfile, SimulationResource.getInstance(graph).IsActive, entry);\r
134                                     }\r
135                         }\r
136 \r
137                         }\r
138                         \r
139                 }\r
140                 \r
141             @Override\r
142             public Boolean apply(Object _event) {\r
143                 \r
144                 Event event = (Event)_event;\r
145                 \r
146                 if(event.detail == SWT.CHECK) {\r
147                         \r
148                     final TreeItem item = (TreeItem)event.item;\r
149                     Tree tree = item.getParent();\r
150                     GraphExplorer explorer = (GraphExplorer)tree.getData("GraphExplorer");\r
151                     final Resource runtimeDiagram = (Resource)explorer.getRoot().getConstant(BuiltinKeys.INPUT);\r
152                     final boolean checked = item.getChecked();\r
153                     NodeContext context = (NodeContext)item.getData();\r
154                     final ResourcePair entry = (ResourcePair)context.getConstant(BuiltinKeys.INPUT);\r
155                     try {\r
156                         \r
157                         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
158                         Simantics.getSession().syncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {\r
159 \r
160                             @Override\r
161                             public void perform(WriteGraph graph) throws DatabaseException {\r
162                                 \r
163                                 DiagramResource DIA = DiagramResource.getInstance(graph);\r
164                                 Resource runtimeProfile = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasRuntimeProfile);\r
165                                 processRecursively(graph, runtimeProfile, entry.getSecond(), checked);\r
166                                 \r
167                             }\r
168 \r
169                         });\r
170                     } catch (DatabaseException e) {\r
171                         e.printStackTrace();\r
172                     }\r
173                 }\r
174                 \r
175                 return null;\r
176                 \r
177             }\r
178                 \r
179         };\r
180         \r
181     }\r
182     \r
183     @SCLValue(type = "ReadGraph -> Resource -> Variable -> b")\r
184     public static Object selectedProfile(ReadGraph graph, Resource resource, Variable context) throws DatabaseException {\r
185         \r
186         Resource runtimeDiagram = ScenegraphLoaderUtils.getResourceSelection(graph, context);\r
187         if(runtimeDiagram == null) return "";\r
188 \r
189         Layer0 L0 = Layer0.getInstance(graph);\r
190         DiagramResource DIA = DiagramResource.getInstance(graph);\r
191         Resource profile = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasRuntimeProfile);\r
192         if(profile == null) return null;\r
193         String name = graph.getPossibleRelatedValue(profile, L0.HasName, Bindings.STRING);\r
194         return StringUtils.safeString(name);\r
195 \r
196     }\r
197 \r
198     @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
199     public static Object activeProfileModifier(ReadGraph graph, final Resource resource, final Variable context) throws DatabaseException {\r
200         \r
201         return new FunctionImpl1<String, String>() {\r
202 \r
203                 @Override\r
204                 public String apply(final String key) {\r
205 \r
206                         VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
207                         Simantics.getSession().asyncRequest(new WriteRequest(support.getWorkspacePersistent("profiles")) {\r
208 \r
209                                 public Resource selected(List<Tuple> avail, String text) {\r
210                                         for(Tuple a : avail) if(a.get(0).equals(text)) return (Resource)a.get(1);\r
211                                                         return null;\r
212                                 }\r
213 \r
214                                 @Override\r
215                                 public void perform(WriteGraph graph) throws DatabaseException {\r
216 \r
217                                         Resource runtimeDiagram = ScenegraphLoaderUtils.getResourceSelection(graph, context);\r
218 \r
219                                         List<Tuple> avail = (List<Tuple>)availableProfiles(graph, resource, context);\r
220 \r
221                                         final Resource profile = selected(avail, key);\r
222 \r
223                                         DiagramResource DIA = DiagramResource.getInstance(graph);\r
224                                         Resource current = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasRuntimeProfile);\r
225                                         if(profile.equals(current)) return;\r
226 \r
227                                         graph.deny(runtimeDiagram, DIA.RuntimeDiagram_HasRuntimeProfile);\r
228                                         graph.claim(runtimeDiagram, DIA.RuntimeDiagram_HasRuntimeProfile, null, profile);\r
229 \r
230                                         // Set this profile as the default profile for this model\r
231                                         String modelURI = graph.getRelatedValue(runtimeDiagram, DIA.RuntimeDiagram_HasModelURI);\r
232                                         Resource model = graph.getResource(modelURI);\r
233                                         graph.deny(model, DIA.HasActiveProfile);\r
234                                         graph.claim(model, DIA.HasActiveProfile, profile);\r
235 \r
236                                         // Set this profile as the default profile for this diagram\r
237                                         Resource configuration = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasConfiguration);\r
238                                         graph.deny(configuration, DIA.HasActiveProfile);\r
239                                         graph.claim(configuration, DIA.HasActiveProfile, profile);\r
240 \r
241                                 }\r
242 \r
243                         });\r
244                         \r
245                         return null;\r
246 \r
247                 }\r
248                 \r
249         };\r
250         \r
251     }\r
252 \r
253     @SCLValue(type = "ReadGraph -> Resource -> Variable -> Resource")\r
254     public static Resource singleResourceSelection(ReadGraph graph, Resource resource, Variable context) throws DatabaseException {\r
255         return ScenegraphLoaderUtils.getPossibleResourceSelection(graph, context);\r
256     }\r
257     \r
258 }\r