/* MenuItem.java -- An item in a menu
   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 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 java.awt;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.peer.MenuItemPeer;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.EventListener;

import javax.accessibility.Accessible;
import javax.accessibility.AccessibleAction;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleValue;

/**
  * This class represents an item in a menu.
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  */
public class MenuItem extends MenuComponent
  implements Serializable, Accessible
{

/*
 * Static Variables
 */
  

  /**
   * The number used to generate the name returned by getName.
   */
  private static transient long next_menuitem_number;

  // Serialization Constant
  private static final long serialVersionUID = - 21757335363267194L;

/*************************************************************************/

/*
 * Instance Variables
 */

/**
  * @serial The name of the action command generated by this item.
  * This is package-private to avoid an accessor method.
  */
String actionCommand;

/**
  * @serial Indicates whether or not this menu item is enabled.
  * This is package-private to avoid an accessor method.
  */
boolean enabled = true;

/**
  * @serial The mask of events that are enabled for this menu item.
  */
long eventMask;

/**
  * @serial This menu item's label
  * This is package-private to avoid an accessor method.
  */
String label = "";

/**
  * @serial The shortcut for this menu item, if any
  */
private MenuShortcut shortcut;

// The list of action listeners for this menu item.
private transient ActionListener action_listeners;

  protected class AccessibleAWTMenuItem
    extends MenuComponent.AccessibleAWTMenuComponent
    implements AccessibleAction, AccessibleValue
  {
    private static final long serialVersionUID = -217847831945965825L;

    /** Constructor */
    protected AccessibleAWTMenuItem()
    {
      super();
    }
  
  
  
    public String getAccessibleName()
    {
      return label;
    }
  
    public AccessibleAction getAccessibleAction()
    {
      return this;
    }
  
    public AccessibleRole getAccessibleRole()
    {
      return AccessibleRole.MENU_ITEM;
    }
  
    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
     */
    public int getAccessibleActionCount()
    {
      return 1;
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
     */
    public String getAccessibleActionDescription(int i)
    {
      if (i == 0)
	return label;
      else
	return null;
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
     */
    public boolean doAccessibleAction(int i)
    {
      if (i != 0)
	return false;
      processActionEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, actionCommand));
      return true;
    }

    public AccessibleValue getAccessibleValue()
    {
      return this;
    }
  
    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
     */
    public Number getCurrentAccessibleValue()
    {
      return (enabled) ? new Integer(1) : new Integer(0);
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
     */
    public boolean setCurrentAccessibleValue(Number number)
    {
      boolean result = (number.intValue() != 0);
      // this. is required by javac 1.3, otherwise it is confused with
      // MenuItem.this.setEnabled.
      this.setEnabled(result);
      return result; 
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue()
     */
    public Number getMinimumAccessibleValue()
    {
      return new Integer(0);
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue()
     */
    public Number getMaximumAccessibleValue()
    {
      return new Integer(0);
    }
  
  }


/*************************************************************************/

/*
 * Constructors
 */

/**
  * Initializes a new instance of <code>MenuItem</code> with no label
  * and no shortcut.
  */
public
MenuItem()
{
}

/*************************************************************************/

/**
  * Initializes a new instance of <code>MenuItem</code> with the specified
  * label and no shortcut.
  *
  * @param label The label for this menu item.
  */
public 
MenuItem(String label)
{
  this.label = label;
}

/*************************************************************************/

/**
  * Initializes a new instance of <code>MenuItem</code> with the specified
  * label and shortcut.
  *
  * @param label The label for this menu item.
  * @param shortcut The shortcut for this menu item.
  */
public
MenuItem(String label, MenuShortcut shortcut)
{
  this.label = label;
  this.shortcut = shortcut;
}

/*************************************************************************/

/*
 * Instance Methods
 */

/**
  * Returns the label for this menu item, which may be <code>null</code>.
  *
  * @return The label for this menu item.
  */
public String
getLabel()
{
  return(label);
}

/*************************************************************************/

/**
  * This method sets the label for this menu to the specified value.
  *
  * @param label The new label for this menu item.
  */
public synchronized void
setLabel(String label)
{
  this.label = label;
  if (peer != null)
    {
      MenuItemPeer mp = (MenuItemPeer) peer;
      mp.setLabel (label);
    }
}

/*************************************************************************/

/**
  * Tests whether or not this menu item is enabled.
  *
  * @return <code>true</code> if this menu item is enabled, <code>false</code>
  * otherwise.
  */
public boolean
isEnabled()
{
  return(enabled);
}

/*************************************************************************/

/**
  * Sets the enabled status of this menu item.
  * 
  * @param enabled <code>true</code> to enable this menu item,
  * <code>false</code> otherwise.
  */
public synchronized void
setEnabled(boolean enabled)
{
  enable (enabled);
}

/*************************************************************************/

/**
  * Sets the enabled status of this menu item.
  * 
  * @param enabled <code>true</code> to enable this menu item,
  * <code>false</code> otherwise.
  *
  * @deprecated This method is deprecated in favor of <code>setEnabled()</code>.
  */
public void
enable(boolean enabled)
{
  if (enabled)
    enable ();
  else
    disable ();
}

/*************************************************************************/

/**
  * Enables this menu item.
  *
  * @deprecated This method is deprecated in favor of <code>setEnabled()</code>.
  */
public void
enable()
{
  if (enabled)
    return;

  this.enabled = true;
  if (peer != null)
    ((MenuItemPeer) peer).setEnabled (true);
}

/*************************************************************************/

/**
  * Disables this menu item.
  *
  * @deprecated This method is deprecated in favor of <code>setEnabled()</code>.
  */
public void
disable()
{
  if (!enabled)
    return;

  this.enabled = false;
  if (peer != null)
    ((MenuItemPeer) peer).setEnabled (false);
}

/*************************************************************************/

/**
  * Returns the shortcut for this menu item, which may be <code>null</code>.
  *
  * @return The shortcut for this menu item.
  */
public MenuShortcut
getShortcut()
{
  return(shortcut);
}

/*************************************************************************/

/**
  * Sets the shortcut for this menu item to the specified value.  This
  * must be done before the native peer is created.
  *
  * @param shortcut The new shortcut for this menu item.
  */
public void
setShortcut(MenuShortcut shortcut)
{
  this.shortcut = shortcut;
}

/*************************************************************************/

/**
  * Deletes the shortcut for this menu item if one exists.  This must be
  * done before the native peer is created.
  */
public void
deleteShortcut()
{
  shortcut = null;
}

/*************************************************************************/

/**
  * Returns the name of the action command in the action events
  * generated by this menu item.
  *
  * @return The action command name
  */
public String
getActionCommand()
{
  if (actionCommand == null)
    return label;
  else
    return actionCommand;
}

/*************************************************************************/

/**
  * Sets the name of the action command in the action events generated by
  * this menu item.
  *
  * @param actionCommand The new action command name.
  */
public void
setActionCommand(String actionCommand)
{
  this.actionCommand = actionCommand;
}

/*************************************************************************/

/**
  * Enables the specified events.  This is done automatically when a 
  * listener is added and does not normally need to be done by
  * application code.
  *
  * @param events The events to enable, which should be the bit masks
  * from <code>AWTEvent</code>.
  */
protected final void
enableEvents(long events)
{
  eventMask |= events;
  // TODO: see comment in Component.enableEvents().    
}

/*************************************************************************/

/**
  * Disables the specified events.
  *
  * @param events The events to enable, which should be the bit masks
  * from <code>AWTEvent</code>.
  */
protected final void
disableEvents(long events)
{
  eventMask &= ~events;
}

/*************************************************************************/

/**
  * Creates the native peer for this object.
  */
public void
addNotify()
{
  if (peer == null)
    peer = getToolkit ().createMenuItem (this);
}

/*************************************************************************/

/**
  * Adds the specified listener to the list of registered action listeners
  * for this component.
  *
  * @param listener The listener to add.
  */
public synchronized void
addActionListener(ActionListener listener)
{
  action_listeners = AWTEventMulticaster.add(action_listeners, listener);

  enableEvents(AWTEvent.ACTION_EVENT_MASK);
}

public synchronized void
removeActionListener(ActionListener l)
{
  action_listeners = AWTEventMulticaster.remove(action_listeners, l);
}

  public synchronized ActionListener[] getActionListeners()
  {
    return (ActionListener[])
      AWTEventMulticaster.getListeners(action_listeners,
                                       ActionListener.class);
  }

/** Returns all registered EventListers of the given listenerType. 
 * listenerType must be a subclass of EventListener, or a 
 * ClassClassException is thrown.
 * @since 1.3 
 */
  public EventListener[] getListeners(Class listenerType)
  {
    if (listenerType == ActionListener.class)
      return getActionListeners();
    return (EventListener[]) Array.newInstance(listenerType, 0);
  }

/*************************************************************************/

void
dispatchEventImpl(AWTEvent e)
{
  if (e.id <= ActionEvent.ACTION_LAST 
      && e.id >= ActionEvent.ACTION_FIRST
      && (action_listeners != null
	  || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0))
    processEvent(e);

  // Send the event to the parent menu if it has not yet been
  // consumed.
  if (!e.isConsumed ())
    ((Menu) getParent ()).processEvent (e);
}

/**
  * Processes the specified event by calling <code>processActionEvent()</code>
  * if it is an instance of <code>ActionEvent</code>.
  *
  * @param event The event to process.
  */
protected void
processEvent(AWTEvent event)
{
  if (event instanceof ActionEvent)
    processActionEvent((ActionEvent)event);
}

/*************************************************************************/

/**
  * Processes the specified event by dispatching it to any registered listeners.
  *
  * @param event The event to process.
  */
protected void
processActionEvent(ActionEvent event)
{
  if (action_listeners != null)
    {
      event.setSource(this);
      action_listeners.actionPerformed(event);
    }
}

/*************************************************************************/

/**
  * Returns a debugging string for this object.
  *
  * @return A debugging string for this object.
  */
public String
paramString()
{
  return ("label=" + label + ",enabled=" + enabled +
	  ",actionCommand=" + actionCommand + "," + super.paramString());
}

/**
 * Gets the AccessibleContext associated with this <code>MenuItem</code>.
 * The context is created, if necessary.
 *
 * @return the associated context
 */
public AccessibleContext getAccessibleContext()
{
  /* Create the context if this is the first request */
  if (accessibleContext == null)
    accessibleContext = new AccessibleAWTMenuItem();
  return accessibleContext;
}

/**
 * Generate a unique name for this <code>MenuItem</code>.
 *
 * @return A unique name for this <code>MenuItem</code>.
 */
String generateName()
{
  return "menuitem" + getUniqueLong();
}

private static synchronized long getUniqueLong()
{
  return next_menuitem_number++;
}

} // class MenuItem 
