From af1e495311287e196e6ffad73fe712ecab93cc33 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 19 May 2010 11:34:37 +0000 Subject: [PATCH] fixes #5030 svn changeset:13254/svn branch:6.4 --- .../data/util/HierarchicalContainer.java | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/com/vaadin/data/util/HierarchicalContainer.java b/src/com/vaadin/data/util/HierarchicalContainer.java index 121d1cc936..108c544198 100644 --- a/src/com/vaadin/data/util/HierarchicalContainer.java +++ b/src/com/vaadin/data/util/HierarchicalContainer.java @@ -69,6 +69,10 @@ public class HierarchicalContainer extends IndexedContainer implements */ private boolean includeParentsWhenFiltering = true; + private boolean contentChangedEventsDisabled = false; + + private boolean contentsChangedEventPending; + /* * Can the specified Item have any children? Don't add a JavaDoc comment * here, we use the default documentation from implemented interface. @@ -378,6 +382,7 @@ public class HierarchicalContainer extends IndexedContainer implements */ @Override public Object addItem() { + disableContentsChangeEvents(); final Object itemId = super.addItem(); if (itemId == null) { return null; @@ -391,10 +396,35 @@ public class HierarchicalContainer extends IndexedContainer implements } } } - + enableAndFireContentsChangeEvents(); return itemId; } + @Override + protected void fireContentsChange(int addedItemIndex) { + if (contentsChangeEventsOn()) { + super.fireContentsChange(addedItemIndex); + } else { + contentsChangedEventPending = true; + } + } + + private boolean contentsChangeEventsOn() { + return !contentChangedEventsDisabled; + } + + private void disableContentsChangeEvents() { + contentChangedEventsDisabled = true; + } + + private void enableAndFireContentsChangeEvents() { + contentChangedEventsDisabled = false; + if (contentsChangedEventPending) { + fireContentsChange(-1); + } + contentsChangedEventPending = false; + } + /* * (non-Javadoc) * @@ -402,6 +432,7 @@ public class HierarchicalContainer extends IndexedContainer implements */ @Override public Item addItem(Object itemId) { + disableContentsChangeEvents(); final Item item = super.addItem(itemId); if (item == null) { return null; @@ -414,7 +445,7 @@ public class HierarchicalContainer extends IndexedContainer implements filteredRoots.add(itemId); } } - + enableAndFireContentsChangeEvents(); return item; } @@ -425,6 +456,7 @@ public class HierarchicalContainer extends IndexedContainer implements */ @Override public boolean removeAllItems() { + disableContentsChangeEvents(); final boolean success = super.removeAllItems(); if (success) { @@ -439,6 +471,7 @@ public class HierarchicalContainer extends IndexedContainer implements filteredChildren = null; } } + enableAndFireContentsChangeEvents(); return success; } @@ -449,6 +482,7 @@ public class HierarchicalContainer extends IndexedContainer implements */ @Override public boolean removeItem(Object itemId) { + disableContentsChangeEvents(); final boolean success = super.removeItem(itemId); if (success) { @@ -496,6 +530,8 @@ public class HierarchicalContainer extends IndexedContainer implements noChildrenAllowed.remove(itemId); } + enableAndFireContentsChangeEvents(); + return success; } @@ -508,7 +544,10 @@ public class HierarchicalContainer extends IndexedContainer implements * @return true if the operation succeeded */ public boolean removeItemRecursively(Object itemId) { - return removeItemRecursively(this, itemId); + disableContentsChangeEvents(); + boolean removeItemRecursively = removeItemRecursively(this, itemId); + enableAndFireContentsChangeEvents(); + return removeItemRecursively; } /** -- 2.39.5