From 60720a7a3b8379380294ff6c7d13f819772d4ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 23 Sep 2009 23:29:14 +0200 Subject: [PATCH] ItEr27S06CUAsignacionGrupoRecursosAPlanificacionItEr26S07: Adding up and down methods to MutableTreeModel --- .../zkoss/ganttz/util/MutableTreeModel.java | 52 +++++++++++ .../ganttz/util/MutableTreeModelTest.java | 89 +++++++++++++++++++ 2 files changed, 141 insertions(+) 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 586597622..17276e34a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.ListIterator; import java.util.Map; import java.util.WeakHashMap; @@ -38,6 +39,37 @@ public class MutableTreeModel extends AbstractTreeModel { } } + public int[] down(Node node) { + ListIterator> listIterator = children.listIterator(); + while (listIterator.hasNext()) { + Node current = listIterator.next(); + if (current == node && listIterator.hasNext()) { + int nextIndex = listIterator.nextIndex(); + listIterator.remove(); + listIterator.next(); + listIterator.add(node); + return new int[] { nextIndex - 1, nextIndex }; + } + } + return new int[] {}; + } + + public int[] up(Node node) { + ListIterator> listIterator = children.listIterator(children + .size()); + while (listIterator.hasPrevious()) { + Node current = listIterator.previous(); + if (current == node && listIterator.hasPrevious()) { + listIterator.remove(); + int previousIndex = listIterator.previousIndex(); + listIterator.previous(); + listIterator.add(current); + return new int[] { previousIndex, previousIndex + 1 }; + } + } + return new int[] {}; + } + private void until(LinkedList result, Node parent) { if (parent.equals(this)) { return; @@ -243,4 +275,24 @@ public class MutableTreeModel extends AbstractTreeModel { add(parent, insertionPosition, toAdd); } + public void down(T node) { + T parent = getParent(node); + Node parentNode = find(parent); + int[] changed = parentNode.down(find(node)); + if (changed.length != 0) { + fireEvent(parent, changed[0], changed[1], + TreeDataEvent.CONTENTS_CHANGED); + } + } + + public void up(T node) { + T parent = getParent(node); + Node parentNode = find(parent); + int[] changed = parentNode.up(find(node)); + if (changed.length != 0) { + fireEvent(parent, changed[0], changed[1], + TreeDataEvent.CONTENTS_CHANGED); + } + } + } 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 e571251aa..11b2904f3 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java @@ -334,6 +334,92 @@ public class MutableTreeModelTest { assertThat(model.getChild(model.getRoot(), 0), equalTo(substitution)); } + @Test + public void aNodeCanBeMovedDown() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba prueba1 = new Prueba(); + model.addToRoot(prueba1); + Prueba prueba2 = new Prueba(); + model.addToRoot(prueba2); + Prueba prueba3 = new Prueba(); + model.addToRoot(prueba3); + model.down(prueba1); + assertThat(model.getChild(model.getRoot(), 0), equalTo(prueba2)); + assertThat(model.getChild(model.getRoot(), 1), equalTo(prueba1)); + assertThat(model.getChild(model.getRoot(), 2), equalTo(prueba3)); + } + + @Test + public void aNodeCanBeMovedUp() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba prueba1 = new Prueba(); + model.addToRoot(prueba1); + Prueba prueba2 = new Prueba(); + model.addToRoot(prueba2); + Prueba prueba3 = new Prueba(); + model.addToRoot(prueba3); + model.up(prueba2); + assertThat(model.getChild(model.getRoot(), 0), equalTo(prueba2)); + assertThat(model.getChild(model.getRoot(), 1), equalTo(prueba1)); + assertThat(model.getChild(model.getRoot(), 2), equalTo(prueba3)); + } + + @Test + public void IfItIsAtTheTopUpDoesNothing() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba prueba1 = new Prueba(); + model.addToRoot(prueba1); + Prueba prueba2 = new Prueba(); + model.addToRoot(prueba2); + Prueba prueba3 = new Prueba(); + model.addToRoot(prueba3); + model.up(prueba1); + assertThat(model.getChild(model.getRoot(), 0), equalTo(prueba1)); + assertThat(model.getChild(model.getRoot(), 1), equalTo(prueba2)); + assertThat(model.getChild(model.getRoot(), 2), equalTo(prueba3)); + } + + @Test + public void movingUpAndDownSendsEvents() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba prueba1 = new Prueba(); + model.addToRoot(prueba1); + Prueba prueba2 = new Prueba(); + model.addToRoot(prueba2); + Prueba prueba3 = new Prueba(); + model.addToRoot(prueba3); + final ArrayList eventsFired = new ArrayList(); + model.addTreeDataListener(new TreeDataListener() { + + @Override + public void onChange(TreeDataEvent event) { + eventsFired.add(event); + } + }); + model.up(prueba2); + checkIsValid(getLast(eventsFired), TreeDataEvent.CONTENTS_CHANGED, + model.getRoot(), 0, 1); + model.down(prueba1); + checkIsValid(getLast(eventsFired), TreeDataEvent.CONTENTS_CHANGED, + model.getRoot(), 1, 2); + } + + @Test + public void ifItIsAtTheBottomDownDoesNothing() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + Prueba prueba1 = new Prueba(); + model.addToRoot(prueba1); + Prueba prueba2 = new Prueba(); + model.addToRoot(prueba2); + model.down(prueba2); + assertThat(model.getChild(model.getRoot(), 1), equalTo(prueba2)); + } + private void checkIsValid(TreeDataEvent event, int type, Prueba expectedParent, int expectedPosition) { checkIsValid(event, type, expectedParent, expectedPosition, @@ -350,6 +436,9 @@ public class MutableTreeModelTest { } private TreeDataEvent getLast(List list) { + if (list.isEmpty()) { + throw new RuntimeException("no events"); + } return list.get(list.size() - 1); } }