package org.drugis.common.beans; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import com.jgoodies.binding.list.ObservableList; public class AffixedObservableList<E> extends AbstractObservableList<E> { public static <E> AffixedObservableList<E> createSuffixed(ObservableList<E> list, E... suffix) { return new AffixedObservableList<E>(list, Collections.<E>emptyList(), Arrays.asList(suffix)); } public static <E> AffixedObservableList<E> createPrefixed(ObservableList<E> list, E... prefix) { return new AffixedObservableList<E>(list, Arrays.asList(prefix), Collections.<E>emptyList()); } private final ObservableList<E> d_nested; private final List<E> d_prefix; private final List<E> d_suffix; private AffixedObservableList(final ObservableList<E> list, final List<E> prefix, final List<E> suffix) { d_nested = list; d_prefix = prefix; d_suffix = suffix; d_nested.addListDataListener(new ListDataListener() { public void intervalRemoved(ListDataEvent e) { d_manager.fireIntervalRemoved(d_prefix.size() + e.getIndex0(), d_prefix.size() + e.getIndex1()); } public void intervalAdded(ListDataEvent e) { d_manager.fireIntervalAdded(d_prefix.size() + e.getIndex0(), d_prefix.size() + e.getIndex1()); } public void contentsChanged(ListDataEvent e) { d_manager.fireContentsChanged(d_prefix.size() + e.getIndex0(), d_prefix.size() + e.getIndex1()); } }); } @Override public E get(int index) { if (index < d_prefix.size()) { return d_prefix.get(index); } index -= d_prefix.size(); if (index < d_nested.size()) { return d_nested.get(index); } index -= d_nested.size(); return d_suffix.get(index); } @Override public int size() { return d_prefix.size() + d_nested.size() + d_suffix.size(); } }