package edu.ualberta.med.biobank.widgets.multiselect; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import edu.ualberta.med.biobank.treeview.util.DeltaEvent; import edu.ualberta.med.biobank.treeview.util.IDeltaListener; public class MultiSelectNodeContentProvider<T> implements ITreeContentProvider, IDeltaListener { protected TreeViewer viewer; @SuppressWarnings("unchecked") @Override public Object[] getChildren(Object parentElement) { Assert.isTrue(parentElement instanceof MultiSelectNode, "Invalid object"); //$NON-NLS-1$ return ((MultiSelectNode<T>) parentElement).getChildren().toArray(); } @Override public Object getParent(Object element) { return null; } @SuppressWarnings("unchecked") @Override public boolean hasChildren(Object element) { Assert.isTrue(element instanceof MultiSelectNode, "Invalid object"); //$NON-NLS-1$ return (((MultiSelectNode<T>) element).getChildCount() > 0); } @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override public void dispose() { // } @SuppressWarnings("unchecked") @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (TreeViewer) viewer; if (oldInput != null) { removeListenerFrom((MultiSelectNode<T>) oldInput); } if (newInput != null) { addListenerTo((MultiSelectNode<T>) newInput); } } protected void addListenerTo(MultiSelectNode<T> node) { node.addListener(this); for (MultiSelectNode<T> child : node.getChildren()) { addListenerTo(child); } } protected void removeListenerFrom(MultiSelectNode<T> node) { node.removeListener(this); for (MultiSelectNode<T> child : node.getChildren()) { removeListenerFrom(child); } } @SuppressWarnings("unchecked") @Override public void add(DeltaEvent event) { MultiSelectNode<T> node = ((MultiSelectNode<T>) event.receiver()) .getParent(); viewer.refresh(node, false); } @Override public void remove(DeltaEvent event) { add(event); } }