From 680617832d13b0e738f99d61ed675e380407cac5 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Tue, 9 Mar 2010 10:20:01 +0000 Subject: [PATCH] fixes #3949 svn changeset:11705/svn branch:6.3 --- .../util/ContainerHierarchicalWrapper.java | 14 ++++++++- .../data/util/HierarchicalContainer.java | 31 ++++++++++++++----- tests/src/com/vaadin/tests/dd/DDTest6.java | 19 ++++++++++++ 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java b/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java index 8b6fedb8e4..e692f11498 100644 --- a/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java +++ b/src/com/vaadin/data/util/ContainerHierarchicalWrapper.java @@ -518,7 +518,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, /** * Removes an Item specified by the itemId from the underlying container and - * from the hierarcy. + * from the hierarchy. * * @param itemId * the ID of the Item to be removed. @@ -539,6 +539,18 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical, return success; } + /** + * Removes the Item identified by given itemId and all its children. + * + * @see #removeItem(Object) + * @param itemId + * the identifier of the Item to be removed + * @return true if the operation succeeded + */ + public boolean removeItemRecursively(Object itemId) { + return HierarchicalContainer.removeItemRecursively(this, itemId); + } + /** * Adds a new Property to all Items in the Container. * diff --git a/src/com/vaadin/data/util/HierarchicalContainer.java b/src/com/vaadin/data/util/HierarchicalContainer.java index a404d83eb1..5d29283bcb 100644 --- a/src/com/vaadin/data/util/HierarchicalContainer.java +++ b/src/com/vaadin/data/util/HierarchicalContainer.java @@ -492,29 +492,44 @@ public class HierarchicalContainer extends IndexedContainer implements } /** - * Removes the Item identified by ItemId from the Container and all its - * children. + * Removes the Item identified by given itemId and all its children. * * @see #removeItem(Object) * @param itemId - * the identifier of the Item to remove + * the identifier of the Item to be removed * @return true if the operation succeeded */ public boolean removeItemRecursively(Object itemId) { + return removeItemRecursively(this, itemId); + } + + /** + * Removes the Item identified by given itemId and all its children from the + * given Container. + * + * @param container + * the container where the item is to be removed + * @param itemId + * the identifier of the Item to be removed + * @return true if the operation succeeded + */ + public static boolean removeItemRecursively( + Container.Hierarchical container, Object itemId) { boolean success = true; - Collection children2 = getChildren(itemId); + Collection children2 = container.getChildren(itemId); if (children2 != null) { Object[] array = children2.toArray(); for (int i = 0; i < array.length; i++) { - boolean removeItemRecursively = removeItemRecursively(array[i]); + boolean removeItemRecursively = removeItemRecursively( + container, array[i]); if (!removeItemRecursively) { success = false; } } } - boolean removeItem = removeItem(itemId); - if (!removeItem) { - success = false; + // remove the root of subtree if children where succesfully removed + if (success) { + success = container.removeItem(itemId); } return success; diff --git a/tests/src/com/vaadin/tests/dd/DDTest6.java b/tests/src/com/vaadin/tests/dd/DDTest6.java index 599fa113ff..a00f411334 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest6.java +++ b/tests/src/com/vaadin/tests/dd/DDTest6.java @@ -1,7 +1,10 @@ package com.vaadin.tests.dd; import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.data.util.ContainerHierarchicalWrapper; +import com.vaadin.event.Action; import com.vaadin.event.DataBoundTransferable; +import com.vaadin.event.Action.Handler; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptCriteria.AcceptAll; @@ -76,6 +79,22 @@ public class DDTest6 extends TestBase { tree1.setDropHandler(dropHandler); + Handler actionHandler = new Handler() { + + private Action[] actions = new Action[] { new Action("Remove") }; + + public void handleAction(Action action, Object sender, Object target) { + ContainerHierarchicalWrapper containerDataSource = (ContainerHierarchicalWrapper) tree1 + .getContainerDataSource(); + containerDataSource.removeItemRecursively(target); + } + + public Action[] getActions(Object target, Object sender) { + return actions; + } + }; + tree1.addActionHandler(actionHandler); + l.addComponent(tree1); getLayout().setSizeFull(); -- 2.39.5