package edu.harvard.econcs.turkserver.client; import java.util.Collection; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; import javax.swing.AbstractListModel; public class SortedListModel<T> extends AbstractListModel<T> { private static final long serialVersionUID = 2032594302192371295L; private TreeSet<T> things; private Object[] backingArray; public SortedListModel(Comparator<T> comp) { things = new TreeSet<T>(comp); backingArray = new Object[0]; } @SuppressWarnings("unchecked") @Override public T getElementAt(int index) { return (T) backingArray[index]; } @Override public int getSize() { return backingArray.length; } public void updateModel(Collection<T> newSet) { // Remove old things Iterator<T> it = things.iterator(); while(it.hasNext()) { T o = it.next(); if( !newSet.contains(o) ) it.remove(); } // Add new things for(T o : newSet) { things.add(o); } backingArray = new Object[things.size()]; int i = 0; for(Object o : things) { backingArray[i++] = o; } /* TODO make this more efficient * Also, does it work properly when people leave? */ super.fireContentsChanged(this, 0, backingArray.length); } }