]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/ScenegraphCompositePasteHandler.java
Logger fixes after merge commit:fdbe8762
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / ScenegraphCompositePasteHandler.java
1 package org.simantics.diagram.adapter;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Set;\r
5 \r
6 import org.eclipse.core.runtime.IStatus;\r
7 import org.eclipse.core.runtime.Status;\r
8 import org.simantics.db.ReadGraph;\r
9 import org.simantics.db.Resource;\r
10 import org.simantics.db.WriteGraph;\r
11 import org.simantics.db.common.CommentMetadata;\r
12 import org.simantics.db.common.request.UniqueRead;\r
13 import org.simantics.db.common.utils.ListUtils;\r
14 import org.simantics.db.exception.DatabaseException;\r
15 import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler;\r
16 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;\r
17 import org.simantics.diagram.internal.Activator;\r
18 import org.simantics.graph.db.IImportAdvisor2;\r
19 import org.simantics.layer0.Layer0;\r
20 import org.simantics.scenegraph.ontology.ScenegraphResources;\r
21 \r
22 /**\r
23  * @author Teemu Mätäsniemi\r
24  * @author Tuukka Lehtonen\r
25  */\r
26 public class ScenegraphCompositePasteHandler extends DefaultPasteHandler {\r
27 \r
28         int copied;\r
29 \r
30         public ScenegraphCompositePasteHandler(Resource resource) {\r
31                 super(resource);\r
32         }\r
33 \r
34         @Override\r
35         public void onPasteBegin(WriteGraph graph) {\r
36                 copied = 0;\r
37         }\r
38 \r
39         @Override\r
40         public void onPaste(WriteGraph graph, IImportAdvisor2 advisor, Set<Representation> representations) {\r
41                 final Layer0 L0 = Layer0.getInstance(graph);\r
42                 final ScenegraphResources SG = ScenegraphResources.getInstance(graph);\r
43 \r
44                 try {\r
45                         final Resource parent = advisor.getTarget();\r
46                         if (parent == null)\r
47                                 return;\r
48 \r
49                         final Collection<Resource> roots = advisor.getRoots();\r
50                         if (roots == null || roots.isEmpty())\r
51                                 return;\r
52 \r
53                         // Validate that the pasted roots are scene graph nodes.\r
54                         for (Resource root : roots) {\r
55                                 if (!graph.isInstanceOf(root, SG.Node))\r
56                                         return;\r
57                         }\r
58 \r
59                         final Resource list = graph.syncRequest(new UniqueRead<Resource>() {\r
60                                 @Override\r
61                                 public Resource perform(ReadGraph g) throws DatabaseException {\r
62                                         Resource res = g.getPossibleObject(parent, SG.Node_children);\r
63                                         return (res == null || !g.isInstanceOf(res, L0.List)) ? null : res;\r
64                                 }\r
65                         });\r
66 \r
67                         if (list == null)\r
68                                 return;\r
69 \r
70                         ListUtils.insertBack(graph, list, roots);\r
71                         copied += roots.size();\r
72 \r
73                 } catch (DatabaseException e) {\r
74                         Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to attach copied scene graph nodes to target composite node, see exception for details.", e));\r
75                 }\r
76         }\r
77 \r
78         @Override\r
79         public void onPasteEnd(WriteGraph graph) {\r
80                 if (copied > 0) {\r
81                         try {\r
82                                 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
83                                 graph.addMetadata(cm.add("Copy " + copied + " scene graph nodes."));\r
84                         } catch (DatabaseException e) {\r
85                                 Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to attach metadata to commit, see exception for details.", e));\r
86                         }\r
87                 }\r
88         }\r
89 \r
90 }\r