package pt.jkaiui.ui.modes; import java.util.Collections; import java.util.Vector; import javax.swing.AbstractListModel; import java.util.Comparator; /** * * @author jbi */ public class DefaultSortableListModel extends AbstractListModel { private Vector delegate = new Vector(); private boolean Sorted = true; public void setSorted(boolean Sorted) { Sorted = Sorted; } public int getSize() { return delegate.size(); } public Object getElementAt(int index) { return delegate.elementAt(index); } public void copyInto(Object anArray[]) { delegate.copyInto(anArray); } public void trimToSize() { delegate.trimToSize(); } public void ensureCapacity(int minCapacity) { delegate.ensureCapacity(minCapacity); } public void setSize(int newSize) { int oldSize = delegate.size(); delegate.setSize(newSize); if (oldSize > newSize) { fireIntervalRemoved(this, newSize, oldSize-1); } else if (oldSize < newSize) { fireIntervalAdded(this, oldSize, newSize-1); } } public int capacity() { return delegate.capacity(); } public int size() { return delegate.size(); } public boolean isEmpty() { return delegate.isEmpty(); } public boolean contains(Object elem) { return delegate.contains(elem); } public int indexOf(Object elem) { return delegate.indexOf(elem); } public int indexOf(Object elem, int index) { return delegate.indexOf(elem, index); } public int lastIndexOf(Object elem) { return delegate.lastIndexOf(elem); } public int lastIndexOf(Object elem, int index) { return delegate.lastIndexOf(elem, index); } public Object elementAt(int index) { return delegate.elementAt(index); } public Object firstElement() { return delegate.firstElement(); } public Object lastElement() { return delegate.lastElement(); } public void setElementAt(Object obj, int index) { delegate.setElementAt(obj, index); fireContentsChanged(this, index, index); } public void removeElementAt(int index) { delegate.removeElementAt(index); fireIntervalRemoved(this, index, index); } public void insertElementAt(Object obj, int index) { delegate.insertElementAt(obj, index); fireIntervalAdded(this, index, index); } public void addElement(Object obj) { int index = delegate.size(); delegate.addElement(obj); fireIntervalAdded(this, index, index); if (Sorted) Collections.sort(delegate, new Comparator() { public int compare(Object o1, Object o2) { if (!(o1 instanceof String && o2 instanceof String)) return 1; return goodify((String)o1).compareTo(goodify((String)o2)); } public String goodify(String x) { // No more unix sorting! x = x.toLowerCase(); if (Character.isLetterOrDigit(x.charAt(0))) return x; // Traverse the letters finding the first real comparable letter. int firstGood = 1; for(int i = 1; i < x.length(); i++) { if(Character.isLetterOrDigit(x.charAt(i))) { firstGood = i; break; } } return x.substring(firstGood); } }); } public boolean removeElement(Object obj) { int index = indexOf(obj); boolean rv = delegate.removeElement(obj); if (index >= 0) { fireIntervalRemoved(this, index, index); } return rv; } public void removeAllElements() { int index1 = delegate.size()-1; delegate.removeAllElements(); if (index1 >= 0) { fireIntervalRemoved(this, 0, index1); } } public String toString() { return delegate.toString(); } public Object[] toArray() { Object[] rv = new Object[delegate.size()]; delegate.copyInto(rv); return rv; } public Object get(int index) { return delegate.elementAt(index); } public Object set(int index, Object element) { Object rv = delegate.elementAt(index); delegate.setElementAt(element, index); fireContentsChanged(this, index, index); return rv; } public void add(int index, Object element) { delegate.insertElementAt(element, index); fireIntervalAdded(this, index, index); } public Object remove(int index) { Object rv = delegate.elementAt(index); delegate.removeElementAt(index); fireIntervalRemoved(this, index, index); return rv; } public void clear() { int index1 = delegate.size()-1; delegate.removeAllElements(); if (index1 >= 0) { fireIntervalRemoved(this, 0, index1); } } public void removeRange(int fromIndex, int toIndex) { if (fromIndex > toIndex) { throw new IllegalArgumentException("fromIndex must be <= toIndex"); } for(int i = toIndex; i >= fromIndex; i--) { delegate.removeElementAt(i); } fireIntervalRemoved(this, fromIndex, toIndex); } } // EVERYTHING BELOW THIS IS A PART OF AN EXPERIMENTAL VERSION OF THIS CLASS THAT // USES A TREESET INSTEAD OF A VECTOR ///* // * DefaultSortableListModel.java // * // * Created on 30. Juni 2005, 22:20 // * // */ // //package pt.jkaiui.ui.modes; //import java.util.Collections; //import java.util.TreeSet; //import java.util.Comparator; //import java.util.Iterator; //import javax.swing.AbstractListModel; // // // // ///** // * // * @author jbi // */ // //public class DefaultSortableListModel extends AbstractListModel { // // private TreeSet delegate = new TreeSet(); // private HashMap locations = new HashMap(); // // public DefaultSortableListModel() { // delegate = new TreeSet(new Comparator() { // public int compare(Object o1, Object o2) { // // if (!(o1 instanceof String && o2 instanceof String)) return 1; // return goodify((String)o1).compareTo(goodify((String)o2)); // } // // public String goodify(String x) { // // No more unix sorting! // x = x.toLowerCase(); // // if (Character.isLetterOrDigit(x.charAt(0))) // return x; // // // Traverse the letters finding the first real comparable letter. // int firstGood = 1; // for(int i = 1; i < x.length(); i++) { // if(Character.isLetterOrDigit(x.charAt(i))) { // firstGood = i; // break; // } // } // // return x.substring(firstGood); // } // }); // } // // /** This will probably never be called, but since it's required, we might as // well make it work properly. Since the "getElementAt" concept involves actually // returning an Object at a certain <strong>index</strong> and our data is // virtually modeled as a binary search tree, we have to resort to a // sequential search, reducing the runtime efficiency to O(n). // */ // public Object getElementAt(int i) { // if(i == 0) return delegate.first(); // if(i == delegate.size() - 1) return delegate.last(); // if(i >= delegate.size()) throw new ArrayIndexOutOfBoundsException(); // // Iterator it = delegate.iterator(); // // // Skip through all the unneeded elements referenced in the Iterator // int index = 1; // while(index++ < i) it.next(); // // return it.next(); // } // // public int getSize() { // return delegate.size(); // } // // public void clear() { // delegate.clear(); // } // // public boolean contains(Object o) { // return delegate.contains(o); // } // // public void addElement(String element) { // delegate.add(element); // } // // public void removeElement(String element) { // delegate.remove(element); // this.fireIntervalRemoved() // } // // public int indexOf(Object o) { // if(o == null) return -1; // // // } //}