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