--- /dev/null
+package org.simantics.document.ui.actions;\r
+\r
+import java.util.List;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.SelectionHints;\r
+import org.simantics.db.layer0.adapter.DropActionFactory;\r
+import org.simantics.document.DocumentResource;\r
+import org.simantics.ui.SimanticsUI;\r
+import org.simantics.utils.ui.ISelectionUtils;\r
+\r
+public class FolderDropAction implements DropActionFactory {\r
+ \r
+ private Resource folderType;\r
+ private Resource relation;\r
+ private Resource inverse;\r
+ \r
+ public FolderDropAction(ReadGraph graph, String folderUri, String relationUri) throws DatabaseException {\r
+ folderType = graph.getResource(folderUri);\r
+ relation = graph.getResource(relationUri);\r
+ inverse = graph.getPossibleInverse(relation);\r
+ }\r
+ \r
+ @Override\r
+ public Runnable create(ReadGraph g, Object target, Object source, int operation) throws DatabaseException {\r
+ final Resource lib = ISelectionUtils.getSinglePossibleKey(target, SelectionHints.KEY_MAIN, Resource.class);\r
+\r
+ if (lib == null)\r
+ return null;\r
+\r
+ final List<Resource> selections = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
+\r
+ if (selections.isEmpty()) {\r
+ return null;\r
+ }\r
+ if (!g.isInstanceOf(lib, folderType))\r
+ return null;\r
+ DocumentResource doc = DocumentResource.getInstance(g);\r
+ for (Resource r : selections) {\r
+ if (!g.isInstanceOf(r, doc.Document))\r
+ return null;\r
+ }\r
+ Runnable runnable = new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
+\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ \r
+ for (Resource r : selections) {\r
+ if (!graph.hasStatement(lib,relation,r)) {\r
+ if (inverse != null) {\r
+ // check if moved document is children of another document (tree revisions)\r
+ // if it is, prevent moving it.\r
+ Resource r2 = graph.getPossibleObject(r, inverse);\r
+ if (r2 != null && !graph.isInstanceOf(r2, folderType))\r
+ continue;\r
+ graph.deny(r,inverse);\r
+ }\r
+ graph.claim(lib, relation,r);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+ };\r
+ return runnable;\r
+ \r
+ }\r
+\r
+}\r