1 package org.simantics.modeling;
\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
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
36 public class SCLScenegraph {
\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
43 public static void disposeSceneGraphProvider(ICanvasSceneGraphProvider provider) {
\r
47 //public static Resource getDiagramRuntime(Resource )
\r
50 // public static String getNodeTransform(ICanvasContext ctx, String name) throws DatabaseException, InterruptedException {
\r
51 // return getNodeTransform(ctx, name);
\r
54 public static String getNodeTransform(ICanvasContext ctx, String name) {
\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
64 return "No node found";
\r
67 public static String getNodeText(ICanvasContext ctx, String name) {
\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
77 return "No node found";
\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
86 public static String getAllNodes (ICanvasContext ctx) {
\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
93 public static String getBoundsNodes (ICanvasContext ctx) {
\r
95 Set<BoundsNode> bn = NodeUtil.collectNodes(ctx.getSceneGraph(), BoundsNode.class);
\r
96 int amount = bn.size();
\r
97 return "BoundsNodes: " + amount;
\r
100 public static String getBackgroundNodes (ICanvasContext ctx) {
\r
102 Set<BackgroundNode> bg = NodeUtil.collectNodes(ctx.getSceneGraph(), BackgroundNode.class);
\r
103 int amount = bg.size();
\r
104 return "BackgroundNodes: " + amount;
\r
107 public static String getDataNodes (ICanvasContext ctx) {
\r
109 Set<DataNode> dn = NodeUtil.collectNodes(ctx.getSceneGraph(), DataNode.class);
\r
110 int amount = dn.size();
\r
111 return "DataNodes: " + amount;
\r
114 public static String getNavigationNodes (ICanvasContext ctx) {
\r
116 Set<NavigationNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), NavigationNode.class);
\r
117 int amount = g2.size();
\r
118 return "NavigationNodes: " + amount;
\r
121 public static String getParentNodes (ICanvasContext ctx) {
\r
123 Set<G2DParentNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), G2DParentNode.class);
\r
124 int amount = g2.size();
\r
125 return "ParentNodes: " + amount;
\r
128 public static String getDecorationNodes (ICanvasContext ctx) {
\r
130 Set<DecorationSVGNode> deco = NodeUtil.collectNodes(ctx.getSceneGraph(), DecorationSVGNode.class);
\r
131 int amount = deco.size();
\r
132 return "DecorationNodes: " + amount;
\r
135 public static String getSingleElementNodes (ICanvasContext ctx) {
\r
137 Set<SingleElementNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), SingleElementNode.class);
\r
138 int amount = g2.size();
\r
139 return "SingleElementNodes: " + amount;
\r
142 public static String getConnectionNodes (ICanvasContext ctx) {
\r
144 Set<ConnectionNode> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), ConnectionNode.class);
\r
145 int amount = g2.size();
\r
146 return "ConnectionNodes: " + amount;
\r
149 public static String getTextNodes (ICanvasContext ctx) {
\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
157 public static String getItemNodes (ICanvasContext ctx) {
\r
159 Set<ItemNode> item = NodeUtil.collectNodes(ctx.getSceneGraph(), ItemNode.class);
\r
160 int amount = item.size();
\r
161 return "ItemNodes: " + amount;
\r
164 public static String editNodeText (ICanvasContext ctx, String module, String previous_value, String new_value) {
\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
172 ParentNode<?> parentnode = modulenode.getParent();
\r
173 //System.out.println("Parentnode: " + parentnode);
\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
181 //valuenode.setEditMode(true);
\r
182 valuenode.activateEdit(0, null, ctx);
\r
183 valuenode.setText(new_value);
\r
184 valuenode.fireTextEditingEnded();
\r
186 //System.out.println("valuenode modified: " + valuenode);
\r
187 return "Modified module " + module + " with value " + new_value;
\r
190 return "Not found module : " + module;
\r
193 return "No nodes in scenegraph!";
\r
196 public static String sceneGraphTest (ICanvasContext ctx, String module, String value) {
\r
198 boolean module_founded = false;
\r
199 boolean value_founded = false;
\r
201 Set<G2DSceneGraph> g2 = NodeUtil.collectNodes(ctx.getSceneGraph(), G2DSceneGraph.class);
\r
202 System.out.println("Total amount of nodes: " + g2.size() + 1);
\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
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
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
217 if (value.equals(node.getText())) {
\r
218 value_founded = true;
\r
219 System.out.println("Correct value " + value + " founded.");
\r
223 if (value_founded == true && module_founded == true) {
\r
224 return "Found both correct module " + module + " and value " + value;
\r
226 if (value_founded == false && module_founded == true) {
\r
227 return "Found only correct module " + module + " but not value " + value;
\r
229 if (value_founded == true && module_founded == false) {
\r
230 return "Found only correct value " + value + " but not module " + module;
\r
233 return "Didn't found either module " + module + " or value " + value;
\r
237 public static boolean copyPaste (final ICanvasContext source_ctx, final ICanvasContext target_ctx, List<Resource> modules) throws DatabaseException {
\r
239 IDiagram idiagram = source_ctx.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
\r
241 DataElementMap dem = idiagram.getDiagramClass().getAtMostOneItemOfClass(DataElementMap.class);
\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
249 throw new DatabaseException("Could not find IElement for " + element);
\r
253 ThreadUtils.syncExec(source_ctx.getThreadAccess(), new Runnable() {
\r
255 public void run() {
\r
256 if (source_ctx.isDisposed())
\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
264 CanvasUtils.sendCommand(source_ctx, Commands.COPY);
\r
265 CanvasUtils.sendCommand(target_ctx, Commands.PASTE);
\r
271 while(source_ctx.getEventQueue().size() > 0) {
\r
274 } catch (InterruptedException e) {
\r
275 throw new DatabaseException(e);
\r
279 ThreadUtils.syncExec(source_ctx.getThreadAccess(), new Runnable() {
\r
281 public void run() {
\r