From: Marko Luukkainen Date: Fri, 22 Nov 2019 11:35:38 +0000 (+0200) Subject: UpdateOp specific selection propagation X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Finterop.git;a=commitdiff_plain;h=e75decb773efdb18e98b6951986c62adf52707f0 UpdateOp specific selection propagation This implementation replaces previous, direction (parent/sub) specific propagation. This is API change, implementations must be updated. gitlab #16 Change-Id: I1da59958636495ee2e9c90cc6b86ce0cfb99c186 --- diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java index 901dc19..854ad54 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java @@ -35,13 +35,24 @@ public abstract class AddDeleteUpdateOp extends UpdateOp { } @Override - public boolean requiresParentOps() { - return add; + public boolean requiresOp(UpdateOp op) { + if (add) { + if (getParentOps().contains(op)) + return true; + } else { + if (getSubOps().contains(op)) + return true; + } + return false; } - + @Override - public boolean requiresSubOps() { - return !add; + public boolean selectOp(UpdateOp op, boolean select) { + if (select) { + return requiresOp(op); + } else { + return op.requiresOp(this); + } } protected static void copyProperties(WriteGraph g, Resource source, Resource destination) throws DatabaseException { diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/NopOp.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/NopOp.java index f2316d5..eec9634 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/NopOp.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/NopOp.java @@ -51,13 +51,13 @@ public class NopOp extends UpdateOp{ } @Override - public boolean requiresParentOps() { - return false; + public boolean requiresOp(UpdateOp op) { + return false; } @Override - public boolean requiresSubOps() { - return false; + public boolean selectOp(UpdateOp op, boolean select) { + return false; } } diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java index 6fba567..50954ec 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java @@ -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; + } } diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOperations.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOperations.java index 0814ecf..0c1882c 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOperations.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOperations.java @@ -79,16 +79,16 @@ public abstract class UpdateOperations { return; } stack.push(op); - if (op.requiresParentOps()) { - for (UpdateOp pop : op.getParentOps()) - if (!pop.applied()) - _apply(g, stack, pop); - } - if (op.requiresSubOps()) { - for (UpdateOp sop : op.getSubOps()) - if (!sop.applied()) - _apply(g, stack, sop); - } + for (UpdateOp pop : op.getParentOps()) + if (op.requiresOp(pop)) { + if (!pop.applied()) + _apply(g, stack, pop); + } + for (UpdateOp sop : op.getSubOps()) + if (op.requiresOp(sop)) { + if (!sop.applied()) + _apply(g, stack, sop); + } stack.pop(); op.apply(g); }