diff --git a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java index c8bc0c279..caf417611 100644 --- a/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java +++ b/navalplanner-gantt-zk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java @@ -1,5 +1,6 @@ package org.zkoss.ganttz.util; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -62,6 +63,10 @@ public class MutableTreeModel extends AbstractTreeModel { return positionInParent; } + public Node getParent() { + return parentNode; + } + } private final Class type; @@ -168,4 +173,26 @@ public class MutableTreeModel extends AbstractTreeModel { TreeDataEvent.INTERVAL_REMOVED); } + public T getParent(T node) { + Node associatedNode = find(node); + if (associatedNode.equals(root)) + throw new IllegalArgumentException(node + " is root"); + return unwrap(associatedNode.getParent()); + } + + public List getParents(T node) { + ArrayList result = new ArrayList(); + T current = node; + while (!isRoot(current)) { + current = getParent(current); + result.add(current); + } + return result; + } + + public boolean isRoot(T node) { + Node associatedNode = find(node); + return associatedNode.isRoot(); + } + } diff --git a/navalplanner-gantt-zk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java b/navalplanner-gantt-zk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java index a11b0859a..66f425bc8 100644 --- a/navalplanner-gantt-zk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java +++ b/navalplanner-gantt-zk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java @@ -9,6 +9,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.junit.Test; @@ -112,6 +113,41 @@ public class MutableTreeModelTest { assertThat(model.getPath(child, root), equalTo(new int[0])); } + @Test + public void hasMethodGetParentToMakeNavigationEasier() { + Prueba root = new Prueba(); + MutableTreeModel model = MutableTreeModel.create(Prueba.class, + root); + Prueba child = new Prueba(); + model.add(root, child); + Prueba grandChild = new Prueba(); + model.add(child, grandChild); + assertThat(model.getParent(grandChild), equalTo(child)); + assertThat(model.getParent(child), equalTo(root)); + } + + @Test + public void hasMethodGetAllParentsUntilRoot() { + Prueba root = new Prueba(); + MutableTreeModel model = MutableTreeModel.create(Prueba.class, + root); + Prueba child = new Prueba(); + model.add(root, child); + Prueba grandChild = new Prueba(); + model.add(child, grandChild); + List parents = model.getParents(grandChild); + assertThat(parents.size(), equalTo(2)); + assertThat(parents, equalTo(Arrays.asList(child, root))); + } + + @Test(expected = IllegalArgumentException.class) + public void getParentOfRootThrowsException() { + Prueba root = new Prueba(); + MutableTreeModel model = MutableTreeModel.create(Prueba.class, + root); + model.getParent(root); + } + @Test public void addingTriggersEvent() { MutableTreeModel model = MutableTreeModel.create(Prueba.class);