/* Button.java -- AWT button widget
   Copyright (C) 1999, 2002, 2004, 2005  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.ButtonPeer;
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 provides a button widget for the AWT.
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  * @author Tom Tromey (tromey@cygnus.com)
  */
public class Button extends Component
  implements java.io.Serializable, Accessible
{

/*
 * Static Variables
 */

// FIXME: Need readObject/writeObject for serialization

// Serialization version constant
private static final long serialVersionUID = -8774683716313001058L;

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

/*
 * Instance Variables
 */

/**
  * @serial The action command name for this button.
  * This is package-private to avoid an accessor method.
  */
String actionCommand;

/**
  * @serial The label for this button.
  * This is package-private to avoid an accessor method.
  */
String label;

// List of ActionListeners for this class.
private transient ActionListener action_listeners;

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

  protected class AccessibleAWTButton extends AccessibleAWTComponent
    implements AccessibleAction, AccessibleValue
  {
    private static final long serialVersionUID = -5932203980244017102L;

    protected AccessibleAWTButton()
    {
      // Do nothing here.
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
     */
    public int getAccessibleActionCount()
    {
      // Only 1 action possible
      return 1;
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
     */
    public String getAccessibleActionDescription(int i)
    {
      // JDK 1.4.2 returns the string "click" for action 0.  However, the API
      // docs don't say what the string to be returned is, beyond being a
      // description of the action.  So we return the same thing for
      // compatibility with 1.4.2.
      if (i == 0)
        return "click";
      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 String getAccessibleName()
    {
      return label;
    }

    public AccessibleAction getAccessibleAction()
    {
      return this;
    }

    public AccessibleValue getAccessibleValue()
    {
      return this;
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
     */
    public Number getCurrentAccessibleValue()
    {
      // Docs say return 1 if selected, but buttons can't be selected, right?
      return new Integer(0);
    }

    /* (non-Javadoc)
     * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
     */
    public boolean setCurrentAccessibleValue(Number number)
    {
      // Since there's no selection with buttons, we're ignoring this.
      // TODO someone who knows shoulw check this.
      return false;
    }

    /* (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);
    }

    public AccessibleRole getAccessibleRole()
    {
      return AccessibleRole.PUSH_BUTTON;
    }
  }

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

/*
 * Constructors
 */

/**
  * Initializes a new instance of <code>Button</code> with no label.
  *
  * @exception HeadlessException If GraphicsEnvironment.isHeadless()
  * returns true
  */
public
Button()
{
  this("");
}

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

/**
  * Initializes a new instance of <code>Button</code> with the specified
  * label.  The action command name is also initialized to this value.
  *
  * @param label The label to display on the button.
  *
  * @exception HeadlessException If GraphicsEnvironment.isHeadless()
  * returns true
  */
public
Button(String label)
{
  this.label = label;
  actionCommand = label;

  if (GraphicsEnvironment.isHeadless ())
    throw new HeadlessException ();
}

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

/*
 * Instance Variables
 */

/**
  * Returns the label for this button.
  *
  * @return The label for this button.
  */
public String
getLabel()
{
  return(label);
}

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

/**
  * Sets the label for this button to the specified value.
  *
  * @param label The new label for this button.
  */
public synchronized void
setLabel(String label)
{
  this.label = label;
  actionCommand = label;
  if (peer != null)
    {
      ButtonPeer bp = (ButtonPeer) peer;
      bp.setLabel (label);
    }
}

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

/**
  * Returns the action command name for this button.
  *
  * @return The action command name for this button.
  */
public String
getActionCommand()
{
  return(actionCommand);
}

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

/**
  * Sets the action command name for this button to the specified value.
  *
  * @param actionCommand The new action command name.
  */
public void
setActionCommand(String actionCommand)
{
  this.actionCommand = actionCommand == null ? label : actionCommand;
}

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

/**
  * Adds a new entry to the list of listeners that will receive
  * action events from this button.
  *
  * @param listener The listener to add.
  */
public synchronized void
addActionListener(ActionListener listener)
{
  action_listeners = AWTEventMulticaster.add(action_listeners, listener);
}

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

/**
  * Removes the specified listener from the list of listeners that will
  * receive action events from this button.
  *
  * @param listener The listener to remove.
  */
public synchronized void
removeActionListener(ActionListener listener)
{
  action_listeners = AWTEventMulticaster.remove(action_listeners, listener);
}

  /**
   * Returns all added <code>ActionListener</code> objects.
   *
   * @return an array of listeners
   *
   * @since 1.4
   */
  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.
 *
 * @param listenerType the listener type to return
 *
 * @return an array of listeners
 *
 * @exception ClassCastException If listenerType doesn't specify a class or
 * interface that implements @see java.util.EventListener.
 *
 * @since 1.3
 */
  public <T extends EventListener> T[] getListeners(Class<T> listenerType)
  {
    if (listenerType == ActionListener.class)
      return (T[]) getActionListeners();
    return (T[]) Array.newInstance(listenerType, 0);
  }

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

/**
  * Notifies this button that it should create its native peer object.
  */
public void
addNotify()
{
  if (peer == null)
    peer = getToolkit ().createButton (this);
  super.addNotify();
}

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

/**
  * Processes an event for this button.  If the specified event is an
  * instance of <code>ActionEvent</code>, then the
  * <code>processActionEvent()</code> method is called to dispatch it
  * to any registered listeners.  Otherwise, the superclass method
  * will be invoked.  Note that this method will not be called at all
  * unless <code>ActionEvent</code>'s are enabled.  This will be done
  * implicitly if any listeners are added.
  *
  * @param event The event to process.
  */
protected void
processEvent(AWTEvent event)
{
  if (event instanceof ActionEvent)
    processActionEvent((ActionEvent)event);
  else
    super.processEvent(event);
}

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

/**
  * This method dispatches an action event for this button to any
  * registered listeners.
  *
  * @param event The event to process.
  */
protected void
processActionEvent(ActionEvent event)
{
  if (action_listeners != null)
    action_listeners.actionPerformed(event);
}

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);
  else
    super.dispatchEventImpl(e);
}

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

/**
  * Returns a debugging string for this button.
  *
  * @return A debugging string for this button.
  */
protected String
paramString()
{
  return getName () + "," + getX () + "," + getY () + ","
    + getWidth () + "x" + getHeight () + ",label=" + getLabel ();
}

/**
 * Gets the AccessibleContext associated with this <code>Button</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 AccessibleAWTButton();
  return accessibleContext;
}

  /**
   * Generate a unique name for this button.
   *
   * @return A unique name for this button.
   */
  String generateName ()
  {
    return "button" + getUniqueLong ();
  }

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

} // class Button
