package org.drugis.common.beans; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import org.apache.commons.collections15.Predicate; import com.jgoodies.binding.list.ObservableList; /** * An ObservableList that restricts the allowed elements to only those * for which the given Predicate is true. */ public class GuardedObservableList<E> extends AbstractObservableList<E> { ObservableList<E> d_nested; private final Predicate<? super E> d_predicate; /** * Wrap a guard around the nested list to restrict what elements can be added. * @param nested An empty ObservableList * @param predicate The predicate that all objects in this list must satisfy. */ public GuardedObservableList(ObservableList<E> nested, Predicate<? super E> predicate) { if (!nested.isEmpty()) { throw new IllegalArgumentException("Initial nested list must be empty."); } d_nested = nested; d_predicate = predicate; d_nested.addListDataListener(new ListDataListener() { public void intervalRemoved(ListDataEvent e) { fireIntervalRemoved(e.getIndex0(), e.getIndex1()); } public void intervalAdded(ListDataEvent e) { fireIntervalAdded(e.getIndex0(), e.getIndex1()); } public void contentsChanged(ListDataEvent e) { fireContentsChanged(e.getIndex0(), e.getIndex1()); } }); } @Override public E get(int index) { return d_nested.get(index); } @Override public int size() { return d_nested.size(); } @Override public void add(int index, E element) { check(element); d_nested.add(index, element); } @Override public E set(int index, E element) { check(element); return d_nested.set(index, element); } @Override public E remove(int index) { return d_nested.remove(index); } private void check(E element) { if (!d_predicate.evaluate(element)) { throw new IllegalArgumentException("The element " + element + " does not fulfill the guard predicate: " + d_predicate + "."); } } }