package extensions.awt;
import java.awt.*;

/**
 * Delegate MenuItem action event.
 *
 * @see java.awt.MenuItem
 * @see extensions.awt.ActionProtocol
 * @version 1.0.2
 * @author John Webster Small
 */
public class MenuItemAction
  extends MenuItem
  implements ActionProtocol
{
  private ActionProtocol ap;

  /** User defined id. */
  public int id = 0;

  /** Construct a MenuItemAction (i.e. a MenuItem) with
    * protocol adapter to handle event generated when
    * menu item is clicked.  Must be added to a FrameExtended
    * to automate callback of action event to the MenuItemAction.
    * For example:
    * <pre><tt>
    *
    *    import java.awt.*;
    *    import extensions.awt.*;
    *
    *    class MyModel extends DialogExtended
    *    {
    *      MyModel(Frame parent)
    *      {
    *        super(parent,"Done",true);
    *        add("Center",new ButtonAction("Done",destroyAdapter()));
    *        resize(100,50);
    *      }
    *    }
    *
    *    public class Main
    *    {
    *      public static void main(String args[])
    *      {
    *        Frame f = new FrameExtended("MenuItemAction Demo",FrameExtended.EXIT_ON_DESTROY);
    *        MyModel mm = new MyModel(f);
    *        MenuBar mb = new MenuBar();
    *        Menu actions = new Menu("Actions");
    *        actions.add(new MenuItemAction("Do It!",mm.showAdapter()));
    *        mb.add(actions);
    *        f.setMenuBar(mb);
    *        f.resize(250,200);
    *        f.show();
    *      }
    *    }
    *
    *
    * </tt></pre>
    * Notice that in the above example that neither the frame's
    * handleEvent() or action() methods had to be overrided
    * to process the menu item clicked event!
    *
    * @param label label displayed as menu item
    * @param ap action to be performed, i.e. run()
    * @see extensions.awt.FrameExtended
    * @see extensions.awt.DialogExtended
    * @see extensions.awt.ActionEventProtocol
    * @see extensions.awt.ButtonAction
    */ 
  public MenuItemAction(String label, ActionProtocol ap)
  {
    super(label);
    this.ap = ap;
  }

  /** Label and id the menu item, see constructor above.
    * @param label label displayed as menu item
    * @param id user defined menu item id
    * @param ap action to be performed, i.e. run()
    */
  public MenuItemAction(String label, int id, ActionProtocol ap)
  {
    this(label,ap);
    this.id = id;
  }

  /** Forward the button clicked action event on to
    * the action for further processing by the application
    * model rather than the GUI. This method is called
    * automatically by FrameExtended.
    * @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
    */
  public final void action(Component forward, Event evt, Object what)
    { ap.action(forward,evt,what); }
}
