]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/ScenegraphCompositePasteHandler.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / ScenegraphCompositePasteHandler.java
1 package org.simantics.diagram.adapter;
2
3 import java.util.Collection;
4 import java.util.Set;
5
6 import org.eclipse.core.runtime.IStatus;
7 import org.eclipse.core.runtime.Status;
8 import org.simantics.db.ReadGraph;
9 import org.simantics.db.Resource;
10 import org.simantics.db.WriteGraph;
11 import org.simantics.db.common.CommentMetadata;
12 import org.simantics.db.common.request.UniqueRead;
13 import org.simantics.db.common.utils.ListUtils;
14 import org.simantics.db.exception.DatabaseException;
15 import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler;
16 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
17 import org.simantics.diagram.internal.Activator;
18 import org.simantics.graph.db.IImportAdvisor2;
19 import org.simantics.layer0.Layer0;
20 import org.simantics.scenegraph.ontology.ScenegraphResources;
21
22 /**
23  * @author Teemu Mätäsniemi
24  * @author Tuukka Lehtonen
25  */
26 public class ScenegraphCompositePasteHandler extends DefaultPasteHandler {
27
28         int copied;
29
30         public ScenegraphCompositePasteHandler(Resource resource) {
31                 super(resource);
32         }
33
34         @Override
35         public void onPasteBegin(WriteGraph graph) {
36                 copied = 0;
37         }
38
39         @Override
40         public void onPaste(WriteGraph graph, IImportAdvisor2 advisor, Set<Representation> representations) {
41                 final Layer0 L0 = Layer0.getInstance(graph);
42                 final ScenegraphResources SG = ScenegraphResources.getInstance(graph);
43
44                 try {
45                         final Resource parent = advisor.getTarget();
46                         if (parent == null)
47                                 return;
48
49                         final Collection<Resource> roots = advisor.getRoots();
50                         if (roots == null || roots.isEmpty())
51                                 return;
52
53                         // Validate that the pasted roots are scene graph nodes.
54                         for (Resource root : roots) {
55                                 if (!graph.isInstanceOf(root, SG.Node))
56                                         return;
57                         }
58
59                         final Resource list = graph.syncRequest(new UniqueRead<Resource>() {
60                                 @Override
61                                 public Resource perform(ReadGraph g) throws DatabaseException {
62                                         Resource res = g.getPossibleObject(parent, SG.Node_children);
63                                         return (res == null || !g.isInstanceOf(res, L0.List)) ? null : res;
64                                 }
65                         });
66
67                         if (list == null)
68                                 return;
69
70                         ListUtils.insertBack(graph, list, roots);
71                         copied += roots.size();
72
73                 } catch (DatabaseException e) {
74                         Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to attach copied scene graph nodes to target composite node, see exception for details.", e));
75                 }
76         }
77
78         @Override
79         public void onPasteEnd(WriteGraph graph) {
80                 if (copied > 0) {
81                         try {
82                                 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
83                                 graph.addMetadata(cm.add("Copy " + copied + " scene graph nodes."));
84                         } catch (DatabaseException e) {
85                                 Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to attach metadata to commit, see exception for details.", e));
86                         }
87                 }
88         }
89
90 }