diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java index 144ef6ec9..586597622 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java @@ -233,4 +233,14 @@ public class MutableTreeModel extends AbstractTreeModel { return associatedNode.isRoot(); } + public void replace(T nodeToRemove, T nodeToAdd) { + T parent = getParent(nodeToRemove); + Node parentNode = find(parent); + final int insertionPosition = parentNode.getIndexOf(find(nodeToRemove)); + remove(nodeToRemove); + List toAdd = new ArrayList(); + toAdd.add(nodeToAdd); + add(parent, insertionPosition, toAdd); + } + } diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java index e3836d5d3..e571251aa 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java @@ -317,6 +317,23 @@ public class MutableTreeModelTest { TreeDataEvent.INTERVAL_REMOVED, model.getRoot(), 0); } + @Test + public void aNodeCanBeReplacedByOther() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba toRemove = new Prueba(); + Prueba prueba2 = new Prueba(); + Prueba grandChild = new Prueba(); + model.add(model.getRoot(), toRemove); + model.add(model.getRoot(), prueba2); + model.add(toRemove, grandChild); + Prueba substitution = new Prueba(); + model.replace(toRemove, substitution); + + assertThat(model.getChildCount(substitution), equalTo(0)); + assertThat(model.getChild(model.getRoot(), 0), equalTo(substitution)); + } + private void checkIsValid(TreeDataEvent event, int type, Prueba expectedParent, int expectedPosition) { checkIsValid(event, type, expectedParent, expectedPosition,