]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/TGElementCopyAdvisor.java
4c7c3d77988f94299cfd18ef8667d046bbd64a40
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / mapping / TGElementCopyAdvisor.java
1 package org.simantics.modeling.mapping;
2
3 import java.util.ArrayList;
4 import java.util.Map;
5 import java.util.Set;
6
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;
23
24 /**
25  * TG-based ElementCopyAdvisor.
26  * 
27  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
28  *
29  */
30 public class TGElementCopyAdvisor extends ElementCopyAdvisor {
31         
32         public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer,
33             Resource targetContainer, Map<Object, Object> map) throws DatabaseException {
34                 
35
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();
40                         
41                         ComponentAndElementCopyHandler handler = new ComponentAndElementCopyHandler(source,false,true) {
42                                 @Override
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);
48                                 }
49                         };
50                         
51                         ComponentAndElementPasteImportAdvisor advisor = new ComponentAndElementPasteImportAdvisor(graph, targetContainer, false,true);
52                         
53                         handler.copyToClipboard(graph, builder);
54                         for(Set<Representation> object : builder.getContents()) {
55                     TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
56                     if(tg != null) {
57                         
58                         TransferableGraphs.importGraph1(graph, tg, advisor);
59                         advisor.attach(graph);
60                         Resource copy = advisor.getElement();
61                         map.put(source, copy);
62                         return copy;
63                     }
64                 }
65                 } else {
66                         return super.copy(context, graph, source, sourceContainer, targetContainer, map);
67                 }
68                 
69                  throw new DatabaseException("Failed to copy resource " + NameUtils.getSafeName(graph, source, true)
70                         + " under " + NameUtils.getSafeName(graph, targetContainer, true));
71         }
72
73         /**
74          * Callback for custom element handling.
75          * 
76          * @param graph
77          * @param element
78          * @param includeElement
79          * @param roots
80          * @param exclusions
81          * @throws DatabaseException
82          */
83         protected void processElement(ReadGraph graph, Resource element, boolean includeElement, ArrayList<NamedResource> roots, ArrayList<Resource> exclusions) throws DatabaseException {
84                 
85         }
86 }