1 package org.simantics.diagram.adapter;
\r
3 import java.util.Collection;
\r
4 import java.util.Set;
\r
6 import org.eclipse.core.runtime.IStatus;
\r
7 import org.eclipse.core.runtime.Status;
\r
8 import org.simantics.db.ReadGraph;
\r
9 import org.simantics.db.Resource;
\r
10 import org.simantics.db.WriteGraph;
\r
11 import org.simantics.db.common.CommentMetadata;
\r
12 import org.simantics.db.common.request.UniqueRead;
\r
13 import org.simantics.db.common.utils.ListUtils;
\r
14 import org.simantics.db.exception.DatabaseException;
\r
15 import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler;
\r
16 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
\r
17 import org.simantics.diagram.internal.Activator;
\r
18 import org.simantics.graph.db.IImportAdvisor2;
\r
19 import org.simantics.layer0.Layer0;
\r
20 import org.simantics.scenegraph.ontology.ScenegraphResources;
\r
23 * @author Teemu Mätäsniemi
\r
24 * @author Tuukka Lehtonen
\r
26 public class ScenegraphCompositePasteHandler extends DefaultPasteHandler {
\r
30 public ScenegraphCompositePasteHandler(Resource resource) {
\r
35 public void onPasteBegin(WriteGraph graph) {
\r
40 public void onPaste(WriteGraph graph, IImportAdvisor2 advisor, Set<Representation> representations) {
\r
41 final Layer0 L0 = Layer0.getInstance(graph);
\r
42 final ScenegraphResources SG = ScenegraphResources.getInstance(graph);
\r
45 final Resource parent = advisor.getTarget();
\r
49 final Collection<Resource> roots = advisor.getRoots();
\r
50 if (roots == null || roots.isEmpty())
\r
53 // Validate that the pasted roots are scene graph nodes.
\r
54 for (Resource root : roots) {
\r
55 if (!graph.isInstanceOf(root, SG.Node))
\r
59 final Resource list = graph.syncRequest(new UniqueRead<Resource>() {
\r
61 public Resource perform(ReadGraph g) throws DatabaseException {
\r
62 Resource res = g.getPossibleObject(parent, SG.Node_children);
\r
63 return (res == null || !g.isInstanceOf(res, L0.List)) ? null : res;
\r
70 ListUtils.insertBack(graph, list, roots);
\r
71 copied += roots.size();
\r
73 } catch (DatabaseException e) {
\r
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));
\r
79 public void onPasteEnd(WriteGraph graph) {
\r
82 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
\r
83 graph.addMetadata(cm.add("Copy " + copied + " scene graph nodes."));
\r
84 } catch (DatabaseException e) {
\r
85 Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to attach metadata to commit, see exception for details.", e));
\r