001    package jigcell.compare.ui;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    import javax.swing.AbstractListModel;
006    import javax.swing.MutableComboBoxModel;
007    
008    /**
009     * Combo box model that uses a list for storage.
010     *
011     * <p>
012     * Subclasses may safely inherit the following methods:
013     * </p>
014     *
015     * <ul>
016     * <li>
017     * getSelectedIndex()
018     * </li>
019     * <li>
020     * removeElement(java.lang.Object)
021     * </li>
022     * <li>
023     * setSelectedIndex(int)
024     * </li>
025     * </ul>
026     *
027     * <p>
028     * This code is licensed under the DARPA BioCOMP Open Source License.  See LICENSE for more details.
029     * </p>
030     *
031     * @author Nicholas Allen
032     */
033    
034    public class ListComboBoxModel extends AbstractListModel implements MutableComboBoxModel {
035    
036       /**
037        * Items contained in this model
038        */
039    
040       private List list;
041    
042       /**
043        * Currently selected item
044        */
045    
046       private Object selected;
047    
048       /**
049        * Creates a new combo box model with no initial values.
050        */
051    
052       public ListComboBoxModel () {
053          this (new ArrayList ());
054       }
055    
056       /**
057        * Creates a new combo box model with initial values from a list.
058        *
059        * @param list Initial values
060        */
061    
062       public ListComboBoxModel (List list) {
063          this.list = new ArrayList (list);
064          selected = getElementAt (0);
065       }
066    
067       public void addElement (Object item) {
068          int index = list.size ();
069          list.add (item);
070          if (index == 0 && selected == null && item != null)
071             selected = item;
072          fireIntervalAdded (this, index, index);
073       }
074    
075       public Object getElementAt (int index) {
076          return index >= 0 && index < list.size () ? list.get (index) : null;
077       }
078    
079       /**
080        * Index of an item in this model or -1 if the item is not present.
081        *
082        * @param item Item
083        */
084    
085       public int getIndexOf (Object item) {
086          return list.indexOf (item);
087       }
088    
089       /**
090        * The index of the selected item or -1 if no item is selected.
091        */
092    
093       public int getSelectedIndex () {
094          return getIndexOf (getSelectedItem ());
095       }
096    
097       public Object getSelectedItem () {
098          return selected;
099       }
100    
101       public int getSize () {
102          return list.size ();
103       }
104    
105       public void insertElementAt (Object item, int index) {
106          list.add (index, item);
107          fireIntervalAdded (this, index, index);
108       }
109    
110       /**
111        * Removes all entries in this model.
112        */
113    
114       public void removeAll () {
115          int size = list.size ();
116          if (size == 0)
117             return;
118          list.clear ();
119          selected = null;
120          fireIntervalRemoved (this, 0, size - 1);
121       }
122    
123       public void removeElement (Object item) {
124          int index = getIndexOf (item);
125          if (index != -1)
126             removeElementAt (index);
127       }
128    
129       public void removeElementAt (int index) {
130          if (getElementAt (index) == selected)
131             selected = getElementAt (index == 0 ? 1 : index - 1);
132          list.remove (index);
133          fireIntervalRemoved (this, index, index);
134       }
135    
136       /**
137        * Replaces all elements in this model with a new list.
138        *
139        * @param list New list
140        */
141    
142       public void replaceAll (List list) {
143          this.list.clear ();
144          this.list.addAll (list);
145          if (selected != null && list.indexOf (selected) == -1)
146             selected = getElementAt (0);
147          fireContentsChanged (this, 0, Integer.MAX_VALUE);
148       }
149    
150       /**
151        * Sets the selected item by index.
152        *
153        * @param index Index
154        */
155    
156       public void setSelectedIndex (int index) {
157          setSelectedItem (getElementAt (index));
158       }
159    
160       public void setSelectedItem (Object item) {
161          int index = list.indexOf (item);
162          if (index != -1)
163             item = list.get (index);
164          if (item == selected)
165             return;
166          selected = item;
167          fireContentsChanged (this, -1, -1);
168       }
169    }