package gueei.binding.utility;
import gueei.binding.CollectionChangedEventArg;
import gueei.binding.CollectionObserver;
import gueei.binding.IObservableCollection;
import gueei.binding.Observer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
public class ObservableCollectionMultiplexer<T> {
private Hashtable<T, List<CollectionObservableEntry>> parentHT = new Hashtable<T, List<CollectionObservableEntry>>();
private Observer childChangedObserver = null;
private static class CollectionObservableEntry {
public CollectionObserver collectionObserver = null;
public IObservableCollection<?> observableCollection = null;
}
public ObservableCollectionMultiplexer(Observer childChangedObserver) {
this.childChangedObserver = childChangedObserver;
}
public void add(IObservableCollection<?> observableCollection, T parent) {
if( observableCollection == null || parent == null )
return;
List<CollectionObservableEntry> parentList = null;
if( parentHT.containsKey(parent)) {
parentList = parentHT.get(parent);
} else {
parentList = new ArrayList<CollectionObservableEntry>();
parentHT.put(parent,parentList);
}
CollectionObserver observer = new CollectionObserver() {
@Override
public void onCollectionChanged(
IObservableCollection<?> collection, CollectionChangedEventArg args, Collection<Object> initiators) {
if (initiators.contains(this)) return;
T parent = getParentFromObserver(this);
if( parent != null && childChangedObserver != null ){
initiators.add(parent);
childChangedObserver.onPropertyChanged(collection,initiators);
}
}
};
CollectionObservableEntry entry = new CollectionObservableEntry();
entry.observableCollection = observableCollection;
entry.collectionObserver = observer;
entry.observableCollection.subscribe(entry.collectionObserver);
parentList.add(entry);
}
public void removeParent(T parent) {
if( !parentHT.containsKey(parent) )
return;
List<CollectionObservableEntry> list = parentHT.get(parent);
for(CollectionObservableEntry entry :list ) {
if( entry.collectionObserver == null || entry.collectionObserver == null )
continue;
entry.observableCollection.unsubscribe(entry.collectionObserver);
}
list.clear();
}
public void clear() {
for (Iterator<Entry<T, List<CollectionObservableEntry>>> iter = parentHT.entrySet().iterator();
iter.hasNext();) {
Entry<T, List<CollectionObservableEntry>> entry = iter.next();
removeParent(entry.getKey());
iter.remove();
}
}
private T getParentFromObserver(CollectionObserver collectionObserver) {
for (Iterator<Entry<T, List<CollectionObservableEntry>>> iter = parentHT.entrySet().iterator();
iter.hasNext();) {
Entry<T, List<CollectionObservableEntry>> entry = iter.next();
List<CollectionObservableEntry> list = entry.getValue();
for(CollectionObservableEntry e : list) {
if( e.collectionObserver != null && e.collectionObserver.equals(collectionObserver))
return entry.getKey();
}
}
return null;
}
}