--- /dev/null
+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