diff options
Diffstat (limited to 'libjava/java/awt/Choice.java')
-rw-r--r-- | libjava/java/awt/Choice.java | 266 |
1 files changed, 263 insertions, 3 deletions
diff --git a/libjava/java/awt/Choice.java b/libjava/java/awt/Choice.java index cc1ddc0a57f..3e30ead4e35 100644 --- a/libjava/java/awt/Choice.java +++ b/libjava/java/awt/Choice.java @@ -7,9 +7,269 @@ 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; -/* A very incomplete placeholder. */ - -public class Choice extends Component +/** 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; } |