--- /dev/null
+package org.simantics.annotation.ui.actions;\r
+\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.simantics.Simantics;\r
+import org.simantics.annotation.ontology.AnnotationResource;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.CommentMetadata;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.NameUtils;\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.db.layer0.request.PossibleModel;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.utils.ObjectUtils;\r
+import org.simantics.utils.datastructures.Callback;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+import org.simantics.utils.ui.ISelectionUtils;\r
+\r
+/**\r
+ * @author Jani Simomaa\r
+ */\r
+\r
+public class AnnotationDropActionFactory implements DropActionFactory {\r
+\r
+ @Override\r
+ public Runnable create(ReadGraph graph, Object target, Object source, int operation)\r
+ throws DatabaseException {\r
+\r
+ final Resource targetFolder = ISelectionUtils.getSinglePossibleKey(target, SelectionHints.KEY_MAIN, Resource.class);\r
+ if (targetFolder == null) {\r
+ return null;\r
+ }\r
+ Resource targetModel = graph.syncRequest(new PossibleModel(targetFolder));\r
+ \r
+ List<Resource> resources = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
+ AnnotationResource ANNO = AnnotationResource.getInstance(graph);\r
+ Set<Resource> movedItems = new HashSet<Resource>();\r
+ for (Resource resource : resources) {\r
+ if (graph.isInstanceOf(resource, ANNO.AnnotationType) || graph.isInstanceOf(resource, ANNO.Annotation)) {\r
+ Resource model = graph.syncRequest(new PossibleModel(resource));\r
+ if (ObjectUtils.objectEquals(targetModel, model)) {\r
+ movedItems.add(resource);\r
+ }\r
+ }\r
+ }\r
+ if (!movedItems.isEmpty()) {\r
+ return addAnnotations(targetFolder, movedItems);\r
+ }\r
+ \r
+ return null;\r
+ }\r
+ \r
+ \r
+ private Runnable addAnnotations(final Resource targetFolder, final Set<Resource> movedAnnotationItems) {\r
+ \r
+ return new Runnable() {\r
+ \r
+ @Override\r
+ public void run() {\r
+ Simantics.getSession().asyncRequest(new WriteRequest() {\r
+ \r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ \r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ for (Resource annotation : movedAnnotationItems) {\r
+ graph.deny(annotation, L0.PartOf);\r
+ graph.claim(targetFolder, L0.ConsistsOf, annotation);\r
+ }\r
+ \r
+ String name = NameUtils.getSafeName(graph, targetFolder);\r
+ CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
+ graph.addMetadata(cm.add("Moved " + movedAnnotationItems.size() + " annotations to folder " + name + ", resource " + targetFolder));\r
+ }\r
+ }, new Callback<DatabaseException>() {\r
+ \r
+ @Override\r
+ public void run(DatabaseException e) {\r
+ if (e!= null)\r
+ ErrorLogger.defaultLogError(e);\r
+ \r
+ }\r
+ });\r
+ \r
+ }\r
+ };\r
+ }\r
+ \r
+ \r
+}\r