]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java
UpdateOp specific selection propagation
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / model / UpdateOp.java
index 6fba56723f2c5cf2cca45117643664eb30448991..50954ec1ffca968cc3e06a6dfbd1b09a59e4765e 100644 (file)
@@ -69,33 +69,25 @@ public abstract class UpdateOp {
        public boolean isChange() {
                return isAdd() || isDelete();
        }
-       
-       /**
-        * Is parent operation applied before this.
-        * @return
-        */
-       public abstract boolean requiresParentOps();
-       /**
-        * Is child operation applied before this.
-        * @return
-        */
-       public abstract boolean requiresSubOps(); 
-       
+               
        /**
-        * Is parent operation selected when this is selected
+        * Should given operation to be applied before this operation.
+        * @param op
         * @return
         */
-       public boolean selectParentOps() {
-               return requiresParentOps();
+       public boolean requiresOp(UpdateOp op) {
+           return false;
        }
        
        /**
-        * Is child operation selected when this is selected
+        * Should selection state to be propagated to given op.
+        * @param op parent or sub op of this.
+        * @param select selection flag.
         * @return
         */
-       public boolean selectSubOps() {
-               return requiresSubOps();
-       }
+       public boolean selectOp(UpdateOp op, boolean select) {
+           return requiresOp(op);
+    }
        
        public boolean select(boolean select) {
            if (!enabled)
@@ -107,44 +99,44 @@ public abstract class UpdateOp {
                        manualSelection = true;
                return b;
        }
-       
+
        private boolean _select(boolean select) {
                if (select == selected)
                        return true;
                if (applied)
                        return false;
-               if (!isChange())
-                   return false;
                if (select) {
-                       if (selectParentOps()) {
-                               for (UpdateOp op : parentOps)
-                                       op._select(true);
-                       }
-                       
-                       selected = true;
-                       manualSelection = false;
-                       if (selectSubOps()) {
-                               for (UpdateOp op : subOps)
-                                       op._select(true);
-                       }
-                       
+                   selected = true;
+            manualSelection = false;
+                   for (UpdateOp op : parentOps) {
+                       if (selectOp(op,true))
+                   op._select(true);
+            }
+                       for (UpdateOp op : subOps) {
+                           if (selectOp(op,true))
+                   op._select(true);
+            }
+                       return true;
                } else {
                        selected = false;
                        manualSelection = false;
                        for (UpdateOp op : subOps) {
-                               if (op.selectParentOps())
-                                       op._select(false);
-                               else if (!op.manualSelection)
-                                       op._select(false);
-                       }
+                           if (selectOp(op, false))
+                    op._select(false);
+                else if (!op.manualSelection)
+                    op._select(false);
+            }
                        for (UpdateOp op : parentOps)
-                               if (op.selectSubOps())
-                                       op._select(false);
+                          if (selectOp(op, false))
+                  op._select(false);
                        return true;
                }
-               return false;
        }
+       
        public boolean selected() {
+           if (!isChange())
+               // Non change operations are not really selected, but the selected flag may be used for selection propagation
+               return false;
                return selected;
        }
        
@@ -202,5 +194,19 @@ public abstract class UpdateOp {
         * @return
         */
        public abstract Resource getCreatedResource();
+       
+       @Override
+    public String toString() {
+        String s = this.getClass().getSimpleName();
+        if (selected)
+            s += " selected";
+        if (enabled)
+            s += " enabled";
+        if (visible)
+            s += " visible";
+        if (applied)
+            s += " applied";
+        return s;
+    }
 
 }