blob: 3e30ead4e3577711fd815aa1e4b1b467423e48df [file] [log] [blame]
/* Copyright (C) 2000 Free Software Foundation
This file is part of libgcj.
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.awt;
import java.awt.event.*;
import java.awt.peer.ChoicePeer;
import java.util.ArrayList;
/** This component lets the user choose an item from a list of
* Strings.
* @author Tom Tromey <tromey@redhat.com>
* @date December 25, 2000
*/
public class Choice extends Component implements ItemSelectable
{
/** Create a new Choice object. */
public Choice ()
{
items = new ArrayList ();
selected = -1;
}
/** Add a new item to this Choice object. If the item is the first
* item on the list, then it is selected.
* @param item The new item; must be non-null.
*/
public synchronized void add (String item)
{
if (item == null)
throw new IllegalArgumentException ("item must be non-null");
items.add (item);
int i = items.size () - 1;
if (peer != null)
{
ChoicePeer cp = (ChoicePeer) peer;
cp.add (item, i);
}
if (i == 0)
select (0);
}
/** Add a new item to this Choice object. This is the same as the
* add method. */
public void addItem (String item)
{
add (item);
}
/** Add a listener for item events.
* @param listener The listener to add.
*/
public synchronized void addItemListener (ItemListener listener)
{
listeners = AWTEventMulticaster.add (listeners, listener);
}
/** This creates the component's peer. */
public void addNotify ()
{
if (peer == null)
peer = getToolkit ().createChoice (this);
}
/** Returns number of items.
* @deprecated
*/
public int countItems ()
{
return getItemCount ();
}
/** Returns an item from this choice.
* @param index Index of the item. Indices start at zero.
*/
public String getItem (int index)
{
return (String) items.get (index);
}
/** Returns number of items in Choice. */
public int getItemCount ()
{
return items.size ();
}
/** Returns index of selected item; -1 if no item is selected. */
public int getSelectedIndex ()
{
return selected;
}
/** Returns currently selected item; null if no item is selected. */
public synchronized String getSelectedItem ()
{
return selected == -1 ? null : (String) items.get (selected);
}
/** Returns the currently selected item. */
public synchronized Object[] getSelectedObjects ()
{
// The JCL says this can return null but that breaks the contract
// for ItemSelectable.
Object[] r;
if (selected != -1)
{
r = new Object[1];
r[0] = items.get (selected);
}
else
r = new Object[0];
return r;
}
/** Inserts an item into this Choice. Existing items are shifted
* upwards. If the new item is the only item, then it is selected.
* If the currently selected item is shifted, then the first item is
* selected. If the currently selected item is not shifted, then it
* remains selected.
* @param item The new item
* @param index The position at which to insert it.
*/
public synchronized void insert (String item, int index)
{
if (index > items.size ())
index = items.size ();
items.add (index, item);
if (peer != null)
{
ChoicePeer cp = (ChoicePeer) peer;
cp.add (item, index);
}
if (items.size () == 1 || selected >= index)
select (0);
}
/** Generates a String representation of this Choice's state. */
protected String paramString ()
{
return ("Choice["
+ "selected=" + selected
+ "]");
}
/** Process an event for this Choice
* @param event The event the process.
*/
protected void processEvent (AWTEvent event)
{
if (event instanceof ItemEvent)
processItemEvent ((ItemEvent) event);
else
super.processEvent (event);
}
/** Process an item event for this Choice.
* @param event The ItemEvent to process
*/
protected void processItemEvent (ItemEvent event)
{
if (listeners != null)
listeners.itemStateChanged (event);
}
/** Remove an item from this Choice. If several matches exist, the
* first one is removed. If the removed item is selected, the the
* first item is selected.
* @param item The item string.
*/
public synchronized void remove (String item)
{
int size = items.size ();
for (int i = 0; i < size; ++i)
{
if (item.equals (items.get (i)))
{
remove (i);
break;
}
}
throw new IllegalArgumentException ("item \"" + item + "\" not in Choice");
}
/** Remove an item from this Choice. If the removed item is
* selected, the the first item is selected.
* @param index Index of the item to remove
*/
public synchronized void remove (int index)
{
items.remove (index);
if (peer != null)
{
ChoicePeer cp = (ChoicePeer) peer;
cp.remove (index);
}
if (index == selected)
select (0);
else if (selected > index)
--selected;
}
/** Remove all items from this choice. */
public synchronized void removeAll ()
{
int oldsize = items.size ();
items.clear ();
selected = -1;
if (peer != null)
{
ChoicePeer cp = (ChoicePeer) peer;
for (int i = 0; i < oldsize; ++i)
{
// Always remove item 0.
cp.remove (0);
}
}
}
/** Remove an item listener.
* @param listener Item listener to remove.
*/
public synchronized void removeItemListener (ItemListener listener)
{
listeners = AWTEventMulticaster.remove (listeners, listener);
}
/** Select an item in this Choice.
* @param item Name of the item to select.
*/
public synchronized void select (String item)
{
int size = items.size ();
for (int i = 0; i < size; ++i)
{
if (item.equals (items.get (i)))
{
select (i);
break;
}
}
}
/** Select an item in this choice.
* @param index Index of item to select.
*/
public synchronized void select (int index)
{
if (index < 0 || index > items.size ())
throw new IllegalArgumentException ("index out of range");
selected = index;
if (peer != null)
{
ChoicePeer cp = (ChoicePeer) peer;
cp.select (index);
}
}
private ItemListener listeners;
// List of items.
ArrayList items;
// Index of selected item.
int selected;
}