package extensions.awt;
import java.awt.*;
import java.util.*;

/**
 * Delegate Choice action event.
 *
 * @see java.awt.Choice
 * @see extensions.awt.ActionProtocol
 * @version 1.0.2
 * @author John Webster Small
 */
public class ChoiceAction
  extends Choice
  implements ActionProtocol
{
  private ActionProtocol ap;

  /**
    * Add multiple items at once.
    * @param items items separated by '|', e.g. "one|two|three"
    */
  public void addItems(String items)
  {
    StringTokenizer i = new StringTokenizer(items,"|");
    while (i.hasMoreTokens())
      addItem(i.nextToken());
  }

  /** Return width of maximum length item. */
  public int maxCols()
  {
    int max = 0;
    for (int i = 0; i < countItems(); i++)
      if (max < getItem(i).length())
        max = getItem(i).length();
    return max;
  }

  /** Construct a ChoiceAction (i.e. a choice drop down)
    * with the action to be performed when this item is
    * selected. The action is performed automatically
    * only if this ChoiceAction appears within an
    * FrameExtended or DialogExtended window.
    * For example:
    * <pre><tt>
    *
    *    import java.awt.*;
    *    import extensions.awt.*;
    *
    *    public class Main extends FrameExtended
    *      implements ActionProtocol
    *    {
    *      ChoiceAction choices;
    *      TextFieldPanel choice;
    *      public final void action
    *        (Component forward, Event evt, Object what)
    *        { choice.getField().setText((String)what); }
    *      Main()
    *      {
    *        super("ChoiceAction Demo",FrameExtended.EXIT_ON_DESTROY);
    *        add("Center",choices = new ChoiceAction("one|two|three",this));
    *        add("South",choice = new TextFieldPanel("Choice: ",choices.maxCols()));
    *        resize(250,100);
    *        show();
    *      }
    *      public static void main(String args[]) { new Main(); }
    *    }
    *
    * </tt></pre>
    * Notice that in the above example that neither the frame's
    * handleEvent() or action() methods had to be overrided
    * to process the button clicked event!
    *
    * @param ap action to be performed, i.e. run()
    * @see extensions.awt.FrameExtended
    * @see extensions.awt.DialogExtended
    * @see extensions.awt.ActionProtocol
    * @see extensions.awt.MenuItemAction
    */
  public ChoiceAction(ActionProtocol ap)
  {
    super();
    this.ap = ap;
  }

  /**
    * Construct a ChoiceAction.
    * @param items initial choices
    * @param ap action to be performed, i.e. run()
    * @see #addItems
    * @see extensions.awt.ActionProtocol
    */
  public ChoiceAction(String items, ActionProtocol ap)
  {
    super();
    this.ap = ap;
    addItems(items);
  }

  /** Forward the choice selection action event on to
    * the action for further processing by the application
    * model rather than the GUI. This method is called
    * automatically by FrameExtended and DialogExtended.
    * @param forward the component forwarding action event
    * @param evt the event that caused the action
    * @param what the action
    * @see extensions.awt.ActionProtocol
    * @see extensions.awt.FrameExtended#handleEvent
    * @see extensions.awt.DialogExtended#handleEvent
    */
  public final void action(Component forward, Event evt, Object what)
    { ap.action(forward,evt,what); }
}