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