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