]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.ui/src/org/simantics/document/ui/actions/FolderDropAction.java
Merge commit '0b471805f017da83d715a0d8409f53bdd009d31e'
[simantics/platform.git] / bundles / org.simantics.document.ui / src / org / simantics / document / ui / actions / FolderDropAction.java
1 package org.simantics.document.ui.actions;\r
2 \r
3 import java.util.List;\r
4 \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
15 \r
16 public class FolderDropAction implements DropActionFactory {\r
17         \r
18         private Resource folderType;\r
19         private Resource relation;\r
20         private Resource inverse;\r
21         \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
26         }\r
27         \r
28         @Override\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
31 \r
32                 if (lib == null)\r
33                         return null;\r
34 \r
35                 final List<Resource> selections = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
36 \r
37                 if (selections.isEmpty()) {\r
38                         return null;\r
39                 }\r
40                 if (!g.isInstanceOf(lib, folderType))\r
41                         return null;\r
42                 DocumentResource doc = DocumentResource.getInstance(g);\r
43                 for (Resource r : selections) {\r
44                         if (!g.isInstanceOf(r, doc.Document))\r
45                                 return null;\r
46                 }\r
47                 Runnable runnable = new Runnable() {\r
48 \r
49                         @Override\r
50                         public void run() {\r
51                                 SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
52 \r
53                                         @Override\r
54                                         public void perform(WriteGraph graph) throws DatabaseException {\r
55                                                 \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
63                                                                                 continue;\r
64                                                                         graph.deny(r,inverse);\r
65                                                                 }\r
66                                                                 graph.claim(lib, relation,r);\r
67                                                         }\r
68                                                 }\r
69                                         }\r
70                                 });\r
71                         }\r
72                 };\r
73                 return runnable;\r
74                 \r
75         }\r
76 \r
77 }\r