]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / SCLScenegraph.java
1 package org.simantics.modeling;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 import java.util.Set;\r
7 \r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.diagram.elements.DiagramNodeUtil;\r
11 import org.simantics.diagram.elements.TextGridNode;\r
12 import org.simantics.diagram.elements.TextNode;\r
13 import org.simantics.g2d.canvas.ICanvasContext;\r
14 import org.simantics.g2d.diagram.DiagramHints;\r
15 import org.simantics.g2d.diagram.IDiagram;\r
16 import org.simantics.g2d.diagram.handler.DataElementMap;\r
17 import org.simantics.g2d.diagram.participant.Selection;\r
18 import org.simantics.g2d.element.IElement;\r
19 import org.simantics.g2d.scenegraph.ICanvasSceneGraphProvider;\r
20 import org.simantics.g2d.utils.CanvasUtils;\r
21 import org.simantics.scenegraph.ParentNode;\r
22 import org.simantics.scenegraph.g2d.G2DParentNode;\r
23 import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
24 import org.simantics.scenegraph.g2d.events.command.Commands;\r
25 import org.simantics.scenegraph.g2d.nodes.BackgroundNode;\r
26 import org.simantics.scenegraph.g2d.nodes.BoundsNode;\r
27 import org.simantics.scenegraph.g2d.nodes.ConnectionNode;\r
28 import org.simantics.scenegraph.g2d.nodes.DataNode;\r
29 import org.simantics.scenegraph.g2d.nodes.DecorationSVGNode;\r
30 import org.simantics.scenegraph.g2d.nodes.NavigationNode;\r
31 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;\r
32 import org.simantics.scenegraph.utils.NodeUtil;\r
33 import org.simantics.trend.impl.ItemNode;\r
34 import org.simantics.utils.threads.ThreadUtils;\r
35 \r
36 public class SCLScenegraph {\r
37         \r
38         public static ICanvasSceneGraphProvider getICanvasSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {\r
39                 ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider(model, diagram, diagramRVI);\r
40                 return provider;\r
41         }\r
42         \r
43         public static void disposeSceneGraphProvider(ICanvasSceneGraphProvider provider) {\r
44                 provider.dispose();\r
45         }\r
46         \r
47         //public static Resource getDiagramRuntime(Resource ) \r
48         \r
49         \r
50 //      public static String getNodeTransform(ICanvasContext ctx, String name) throws DatabaseException, InterruptedException {\r
51 //              return getNodeTransform(ctx, name);\r
52 //      }\r
53         \r
54         public static String getNodeTransform(ICanvasContext ctx, String name) {\r
55                 \r
56                 Set<TextNode> texts = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class);\r
57                 for (TextNode text : texts) {\r
58                         String nodeName = NodeUtil.getNodeName(text);\r
59                         if (nodeName.equals(name)) {\r
60                                 String transform = text.getTransform().toString();\r
61                                 return transform;\r
62                         }\r
63                 }\r
64                 return "No node found";\r
65         }\r
66         \r
67         public static String getNodeText(ICanvasContext ctx, String name) {\r
68                 \r
69                 Set<TextNode> texts = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class);\r
70                 for (TextNode text : texts) {\r
71                         String nodeName = NodeUtil.getNodeName(text);\r
72                         if (nodeName.equals(name)) {\r
73                                 String texti = text.getText();\r
74                                 return texti;\r
75                         }\r
76                 }\r
77                 return "No node found";\r
78         }\r
79         \r
80         public static String getNodeCount(ICanvasContext ctx) {\r
81                 G2DSceneGraph g2 = ctx.getSceneGraph();\r
82                 int amount = NodeUtil.countTreeNodes(g2);\r
83                 return "Node count: " + amount;\r
84         }\r
85         \r
86     public static String getAllNodes (ICanvasContext ctx) {\r
87         \r
88         Set<G2DSceneGraph> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), G2DSceneGraph.class);\r
89         int amount = g2.size() +1;\r
90         return "All nodes: " + amount;\r
91     }\r
92     \r
93     public static String getBoundsNodes (ICanvasContext ctx) {\r
94         \r
95         Set<BoundsNode> bn = NodeUtil.collectNodes(ctx.getSceneGraph(), BoundsNode.class);\r
96         int amount = bn.size();\r
97         return "BoundsNodes: " + amount;\r
98     }\r
99     \r
100     public static String getBackgroundNodes (ICanvasContext ctx) {\r
101         \r
102         Set<BackgroundNode> bg = NodeUtil.collectNodes(ctx.getSceneGraph(), BackgroundNode.class);\r
103         int amount = bg.size();\r
104         return "BackgroundNodes: " + amount;\r
105     }\r
106     \r
107     public static String getDataNodes (ICanvasContext ctx) {\r
108         \r
109         Set<DataNode> dn = NodeUtil.collectNodes(ctx.getSceneGraph(), DataNode.class);\r
110         int amount = dn.size();\r
111         return "DataNodes: " + amount;\r
112     }\r
113     \r
114     public static String getNavigationNodes (ICanvasContext ctx) {\r
115         \r
116         Set<NavigationNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), NavigationNode.class);\r
117         int amount = g2.size();\r
118         return "NavigationNodes: " + amount;\r
119     }\r
120     \r
121     public static String getParentNodes (ICanvasContext ctx) {\r
122         \r
123         Set<G2DParentNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), G2DParentNode.class);\r
124         int amount = g2.size();\r
125         return "ParentNodes: " + amount;\r
126     }\r
127     \r
128     public static String getDecorationNodes (ICanvasContext ctx) {\r
129         \r
130         Set<DecorationSVGNode> deco = NodeUtil.collectNodes(ctx.getSceneGraph(), DecorationSVGNode.class);\r
131         int amount = deco.size();\r
132         return "DecorationNodes: " + amount;\r
133     }\r
134     \r
135     public static String getSingleElementNodes (ICanvasContext ctx) {\r
136         \r
137         Set<SingleElementNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), SingleElementNode.class);\r
138         int amount = g2.size();\r
139         return "SingleElementNodes: " + amount;\r
140     }\r
141     \r
142     public static String getConnectionNodes (ICanvasContext ctx) {\r
143         \r
144         Set<ConnectionNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), ConnectionNode.class);\r
145         int amount = g2.size();\r
146         return "ConnectionNodes: " + amount;\r
147     }\r
148     \r
149     public static String getTextNodes (ICanvasContext ctx) {\r
150         \r
151         Set<TextNode> tn = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class);\r
152         Set<TextGridNode> tgn = NodeUtil.collectNodes(ctx.getSceneGraph(), TextGridNode.class);\r
153         int amount = tn.size() + tgn.size();\r
154         return "TextNodes: " + amount;\r
155     }\r
156     \r
157     public static String getItemNodes (ICanvasContext ctx) {\r
158         \r
159         Set<ItemNode> item = NodeUtil.collectNodes(ctx.getSceneGraph(), ItemNode.class);\r
160         int amount = item.size();\r
161         return "ItemNodes: " + amount;\r
162     }\r
163   \r
164     public static String editNodeText (ICanvasContext ctx, String module, String previous_value, String new_value) {\r
165                 \r
166         Set<TextNode> textGridNodes = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class);\r
167         for (TextNode modulenode : textGridNodes) {\r
168                 if (module.equals(modulenode.getText())) {\r
169                         //System.out.println("Module what we were looking for: " + module);\r
170                         //System.out.println("Modulenode: " + modulenode.getText());\r
171                         \r
172                         ParentNode<?> parentnode = modulenode.getParent();\r
173                         //System.out.println("Parentnode: " + parentnode);\r
174                         \r
175                         Collection<TextNode> textnodes = (Collection<TextNode>) parentnode.getNodes();\r
176                         for (TextNode valuenode : textnodes) {\r
177                                 if (previous_value.equals(valuenode.getText())) {\r
178                                         //System.out.println("Value what we were looking for: " + previous_value);\r
179                                         //System.out.println("Valuenode: " + valuenode.getText());\r
180                                         \r
181                                         //valuenode.setEditMode(true);\r
182                                         valuenode.activateEdit(0, null, ctx);\r
183                                         valuenode.setText(new_value);\r
184                                         valuenode.fireTextEditingEnded();\r
185                                         \r
186                                         //System.out.println("valuenode modified: " + valuenode);\r
187                                         return "Modified module " + module + " with value " + new_value;\r
188                                 }\r
189                         }\r
190                         return "Not found module : " + module;\r
191                 }\r
192         }\r
193         return "No nodes in scenegraph!";\r
194     }\r
195 \r
196     public static String sceneGraphTest (ICanvasContext ctx, String module, String value) {\r
197         \r
198         boolean module_founded = false;\r
199         boolean value_founded = false;\r
200         \r
201         Set<G2DSceneGraph> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), G2DSceneGraph.class);\r
202         System.out.println("Total amount of nodes: " + g2.size() + 1);\r
203         \r
204         Set<TextGridNode> grid = NodeUtil.collectNodes(ctx.getSceneGraph(), TextGridNode.class);\r
205         Integer textGridNodeAmount = grid.size();\r
206         System.out.println("Amount of TextGridNodes " + textGridNodeAmount);\r
207         \r
208         Set<TextNode> texts = NodeUtil.collectNodes(ctx.getSceneGraph(), TextNode.class);\r
209         Integer textNodeAmount = grid.size();\r
210         System.out.println("Amount of TextNodes " + textNodeAmount);\r
211 \r
212         for (TextNode node : texts) {\r
213             if (module.equals(node.getText())) {\r
214                 module_founded = true;\r
215                 System.out.println("Correct module " + module + " founded.");\r
216             }\r
217             if (value.equals(node.getText())) {\r
218                 value_founded = true;\r
219                 System.out.println("Correct value " + value + " founded.");\r
220             }\r
221         }\r
222         \r
223         if (value_founded == true && module_founded == true) {\r
224                 return "Found both correct module " + module + " and value " + value;\r
225         }\r
226         if (value_founded == false && module_founded == true) {\r
227                 return "Found only correct module " + module + " but not value " + value;\r
228         }\r
229         if (value_founded == true && module_founded == false) {\r
230                 return "Found only correct value " + value + " but not module " + module;\r
231         }\r
232         else {\r
233                 return "Didn't found either module " + module + " or value " + value;\r
234         }\r
235     }\r
236     \r
237      public static boolean copyPaste (final ICanvasContext source_ctx, final ICanvasContext target_ctx, List<Resource> modules) throws DatabaseException {\r
238         \r
239         IDiagram idiagram = source_ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);\r
240 \r
241                 DataElementMap dem = idiagram.getDiagramClass().getAtMostOneItemOfClass(DataElementMap.class);\r
242                 if (dem != null) {\r
243                         final Collection<IElement> newSelection = new ArrayList<IElement>();\r
244                         for (Resource module : modules) {\r
245                                 IElement element = dem.getElement(idiagram, module);\r
246                                 if (element != null) {\r
247                                         newSelection.add(element);\r
248                                 } else {\r
249                                         throw new DatabaseException("Could not find IElement for " + element);\r
250                                 }\r
251                         }\r
252                         \r
253                         ThreadUtils.syncExec(source_ctx.getThreadAccess(), new Runnable() {\r
254                     @Override\r
255                     public void run() {\r
256                         if (source_ctx.isDisposed())\r
257                             return;\r
258                         Selection selection = source_ctx.getAtMostOneItemOfClass(Selection.class);\r
259                         if (selection != null) {\r
260                             // This prevents workbench selection from being left over.\r
261                             // Also prevents scene graph crap from being left on the screen.\r
262                             selection.setSelection(0, newSelection);\r
263                         }\r
264                                 CanvasUtils.sendCommand(source_ctx, Commands.COPY);\r
265                                 CanvasUtils.sendCommand(target_ctx, Commands.PASTE);\r
266                     }\r
267                 });\r
268                         \r
269                 //}\r
270                 \r
271                 while(source_ctx.getEventQueue().size() > 0) {\r
272                         try {\r
273                                 Thread.sleep(10);\r
274                         } catch (InterruptedException e) {\r
275                                 throw new DatabaseException(e);\r
276                         }\r
277                 }\r
278 \r
279                 ThreadUtils.syncExec(source_ctx.getThreadAccess(), new Runnable() {\r
280             @Override\r
281             public void run() {\r
282             }\r
283         });             \r
284                                 \r
285                 }\r
286                 return true;\r
287     }\r
288 \r
289 \r
290 }