1 package org.simantics.document.ui.actions;
5 import org.simantics.db.ReadGraph;
6 import org.simantics.db.Resource;
7 import org.simantics.db.WriteGraph;
8 import org.simantics.db.common.request.WriteRequest;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.db.layer0.SelectionHints;
11 import org.simantics.db.layer0.adapter.DropActionFactory;
12 import org.simantics.document.DocumentResource;
13 import org.simantics.ui.SimanticsUI;
14 import org.simantics.utils.ui.ISelectionUtils;
16 public class FolderDropAction implements DropActionFactory {
18 private Resource folderType;
19 private Resource relation;
20 private Resource inverse;
22 public FolderDropAction(ReadGraph graph, String folderUri, String relationUri) throws DatabaseException {
23 folderType = graph.getResource(folderUri);
24 relation = graph.getResource(relationUri);
25 inverse = graph.getPossibleInverse(relation);
29 public Runnable create(ReadGraph g, Object target, Object source, int operation) throws DatabaseException {
30 final Resource lib = ISelectionUtils.getSinglePossibleKey(target, SelectionHints.KEY_MAIN, Resource.class);
35 final List<Resource> selections = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);
37 if (selections.isEmpty()) {
40 if (!g.isInstanceOf(lib, folderType))
42 DocumentResource doc = DocumentResource.getInstance(g);
43 for (Resource r : selections) {
44 if (!g.isInstanceOf(r, doc.Document))
47 Runnable runnable = new Runnable() {
51 SimanticsUI.getSession().asyncRequest(new WriteRequest() {
54 public void perform(WriteGraph graph) throws DatabaseException {
56 for (Resource r : selections) {
57 if (!graph.hasStatement(lib,relation,r)) {
58 if (inverse != null) {
59 // check if moved document is children of another document (tree revisions)
60 // if it is, prevent moving it.
61 Resource r2 = graph.getPossibleObject(r, inverse);
62 if (r2 != null && !graph.isInstanceOf(r2, folderType))
64 graph.deny(r,inverse);
66 graph.claim(lib, relation,r);