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 }