]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/TGElementCopyAdvisor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / mapping / TGElementCopyAdvisor.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/TGElementCopyAdvisor.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/TGElementCopyAdvisor.java
new file mode 100644 (file)
index 0000000..05f0cf7
--- /dev/null
@@ -0,0 +1,86 @@
+package org.simantics.modeling.mapping;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.NamedResource;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.util.ClipboardUtils;\r
+import org.simantics.db.layer0.util.SimanticsClipboard.Representation;\r
+import org.simantics.db.layer0.util.SimanticsClipboardImpl;\r
+import org.simantics.db.layer0.util.SimanticsKeys;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.diagram.synchronization.ISynchronizationContext;\r
+import org.simantics.graph.db.TransferableGraphs;\r
+import org.simantics.graph.representation.TransferableGraph1;\r
+import org.simantics.modeling.mapping.ComponentAndElementCopyHandler;\r
+import org.simantics.modeling.mapping.ComponentAndElementPasteImportAdvisor;\r
+\r
+/**\r
+ * TG-based ElementCopyAdvisor.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class TGElementCopyAdvisor extends ElementCopyAdvisor {\r
+       \r
+       public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer,\r
+            Resource targetContainer, Map<Object, Object> map) throws DatabaseException {\r
+               \r
+\r
+               DiagramResource DIA = DiagramResource.getInstance(graph);\r
+               if (!graph.isInstanceOf(source, DIA.Connection)) {\r
+                       // Connections cannot be copied with TG. \r
+                       SimanticsClipboardImpl builder = new SimanticsClipboardImpl();\r
+                       \r
+                       ComponentAndElementCopyHandler handler = new ComponentAndElementCopyHandler(source,false,true) {\r
+                               @Override\r
+                               protected void processElement(ReadGraph graph, Resource element,\r
+                                               boolean includeElement, ArrayList<NamedResource> roots,\r
+                                               ArrayList<Resource> exclusions) throws DatabaseException {\r
+                                       super.processElement(graph, element, includeElement, roots, exclusions);\r
+                                       TGElementCopyAdvisor.this.processElement(graph, element, includeElement, roots, exclusions);\r
+                               }\r
+                       };\r
+                       \r
+                       ComponentAndElementPasteImportAdvisor advisor = new ComponentAndElementPasteImportAdvisor(graph, targetContainer, false,true);\r
+                       \r
+                       handler.copyToClipboard(graph, builder);\r
+                       for(Set<Representation> object : builder.getContents()) {\r
+                   TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);\r
+                   if(tg != null) {\r
+                       \r
+                       TransferableGraphs.importGraph1(graph, tg, advisor);\r
+                       advisor.attach(graph);\r
+                       Resource copy = advisor.getElement();\r
+                       map.put(source, copy);\r
+                       return copy;\r
+                   }\r
+               }\r
+               } else {\r
+                       return super.copy(context, graph, source, sourceContainer, targetContainer, map);\r
+               }\r
+               \r
+                throw new DatabaseException("Failed to copy resource " + NameUtils.getSafeName(graph, source, true)\r
+                       + " under " + NameUtils.getSafeName(graph, targetContainer, true));\r
+       }\r
+\r
+       /**\r
+        * Callback for custom element handling.\r
+        * \r
+        * @param graph\r
+        * @param element\r
+        * @param includeElement\r
+        * @param roots\r
+        * @param exclusions\r
+        * @throws DatabaseException\r
+        */\r
+       protected void processElement(ReadGraph graph, Resource element, boolean includeElement, ArrayList<NamedResource> roots, ArrayList<Resource> exclusions) throws DatabaseException {\r
+               \r
+       }\r
+}\r