package edu.ualberta.med.biobank.widgets.multiselect;
import java.util.ArrayList;
import java.util.List;
import edu.ualberta.med.biobank.common.wrappers.ModelWrapper;
import edu.ualberta.med.biobank.treeview.util.DeltaEvent;
import edu.ualberta.med.biobank.treeview.util.IDeltaListener;
import edu.ualberta.med.biobank.treeview.util.NullDeltaListener;
public class MultiSelectNode<T> {
private T nodeObject;
protected MultiSelectNode<T> parent;
protected List<MultiSelectNode<T>> children;
protected List<MultiSelectNode<T>> addedChildren;
protected List<MultiSelectNode<T>> removedChildren;
protected IDeltaListener listener = NullDeltaListener.getSoleInstance();
public MultiSelectNode(MultiSelectNode<T> parent) {
this.parent = parent;
children = new ArrayList<MultiSelectNode<T>>();
}
public MultiSelectNode(MultiSelectNode<T> parent, T nodeObject) {
this(parent);
this.nodeObject = nodeObject;
addedChildren = new ArrayList<MultiSelectNode<T>>();
removedChildren = new ArrayList<MultiSelectNode<T>>();
}
public void setParent(MultiSelectNode<T> parent) {
this.parent = parent;
}
public MultiSelectNode<T> getParent() {
return parent;
}
public List<MultiSelectNode<T>> getChildren() {
return children;
}
public List<MultiSelectNode<T>> getAddedChildren() {
return addedChildren;
}
public List<MultiSelectNode<T>> getRemovedChildren() {
return removedChildren;
}
public void addChild(MultiSelectNode<T> child) {
child.setParent(this);
children.add(child);
addedChildren.add(child);
removedChildren.remove(child);
child.addListener(listener);
fireAdd(child);
}
public void removeChild(MultiSelectNode<T> item) {
if (children.size() == 0)
return;
MultiSelectNode<T> itemToRemove = null;
for (MultiSelectNode<T> child : children) {
if (child == item)
itemToRemove = child;
}
if (itemToRemove != null) {
children.remove(itemToRemove);
removedChildren.add(itemToRemove);
addedChildren.remove(itemToRemove);
fireRemove(itemToRemove);
}
}
public int getChildCount() {
return children.size();
}
public boolean hasChild(ModelWrapper<?> child) {
return children.contains(child);
}
public void addListener(IDeltaListener listener) {
this.listener = listener;
}
public void removeListener(IDeltaListener listener) {
if (this.listener.equals(listener)) {
this.listener = NullDeltaListener.getSoleInstance();
}
}
protected void fireAdd(Object added) {
listener.add(new DeltaEvent(added));
}
protected void fireRemove(Object removed) {
listener.remove(new DeltaEvent(removed));
}
/**
* remove all current selections
*/
public void clear() {
for (MultiSelectNode<T> node : new ArrayList<MultiSelectNode<T>>(
children)) {
removeChild(node);
}
children.clear();
addedChildren.clear();
removedChildren.clear();
}
/**
* Reset internal lists except current selections
*/
public void reset() {
addedChildren.clear();
removedChildren.clear();
}
public T getNodeObject() {
return nodeObject;
}
}