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