diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-05-19 11:34:37 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2010-05-19 11:34:37 +0000 |
commit | af1e495311287e196e6ffad73fe712ecab93cc33 (patch) | |
tree | f6d47e0f1122235a72d6682ae174f73780a5d366 | |
parent | ac84f9c0935e2e78621f6a78edb62627122c326d (diff) | |
download | vaadin-framework-af1e495311287e196e6ffad73fe712ecab93cc33.tar.gz vaadin-framework-af1e495311287e196e6ffad73fe712ecab93cc33.zip |
fixes #5030
svn changeset:13254/svn branch:6.4
-rw-r--r-- | src/com/vaadin/data/util/HierarchicalContainer.java | 45 |
1 files 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; } /** |