| /* 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 |