1 package org.simantics.diagram.adapter;
3 import java.util.Collection;
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;
23 * @author Teemu Mätäsniemi
24 * @author Tuukka Lehtonen
26 public class ScenegraphCompositePasteHandler extends DefaultPasteHandler {
30 public ScenegraphCompositePasteHandler(Resource resource) {
35 public void onPasteBegin(WriteGraph graph) {
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);
45 final Resource parent = advisor.getTarget();
49 final Collection<Resource> roots = advisor.getRoots();
50 if (roots == null || roots.isEmpty())
53 // Validate that the pasted roots are scene graph nodes.
54 for (Resource root : roots) {
55 if (!graph.isInstanceOf(root, SG.Node))
59 final Resource list = graph.syncRequest(new UniqueRead<Resource>() {
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;
70 ListUtils.insertBack(graph, list, roots);
71 copied += roots.size();
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));
79 public void onPasteEnd(WriteGraph graph) {
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));