/* Checkbox.java -- An AWT checkbox widget
   Copyright (C) 1999, 2000, 2001, 2002, 2005, 2006
   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.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.peer.CheckboxPeer;
import java.io.Serializable;

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

/**
 * This class implements a component which has an on/off state.  Two
 * or more Checkboxes can be grouped by a CheckboxGroup.
 *
 * @author Aaron M. Renn (arenn@urbanophile.com)
 * @author Tom Tromey (tromey@redhat.com)
 */
public class Checkbox extends Component
  implements ItemSelectable, Accessible, Serializable
{

// FIXME: Need readObject/writeObject for this.

/*
 * Static Variables
 */

// Serialization Constant
private static final long serialVersionUID = 7270714317450821763L;

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

/*
 * Instance Variables
 */

/**
  * @serial The checkbox group for this checkbox.
  */
private CheckboxGroup group;

/**
  * @serial The label on this checkbox.
  */
private String label;

/**
  * @serial The state of this checkbox.
  * This is package-private to avoid an accessor method.
  */
boolean state;

// The list of listeners for this object.
private transient ItemListener item_listeners;

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

/**
 * This class provides accessibility support for the
 * checkbox.
 *
 * @author Jerry Quinn  (jlquinn@optonline.net)
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 */
protected class AccessibleAWTCheckbox
  extends AccessibleAWTComponent
  implements ItemListener, AccessibleAction, AccessibleValue
{
  /**
   * Serialization constant to match JDK 1.5
   */
  private static final long serialVersionUID = 7881579233144754107L;

  /**
   * Default constructor which simply calls the
   * super class for generic component accessibility
   * handling.
   */
  public AccessibleAWTCheckbox()
  {
    super();
  }

  /**
   * Captures changes to the state of the checkbox and
   * fires appropriate accessible property change events.
   *
   * @param event the event fired.
   * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
   */
  public void itemStateChanged(ItemEvent event)
  {
    firePropertyChange(ACCESSIBLE_STATE_PROPERTY,
		       state ? null : AccessibleState.CHECKED,
                       state ? AccessibleState.CHECKED : null);
  }
  
  /**
   * Returns an implementation of the <code>AccessibleAction</code>
   * interface for this accessible object.  In this case, the
   * current instance is simply returned (with a more appropriate
   * type), as it also implements the accessible action as well as
   * the context.
   *
   * @return the accessible action associated with this context.
   * @see javax.accessibility.AccessibleAction
   */
  public AccessibleAction getAccessibleAction()
  {
    return this;
  }
  
  /**
   * Returns an implementation of the <code>AccessibleValue</code>
   * interface for this accessible object.  In this case, the
   * current instance is simply returned (with a more appropriate
   * type), as it also implements the accessible value as well as
   * the context.
   *
   * @return the accessible value associated with this context.
   * @see javax.accessibility.AccessibleValue
   */
  public AccessibleValue getAccessibleValue()
  {
    return this;
  }
  
  /* 
   * The following methods are implemented in the JDK (up to
   * 1.5) as stubs.  We do likewise here.
   */

  /**
   * Returns the number of actions associated with this accessible
   * object.  This default implementation returns 0.
   *
   * @return the number of accessible actions available.
   * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
   */
  public int getAccessibleActionCount()
  {
    // 1.4.1 and 1.5 do this
    return 0;
  }

  /**
   * Returns a description of the action with the supplied id.
   * This default implementation always returns null.
   *
   * @param i the id of the action whose description should be
   *          retrieved.
   * @return a <code>String</code> describing the action.
   * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
   */
  public String getAccessibleActionDescription(int i)
  {
    // 1.5 does this
    return null;
  }

  /**
   * Executes the action with the specified id.  This
   * default implementation simply returns false.
   *
   * @param i the id of the action to perform.
   * @return true if the action was performed.
   * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
   */
  public boolean doAccessibleAction(int i)
  {
    // 1.5 does this
    return false;
  }

  /**
   * Returns the current value of this accessible object.
   * If no value has been set, null is returned.  This
   * default implementation always returns null, regardless.
   *
   * @return the numeric value of this object, or null if
   *         no value has been set.
   * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
   */
  public Number getCurrentAccessibleValue()
  {
    // 1.5 does this
    return null;
  }

  /**
   * Sets the current value of this accessible object
   * to that supplied.  In this default implementation,
   * the value is never set and the method always returns
   * false.
   *
   * @param number the new accessible value.
   * @return true if the value was set.
   * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
   */
  public boolean setCurrentAccessibleValue(Number number)
  {
    // 1.5 does this
    return false;
  }

  /**
   * Returns the minimum acceptable accessible value used
   * by this object, or null if no minimum value exists.
   * This default implementation always returns null.
   *
   * @return the minimum acceptable accessible value, or null
   *         if there is no minimum.
   * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue()
   */
  public Number getMinimumAccessibleValue()
  {
    return null;
  }

  /**
   * Returns the maximum acceptable accessible value used
   * by this object, or null if no maximum value exists.
   * This default implementation always returns null.
   *
   * @return the maximum acceptable accessible value, or null
   *         if there is no maximum.
   * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue()
   */
  public Number getMaximumAccessibleValue()
  {
    return null;
  }
  
  /**
   * Returns the role of this accessible object.
   *
   * @return the instance of <code>AccessibleRole</code>,
   *         which describes this object.
   * @see javax.accessibility.AccessibleRole
   */
  public AccessibleRole getAccessibleRole() 
  {
    return AccessibleRole.CHECK_BOX;
  }
  
  /**
   * Returns the state set of this accessible object.
   *
   * @return a set of <code>AccessibleState</code>s
   *         which represent the current state of the
   *         accessible object.
   * @see javax.accessibility.AccessibleState
   * @see javax.accessibility.AccessibleStateSet
   */
  public AccessibleStateSet getAccessibleStateSet()
  {
    AccessibleStateSet set = super.getAccessibleStateSet();
    if (state)
      set.add(AccessibleState.CHECKED);
    return set;
  }

}

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

/*
 * Constructors
 */

/**
  * Initializes a new instance of <code>Checkbox</code> with no label,
  * an initial state of off, and that is not part of any checkbox group.
  */
public 
Checkbox()
{
  this("", false, null);
}

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

/**
  * Initializes a new instance of <code>Checkbox</code> with the specified
  * label, an initial state of off, and that is not part of any checkbox
  * group.
  *
  * @param label The label for this checkbox.
  */
public
Checkbox(String label)
{
  this(label, false, null);
}

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

/**
  * Initializes a new instance of <code>Checkbox</code> with the specified
  * label and initial state, and that is not part of any checkbox
  * group.
  *
  * @param label The label for this checkbox.
  * @param state The initial state of the checkbox, <code>true</code> for
  * on, <code>false</code> for off.
  */
public
Checkbox(String label, boolean state)
{
  this(label, state, null);
}

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

/**
  * Initializes a new instance of <code>Checkbox</code> with the specified
  * label, initial state, and checkbox group.
  *
  * @param label The label for this checkbox.
  * @param group The checkbox group for this box, or <code>null</code>
  * if there is no checkbox group.
  * @param state The initial state of the checkbox, <code>true</code> for
  * on, <code>false</code> for off.
  */
public
Checkbox(String label, CheckboxGroup group, boolean state)
{
  this(label, state, group);
}

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

/**
  * Initializes a new instance of <code>Checkbox</code> with the specified
  * label, initial state, and checkbox group.
  *
  * @param label The label for this checkbox.
  * @param state The initial state of the checkbox, <code>true</code> for
  * on, <code>false</code> for off.
  * @param group The checkbox group for this box, or <code>null</code>
  * if there is no checkbox group.
  */
public
Checkbox(String label, boolean state, CheckboxGroup group)
{
  this.label = label;
  this.state = state;
  this.group = group;

  if ( state && group != null )
    {
      group.setSelectedCheckbox(this);
    }
}

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

/*
 * Instance Variables
 */

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

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

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

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

/**
  * Returns the state of this checkbox.
  *
  * @return The state of this checkbox, which will be <code>true</code> for
  * on and <code>false</code> for off.
  */
public boolean
getState()
{
  return(state);
}

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

/**
  * Sets the state of this checkbox to the specified value.
  *
  * @param state The new state of the checkbox, which will be <code>true</code>
  * for on or <code>false</code> for off.
  */
public synchronized void
setState(boolean state)
{
  if (this.state != state)
    {
      this.state = state;
      if (peer != null)
	{
	  CheckboxPeer cp = (CheckboxPeer) peer;
	  cp.setState (state);
	}
    }
}

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

/**
  * Returns an array of length one containing the checkbox label if this
  * checkbox is selected.  Otherwise <code>null</code> is returned.
  *
  * @return The selection state of this checkbox.
  */
public Object[]
getSelectedObjects()
{
  if (state == false)
    return(null);

  Object[] objs = new Object[1];
  objs[0] = label;

  return(objs);
}

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

/**
  * Returns the checkbox group this object is a member of, if any.
  *
  * @return This object's checkbox group, of <code>null</code> if it is
  * not a member of any group.
  */
public CheckboxGroup
getCheckboxGroup()
{
  return(group);
}

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

/**
  * Sets this object's checkbox group to the specified group.
  *
  * @param group The new checkbox group, or <code>null</code> to make this
  * object part of no checkbox group.
  */
public synchronized void
setCheckboxGroup(CheckboxGroup group)
{
  this.group = group;
  if (peer != null)
    {
      CheckboxPeer cp = (CheckboxPeer) peer;
      cp.setCheckboxGroup (group);
    }
}

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

/**
  * Creates this object's native peer.
  */
public void
addNotify()
{
  if (peer == null)
    peer = getToolkit ().createCheckbox (this);
  super.addNotify ();
}

  public ItemListener[] getItemListeners ()
  {
    return (ItemListener[])
      AWTEventMulticaster.getListeners (item_listeners, ItemListener.class);
  }

/**
  * Adds a new listeners to the list of registered listeners for this object.
  *
  * @param listener The new listener to add.
  */
public synchronized void
addItemListener(ItemListener listener)
{
  item_listeners = AWTEventMulticaster.add(item_listeners, listener);
}

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

/**
  * Removes a listener from the list of registered listeners for this object.
  *
  * @param listener The listener to remove.
  */
public synchronized void
removeItemListener(ItemListener listener)
{
  item_listeners = AWTEventMulticaster.remove(item_listeners, listener);
}

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

/**
  * Processes this event by calling <code>processItemEvent()</code> if it
  * is any instance of <code>ItemEvent</code>.  Otherwise it is passed to
  * the superclass for processing.
  *
  * @param event The event to process.
  */
protected void
processEvent(AWTEvent event)
{
  if (event instanceof ItemEvent)
    processItemEvent((ItemEvent)event);
  else
    super.processEvent(event);
}

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

/**
  * Processes this event by dispatching it to any registered listeners.
  *
  * @param event The <code>ItemEvent</code> to process.
  */
protected void
processItemEvent(ItemEvent event)
{
  if (item_listeners != null)
    item_listeners.itemStateChanged(event);
}

void
dispatchEventImpl(AWTEvent e)
{
  if (e.id <= ItemEvent.ITEM_LAST
      && e.id >= ItemEvent.ITEM_FIRST)
    {
      ItemEvent ie = (ItemEvent) e;
      int itemState = ie.getStateChange();
      setState(itemState == ItemEvent.SELECTED ? true : false);
      if (item_listeners != null 
	  || (eventMask & AWTEvent.ITEM_EVENT_MASK) != 0)
	processEvent(e);
    }
  else
    super.dispatchEventImpl(e);
}

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

/**
  * Returns a debugging string for this object.
  */
protected String
paramString()
{
  // Note: We cannot add the checkbox group information here because this
  // would trigger infinite recursion when CheckboxGroup.toString() is
  // called and the box is in its selected state.
  return ("label=" + label + ",state=" + state + "," + super.paramString());
}

/**
 * Gets the AccessibleContext associated with this <code>Checkbox</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)
  {
    AccessibleAWTCheckbox ac = new AccessibleAWTCheckbox();
    accessibleContext = ac;
    addItemListener(ac);
  }
  return accessibleContext;
}

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

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