aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Englund <marc.englund@itmill.com>2008-01-31 09:08:10 +0000
committerMarc Englund <marc.englund@itmill.com>2008-01-31 09:08:10 +0000
commitb974e0eb75cda4daa5ae888fe2349718087ed617 (patch)
tree238b110b1301e3a77a527f4a9db1bdc925e4ff05
parent71eb232024007276021500e06da6b614f8e6f0a4 (diff)
downloadvaadin-framework-b974e0eb75cda4daa5ae888fe2349718087ed617.tar.gz
vaadin-framework-b974e0eb75cda4daa5ae888fe2349718087ed617.zip
ContainerHierarchicalWrapper now notices changes to the wrapped container by piggybacking on listeners added by the wrapper 'user'.
svn changeset:3677/svn branch:trunk
-rw-r--r--src/com/itmill/toolkit/data/util/ContainerHierarchicalWrapper.java52
1 files changed, 47 insertions, 5 deletions
diff --git a/src/com/itmill/toolkit/data/util/ContainerHierarchicalWrapper.java b/src/com/itmill/toolkit/data/util/ContainerHierarchicalWrapper.java
index 6285854873..8acd75583a 100644
--- a/src/com/itmill/toolkit/data/util/ContainerHierarchicalWrapper.java
+++ b/src/com/itmill/toolkit/data/util/ContainerHierarchicalWrapper.java
@@ -81,6 +81,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
}
updateHierarchicalWrapper();
+
}
/**
@@ -93,7 +94,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
if (!hierarchical) {
- // Recreate hierarchy and datasrtuctures if missing
+ // Recreate hierarchy and data structures if missing
if (noChildrenAllowed == null || parent == null || children == null
|| roots == null) {
noChildrenAllowed = new HashSet();
@@ -594,7 +595,8 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
*/
public void addListener(Container.ItemSetChangeListener listener) {
if (container instanceof Container.ItemSetChangeNotifier) {
- ((Container.ItemSetChangeNotifier) container).addListener(listener);
+ ((Container.ItemSetChangeNotifier) container)
+ .addListener(new PiggybackListener(listener));
}
}
@@ -606,7 +608,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
public void removeListener(Container.ItemSetChangeListener listener) {
if (container instanceof Container.ItemSetChangeNotifier) {
((Container.ItemSetChangeNotifier) container)
- .removeListener(listener);
+ .removeListener(new PiggybackListener(listener));
}
}
@@ -618,7 +620,7 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
public void addListener(Container.PropertySetChangeListener listener) {
if (container instanceof Container.PropertySetChangeNotifier) {
((Container.PropertySetChangeNotifier) container)
- .addListener(listener);
+ .addListener(new PiggybackListener(listener));
}
}
@@ -630,7 +632,47 @@ public class ContainerHierarchicalWrapper implements Container.Hierarchical,
public void removeListener(Container.PropertySetChangeListener listener) {
if (container instanceof Container.PropertySetChangeNotifier) {
((Container.PropertySetChangeNotifier) container)
- .removeListener(listener);
+ .removeListener(new PiggybackListener(listener));
}
}
+
+ /**
+ * This listener 'piggybacks' on the real listener in order to update the
+ * wrapper when needed. It proxies equals() and hashCode() to the real
+ * listener so that the correct listener gets removed.
+ *
+ */
+ private class PiggybackListener implements
+ Container.PropertySetChangeListener,
+ Container.ItemSetChangeListener {
+
+ Object listener;
+
+ public PiggybackListener(Object realListener) {
+ listener = realListener;
+ }
+
+ public void containerItemSetChange(ItemSetChangeEvent event) {
+ updateHierarchicalWrapper();
+ ((Container.ItemSetChangeListener) listener)
+ .containerItemSetChange(event);
+
+ }
+
+ public void containerPropertySetChange(PropertySetChangeEvent event) {
+ updateHierarchicalWrapper();
+ ((Container.PropertySetChangeListener) listener)
+ .containerPropertySetChange(event);
+
+ }
+
+ public boolean equals(Object obj) {
+ return listener.equals(obj);
+ }
+
+ public int hashCode() {
+ return listener.hashCode();
+ }
+
+ }
}