| /* DefaultComboBoxModel.java -- |
| Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| package javax.swing; |
| |
| import java.io.Serializable; |
| import java.util.Arrays; |
| import java.util.Vector; |
| |
| import javax.swing.event.ListDataEvent; |
| |
| |
| /** |
| * A model that stores a list of elements and a selected item (which may be |
| * <code>null</code>). Changes to the model are signalled to listeners using |
| * {@link ListDataEvent}. This model is designed for use by the |
| * {@link JComboBox} component. |
| * |
| * @author Andrew Selkirk |
| * @author Olga Rodimina |
| * @author Robert Schuster |
| */ |
| public class DefaultComboBoxModel extends AbstractListModel |
| implements MutableComboBoxModel, Serializable |
| { |
| private static final long serialVersionUID = 6698657703676921904L; |
| |
| /** |
| * Storage for the elements in the model's list. |
| */ |
| private Vector list; |
| |
| /** |
| * The selected item (<code>null</code> indicates no selection). |
| */ |
| private Object selectedItem = null; |
| |
| /** |
| * Creates a new model, initially empty. |
| */ |
| public DefaultComboBoxModel() |
| { |
| list = new Vector(); |
| } |
| |
| /** |
| * Creates a new model and initializes its item list to the values in the |
| * given array. The selected item is set to the first item in the array, or |
| * <code>null</code> if the array length is zero. |
| * |
| * @param items an array containing items for the model (<code>null</code> |
| * not permitted). |
| * |
| * @throws NullPointerException if <code>items</code> is <code>null</code>. |
| */ |
| public DefaultComboBoxModel(Object[] items) |
| { |
| list = new Vector(Arrays.asList(items)); |
| if (list.size() > 0) |
| selectedItem = list.get(0); |
| } |
| |
| /** |
| * Creates a new model and initializes its item list to the values in the |
| * given vector. The selected item is set to the first item in the vector, |
| * or <code>null</code> if the vector length is zero. |
| * |
| * @param vector a vector containing items for the model (<code>null</code> |
| * not permitted). |
| * |
| * @throws NullPointerException if <code>vector</code> is <code>null</code>. |
| */ |
| public DefaultComboBoxModel(Vector vector) |
| { |
| this.list = vector; |
| if (getSize() > 0) |
| selectedItem = vector.get(0); |
| } |
| |
| /** |
| * Adds an element to the model's item list and sends a {@link ListDataEvent} |
| * to all registered listeners. If the new element is the first item added |
| * to the list, and the selected item is <code>null</code>, the new element |
| * is set as the selected item. |
| * |
| * @param object item to add to the model's item list. |
| */ |
| public void addElement(Object object) |
| { |
| list.addElement(object); |
| int index = list.size() - 1; |
| fireIntervalAdded(this, index, index); |
| if (list.size() == 1 && selectedItem == null) |
| setSelectedItem(object); |
| } |
| |
| /** |
| * Removes the element at the specified index from the model's item list |
| * and sends a {@link ListDataEvent} to all registered listeners. If the |
| * element removed was the selected item, then the preceding element becomes |
| * the new selected item (or the next element, if there is no preceding |
| * element). |
| * |
| * @param index the index of the item to remove. |
| * |
| * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of |
| * bounds. |
| */ |
| public void removeElementAt(int index) |
| { |
| int selected = getIndexOf(selectedItem); |
| if (selected == index) // choose a new selected item |
| { |
| if (selected > 0) |
| setSelectedItem(getElementAt(selected - 1)); |
| else |
| setSelectedItem(getElementAt(selected + 1)); |
| } |
| list.removeElementAt(index); |
| fireIntervalRemoved(this, index, index); |
| } |
| |
| /** |
| * Adds an element at the specified index in the model's item list |
| * and sends a {@link ListDataEvent} to all registered listeners. |
| * |
| * @param object element to insert |
| * @param index index specifing position in the list where given element |
| * should be inserted. |
| * |
| * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of |
| * bounds. |
| * |
| * @see #addElement(Object) |
| */ |
| public void insertElementAt(Object object, int index) |
| { |
| list.insertElementAt(object, index); |
| fireIntervalAdded(this, index, index); |
| } |
| |
| /** |
| * Removes an element from the model's item list and sends a |
| * {@link ListDataEvent} to all registered listeners. If the item to be |
| * removed is the current selected item, a new selected item will be set. |
| * If the element is not found in the model's item list, this method does |
| * nothing. |
| * |
| * @param object the element to remove. |
| */ |
| public void removeElement(Object object) |
| { |
| int index = getIndexOf(object); |
| if (index != -1) |
| removeElementAt(index); |
| } |
| |
| /** |
| * Removes all the items from the model's item list, resets and selected item |
| * to <code>null</code>, and sends a {@link ListDataEvent} to all registered |
| * listeners. |
| */ |
| public void removeAllElements() |
| { |
| selectedItem = null; |
| int size = getSize(); |
| if (size > 0) |
| { |
| list.clear(); |
| fireIntervalRemoved(this, 0, size - 1); |
| } |
| } |
| |
| /** |
| * Returns the number of items in the model's item list. |
| * |
| * @return The number of items in the model's item list. |
| */ |
| public int getSize() |
| { |
| return list.size(); |
| } |
| |
| /** |
| * Sets the selected item for the model and sends a {@link ListDataEvent} to |
| * all registered listeners. The start and end index of the event is set to |
| * -1 to indicate the model's selection has changed, and not its contents. |
| * |
| * @param object the new selected item (<code>null</code> permitted). |
| */ |
| public void setSelectedItem(Object object) |
| { |
| if (selectedItem == null) |
| { |
| if (object == null) |
| return; |
| } |
| else |
| { |
| if (selectedItem.equals(object)) |
| return; |
| } |
| selectedItem = object; |
| fireContentsChanged(this, -1, -1); |
| } |
| |
| /** |
| * Returns the selected item. |
| * |
| * @return The selected item (possibly <code>null</code>). |
| */ |
| public Object getSelectedItem() |
| { |
| return selectedItem; |
| } |
| |
| /** |
| * Returns the element at the specified index in the model's item list. |
| * |
| * @param index the element index. |
| * |
| * @return The element at the specified index in the model's item list, or |
| * <code>null</code> if the <code>index</code> is outside the bounds |
| * of the list. |
| */ |
| public Object getElementAt(int index) |
| { |
| if (index < 0 || index >= list.size()) |
| return null; |
| return list.elementAt(index); |
| } |
| |
| /** |
| * Returns the index of the specified element in the model's item list. |
| * |
| * @param object the element. |
| * |
| * @return The index of the specified element in the model's item list. |
| */ |
| public int getIndexOf(Object object) |
| { |
| return list.indexOf(object); |
| } |
| } |