package org.korsakow.ide.ui.components.model; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Vector; import javax.swing.AbstractListModel; import javax.swing.MutableComboBoxModel; public class KComboboxModel extends AbstractListModel implements MutableComboBoxModel, List<Object> { protected List<Object> objects; protected Object selectedObject; /** * Constructs an empty DefaultComboBoxModel object. */ public KComboboxModel() { objects = new ArrayList<Object>(); } /** * Constructs a DefaultComboBoxModel object initialized with * an array of objects. * * @param items an array of Object objects */ public KComboboxModel(final Object items[], Object selected) { objects = new ArrayList<Object>(items.length); int i,c; for ( i=0,c=items.length;i<c;i++ ) objects.add(items[i]); selectedObject = selected; } public KComboboxModel(final Object items[]) { this(items, items.length>0?items[0]:null); } /** * Constructs a DefaultComboBoxModel object initialized with * a vector. * * @param v a Collection object ... */ public KComboboxModel(Collection<?> v, Object selected) { objects = new ArrayList<Object>(v); selectedObject = selected; } public KComboboxModel(Collection<?> v) { this(v, v.isEmpty()?null:v.iterator().next()); } // implements javax.swing.ComboBoxModel /** * Set the value of the selected item. The selected item may be null. * <p> * @param anObject The combo box value or null for no selection. */ public void setSelectedItem(Object anObject) { if ((selectedObject != null && !selectedObject.equals( anObject )) || selectedObject == null && anObject != null) { selectedObject = anObject; // notice how we dont notify } } // implements javax.swing.ComboBoxModel public Object getSelectedItem() { return selectedObject; } // implements javax.swing.ListModel public int getSize() { return objects.size(); } // implements javax.swing.ListModel public Object getElementAt(int index) { if ( index >= 0 && index < objects.size() ) return objects.get(index); else return null; } /** * Returns the index-position of the specified object in the list. * * @param anObject * @return an int representing the index position, where 0 is * the first position */ public int getIndexOf(Object anObject) { return objects.indexOf(anObject); } // implements javax.swing.MutableComboBoxModel public void addElement(Object anObject) { objects.add(anObject); fireIntervalAdded(this,objects.size()-1, objects.size()-1); if ( objects.size() == 1 && selectedObject == null && anObject != null ) { setSelectedItem( anObject ); } } // implements javax.swing.MutableComboBoxModel public void insertElementAt(Object anObject,int index) { objects.add(index, anObject); fireIntervalAdded(this, index, index); } // implements javax.swing.MutableComboBoxModel public void removeElementAt(int index) { if ( getElementAt( index ) == selectedObject ) { if ( index == 0 ) { setSelectedItem( getSize() == 1 ? null : getElementAt( index + 1 ) ); } else { setSelectedItem( getElementAt( index - 1 ) ); } } objects.remove(index); fireIntervalRemoved(this, index, index); } // implements javax.swing.MutableComboBoxModel public void removeElement(Object anObject) { int index = objects.indexOf(anObject); if ( index != -1 ) { removeElementAt(index); } } /** * Empties the list. */ public void removeAllElements() { if ( objects.size() > 0 ) { int firstIndex = 0; int lastIndex = objects.size() - 1; objects.clear(); selectedObject = null; fireIntervalRemoved(this, firstIndex, lastIndex); } else { selectedObject = null; } } public boolean add(Object o) { addElement(o); return true; } public void add(int index, Object element) { insertElementAt(element, index); } public boolean addAll(Collection<? extends Object> c) { int index0 = objects.size(); boolean ret = objects.addAll(c); int index1 = objects.size()-1; fireIntervalAdded(this, index0, index1); return ret; } public boolean addAll(int index, Collection<? extends Object> c) { int index0 = index; boolean ret = objects.addAll(c); int index1 = index+c.size()-1; fireIntervalAdded(this, index0, index1); return ret; } public void clear() { removeAllElements(); } public boolean contains(Object o) { return objects.contains(o); } public boolean containsAll(Collection<?> c) { return objects.containsAll(c); } public Object get(int index) { return getElementAt(index); } public int indexOf(Object o) { return objects.indexOf(o); } public boolean isEmpty() { return objects.isEmpty(); } public Iterator<Object> iterator() { return objects.iterator(); } public int lastIndexOf(Object o) { return objects.lastIndexOf(o); } public ListIterator<Object> listIterator() { return objects.listIterator(); } public ListIterator<Object> listIterator(int index) { return objects.listIterator(index); } public boolean remove(Object o) { boolean ret = objects.contains(o); removeElement(o); return ret; } public Object remove(int index) { Object element = objects.get(index); removeElementAt(index); return element; } public boolean removeAll(Collection<?> c) { int index0 = 0; int index1 = size(); boolean ret = objects.removeAll(c); fireContentsChanged(this, index0, index1); return ret; } public boolean retainAll(Collection<?> c) { int index0 = 0; int index1 = size(); boolean ret = objects.retainAll(c); fireContentsChanged(this, index0, index1); return ret; } public Object set(int index, Object element) { Object ret = objects.set(index, element); fireContentsChanged(this, index, index); return ret; } public int size() { return objects.size(); } public List<Object> subList(int fromIndex, int toIndex) { return objects.subList(fromIndex, toIndex); } public Object[] toArray() { return objects.toArray(); } public <T> T[] toArray(T[] a) { return objects.toArray(a); } }