| /* 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 EventListener[] getListeners(Class listenerType) | |
| { | |
| if (listenerType == ActionListener.class) | |
| return getActionListeners(); | |
| return (EventListener[]) 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 | |