1 package org.simantics.modeling.mapping;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Map;
\r
5 import java.util.Set;
\r
7 import org.simantics.db.ReadGraph;
\r
8 import org.simantics.db.Resource;
\r
9 import org.simantics.db.WriteGraph;
\r
10 import org.simantics.db.common.NamedResource;
\r
11 import org.simantics.db.common.utils.NameUtils;
\r
12 import org.simantics.db.exception.DatabaseException;
\r
13 import org.simantics.db.layer0.util.ClipboardUtils;
\r
14 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
\r
15 import org.simantics.db.layer0.util.SimanticsClipboardImpl;
\r
16 import org.simantics.db.layer0.util.SimanticsKeys;
\r
17 import org.simantics.diagram.stubs.DiagramResource;
\r
18 import org.simantics.diagram.synchronization.ISynchronizationContext;
\r
19 import org.simantics.graph.db.TransferableGraphs;
\r
20 import org.simantics.graph.representation.TransferableGraph1;
\r
21 import org.simantics.modeling.mapping.ComponentAndElementCopyHandler;
\r
22 import org.simantics.modeling.mapping.ComponentAndElementPasteImportAdvisor;
\r
25 * TG-based ElementCopyAdvisor.
\r
27 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
30 public class TGElementCopyAdvisor extends ElementCopyAdvisor {
\r
32 public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer,
\r
33 Resource targetContainer, Map<Object, Object> map) throws DatabaseException {
\r
36 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
37 if (!graph.isInstanceOf(source, DIA.Connection)) {
\r
38 // Connections cannot be copied with TG.
\r
39 SimanticsClipboardImpl builder = new SimanticsClipboardImpl();
\r
41 ComponentAndElementCopyHandler handler = new ComponentAndElementCopyHandler(source,false,true) {
\r
43 protected void processElement(ReadGraph graph, Resource element,
\r
44 boolean includeElement, ArrayList<NamedResource> roots,
\r
45 ArrayList<Resource> exclusions) throws DatabaseException {
\r
46 super.processElement(graph, element, includeElement, roots, exclusions);
\r
47 TGElementCopyAdvisor.this.processElement(graph, element, includeElement, roots, exclusions);
\r
51 ComponentAndElementPasteImportAdvisor advisor = new ComponentAndElementPasteImportAdvisor(graph, targetContainer, false,true);
\r
53 handler.copyToClipboard(graph, builder);
\r
54 for(Set<Representation> object : builder.getContents()) {
\r
55 TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
\r
58 TransferableGraphs.importGraph1(graph, tg, advisor);
\r
59 advisor.attach(graph);
\r
60 Resource copy = advisor.getElement();
\r
61 map.put(source, copy);
\r
66 return super.copy(context, graph, source, sourceContainer, targetContainer, map);
\r
69 throw new DatabaseException("Failed to copy resource " + NameUtils.getSafeName(graph, source, true)
\r
70 + " under " + NameUtils.getSafeName(graph, targetContainer, true));
\r
74 * Callback for custom element handling.
\r
78 * @param includeElement
\r
81 * @throws DatabaseException
\r
83 protected void processElement(ReadGraph graph, Resource element, boolean includeElement, ArrayList<NamedResource> roots, ArrayList<Resource> exclusions) throws DatabaseException {
\r