mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			810 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			810 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* JMenuItem.java --
 | |
|    Copyright (C) 2002, 2004, 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 javax.swing;
 | |
| 
 | |
| import java.awt.Component;
 | |
| import java.awt.event.KeyEvent;
 | |
| import java.awt.event.MouseEvent;
 | |
| import java.beans.PropertyChangeEvent;
 | |
| import java.beans.PropertyChangeListener;
 | |
| import java.util.EventListener;
 | |
| 
 | |
| import javax.accessibility.Accessible;
 | |
| import javax.accessibility.AccessibleContext;
 | |
| import javax.accessibility.AccessibleRole;
 | |
| import javax.accessibility.AccessibleState;
 | |
| import javax.swing.event.ChangeEvent;
 | |
| import javax.swing.event.ChangeListener;
 | |
| import javax.swing.event.MenuDragMouseEvent;
 | |
| import javax.swing.event.MenuDragMouseListener;
 | |
| import javax.swing.event.MenuKeyEvent;
 | |
| import javax.swing.event.MenuKeyListener;
 | |
| import javax.swing.plaf.MenuItemUI;
 | |
| 
 | |
| /**
 | |
|  * JMenuItem represents element in the menu. It inherits most of
 | |
|  * its functionality from AbstractButton, however its behavior somewhat
 | |
|  * varies from it. JMenuItem fire different kinds of events.
 | |
|  * PropertyChangeEvents are fired when menuItems properties are modified;
 | |
|  * ChangeEvents are fired when menuItem's state changes and actionEvents are
 | |
|  * fired when menu item is selected. In addition to this events menuItem also
 | |
|  * fire MenuDragMouseEvent and MenuKeyEvents when mouse is dragged over
 | |
|  * the menu item or associated key with menu item is invoked respectively.
 | |
|  */
 | |
| public class JMenuItem extends AbstractButton implements Accessible,
 | |
|                                                          MenuElement
 | |
| {
 | |
|   private static final long serialVersionUID = -1681004643499461044L;
 | |
| 
 | |
|   /** Combination of keyboard keys that can be used to activate this menu item */
 | |
|   private KeyStroke accelerator;
 | |
| 
 | |
|   /**
 | |
|    * Indicates if we are currently dragging the mouse.
 | |
|    */
 | |
|   private boolean isDragging;
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem object.
 | |
|    */
 | |
|   public JMenuItem()
 | |
|   {
 | |
|     this(null, null);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem with the given icon.
 | |
|    *
 | |
|    * @param icon Icon that will be displayed on the menu item
 | |
|    */
 | |
|   public JMenuItem(Icon icon)
 | |
|   {
 | |
|     // FIXME: The requestedFocusEnabled property should
 | |
|     // be set to false, when only icon is set for menu item.
 | |
|     this(null, icon);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem with the given label.
 | |
|    *
 | |
|    * @param text label for the menu item
 | |
|    */
 | |
|   public JMenuItem(String text)
 | |
|   {
 | |
|     this(text, null);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem associated with the specified action.
 | |
|    *
 | |
|    * @param action action for this menu item
 | |
|    */
 | |
|   public JMenuItem(Action action)
 | |
|   {
 | |
|     super();
 | |
|     super.setAction(action);
 | |
|     setModel(new DefaultButtonModel());
 | |
|     init(null, null);
 | |
|     if (action != null)
 | |
|       {
 | |
|         String name = (String) action.getValue(Action.NAME);
 | |
|         if (name != null)
 | |
|           setName(name);
 | |
| 
 | |
|         KeyStroke accel = (KeyStroke) action.getValue(Action.ACCELERATOR_KEY);
 | |
|         if (accel != null)
 | |
|           setAccelerator(accel);
 | |
| 
 | |
|         Integer mnemonic = (Integer) action.getValue(Action.MNEMONIC_KEY);
 | |
|         if (mnemonic != null)
 | |
|           setMnemonic(mnemonic.intValue());
 | |
| 
 | |
|         String command = (String) action.getValue(Action.ACTION_COMMAND_KEY);
 | |
|         if (command != null)
 | |
|           setActionCommand(command);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem with specified text and icon.
 | |
|    * Text is displayed to the left of icon by default.
 | |
|    *
 | |
|    * @param text label for this menu item
 | |
|    * @param icon icon that will be displayed on this menu item
 | |
|    */
 | |
|   public JMenuItem(String text, Icon icon)
 | |
|   {
 | |
|     super();
 | |
|     setModel(new DefaultButtonModel());
 | |
|     init(text, icon);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JMenuItem object.
 | |
|    *
 | |
|    * @param text label for this menu item
 | |
|    * @param mnemonic - Single key that can be used with a
 | |
|    * look-and-feel meta key to activate this menu item. However
 | |
|    * menu item should be visible on the screen when mnemonic is used.
 | |
|    */
 | |
|   public JMenuItem(String text, int mnemonic)
 | |
|   {
 | |
|     this(text, null);
 | |
|     setMnemonic(mnemonic);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Initializes this menu item
 | |
|    *
 | |
|    * @param text label for this menu item
 | |
|    * @param icon icon to be displayed for this menu item
 | |
|    */
 | |
|   protected void init(String text, Icon icon)
 | |
|   {
 | |
|     super.init(text, icon);
 | |
| 
 | |
|     // Initializes properties for this menu item, that are different
 | |
|     // from Abstract button properties.
 | |
|     /* NOTE: According to java specifications paint_border should be set to false,
 | |
|       since menu item should not have a border. However running few java programs
 | |
|       it seems that menu items and menues can have a border. Commenting
 | |
|       out statement below for now. */
 | |
|     //borderPainted = false;
 | |
|     focusPainted = false;
 | |
|     horizontalAlignment = JButton.LEADING;
 | |
|     horizontalTextPosition = JButton.TRAILING;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Set the "UI" property of the menu item, which is a look and feel class
 | |
|    * responsible for handling menuItem's input events and painting it.
 | |
|    *
 | |
|    * @param ui The new "UI" property
 | |
|    */
 | |
|   public void setUI(MenuItemUI ui)
 | |
|   {
 | |
|     super.setUI(ui);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets this menuItem's UI to the UIManager's default for the
 | |
|    * current look and feel.
 | |
|    */
 | |
|   public void updateUI()
 | |
|   {
 | |
|     setUI((MenuItemUI) UIManager.getUI(this));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a name to identify which look and feel class will be
 | |
|    * the UI delegate for the menuItem.
 | |
|    *
 | |
|    * @return The Look and Feel classID. "MenuItemUI"
 | |
|    */
 | |
|   public String getUIClassID()
 | |
|   {
 | |
|     return "MenuItemUI";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns true if button's model is armed and false otherwise. The
 | |
|    * button model is armed if menu item has focus or it is selected.
 | |
|    *
 | |
|    * @return $boolean$ true if button's model is armed and false otherwise
 | |
|    */
 | |
|   public boolean isArmed()
 | |
|   {
 | |
|     return getModel().isArmed();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets menuItem's "ARMED" property
 | |
|    *
 | |
|    * @param armed DOCUMENT ME!
 | |
|    */
 | |
|   public void setArmed(boolean armed)
 | |
|   {
 | |
|     getModel().setArmed(armed);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Enable or disable menu item. When menu item is disabled,
 | |
|    * its text and icon are grayed out if they exist.
 | |
|    *
 | |
|    * @param enabled if true enable menu item, and disable otherwise.
 | |
|    */
 | |
|   public void setEnabled(boolean enabled)
 | |
|   {
 | |
|     super.setEnabled(enabled);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return accelerator for this menu item.
 | |
|    *
 | |
|    * @return $KeyStroke$ accelerator for this menu item.
 | |
|    */
 | |
|   public KeyStroke getAccelerator()
 | |
|   {
 | |
|     return accelerator;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the key combination which invokes the menu item's action
 | |
|    * listeners without navigating the menu hierarchy. Note that when the
 | |
|    * keyboard accelerator is typed, it will work whether or not the
 | |
|    * menu is currently displayed.
 | |
|    *
 | |
|    * @param keystroke accelerator for this menu item.
 | |
|    */
 | |
|   public void setAccelerator(KeyStroke keystroke)
 | |
|   {
 | |
|     KeyStroke old = this.accelerator;
 | |
|     this.accelerator = keystroke;
 | |
|     firePropertyChange ("accelerator", old, keystroke);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Configures menu items' properties from properties of the specified action.
 | |
|    * This method overrides configurePropertiesFromAction from AbstractButton
 | |
|    * to also set accelerator property.
 | |
|    *
 | |
|    * @param action action to configure properties from
 | |
|    */
 | |
|   protected void configurePropertiesFromAction(Action action)
 | |
|   {
 | |
|     super.configurePropertiesFromAction(action);
 | |
| 
 | |
|     if (! (this instanceof JMenu) && action != null)
 | |
|       {
 | |
|         setAccelerator((KeyStroke) (action.getValue(Action.ACCELERATOR_KEY)));
 | |
|         if (accelerator != null)
 | |
|           super.registerKeyboardAction(action, accelerator,
 | |
|                                        JComponent.WHEN_IN_FOCUSED_WINDOW);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates PropertyChangeListener to listen for the changes in action
 | |
|    * properties.
 | |
|    *
 | |
|    * @param action action to listen to for property changes
 | |
|    *
 | |
|    * @return $PropertyChangeListener$ Listener that listens to changes in
 | |
|    * action properties.
 | |
|    */
 | |
|   protected PropertyChangeListener createActionPropertyChangeListener(Action action)
 | |
|   {
 | |
|     return new PropertyChangeListener()
 | |
|       {
 | |
|         public void propertyChange(PropertyChangeEvent e)
 | |
|         {
 | |
|           Action act = (Action) (e.getSource());
 | |
|           configurePropertiesFromAction(act);
 | |
|         }
 | |
|       };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Process mouse events forwarded from MenuSelectionManager.
 | |
|    *
 | |
|    * @param ev event forwarded from MenuSelectionManager
 | |
|    * @param path path to the menu element from which event was generated
 | |
|    * @param manager MenuSelectionManager for the current menu hierarchy
 | |
|    */
 | |
|   public void processMouseEvent(MouseEvent ev, MenuElement[] path,
 | |
|                                 MenuSelectionManager manager)
 | |
|   {
 | |
|     MenuDragMouseEvent e = new MenuDragMouseEvent(ev.getComponent(),
 | |
|                                                   ev.getID(), ev.getWhen(),
 | |
|                                                   ev.getModifiers(), ev.getX(),
 | |
|                                                   ev.getY(),
 | |
|                                                   ev.getClickCount(),
 | |
|                                                   ev.isPopupTrigger(), path,
 | |
|                                                   manager);
 | |
|     processMenuDragMouseEvent(e);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Process key events forwarded from MenuSelectionManager.
 | |
|    *
 | |
|    * @param event event forwarded from MenuSelectionManager
 | |
|    * @param path path to the menu element from which event was generated
 | |
|    * @param manager MenuSelectionManager for the current menu hierarchy
 | |
|    */
 | |
|   public void processKeyEvent(KeyEvent event, MenuElement[] path,
 | |
|                               MenuSelectionManager manager)
 | |
|   {
 | |
|     MenuKeyEvent e = new MenuKeyEvent(event.getComponent(), event.getID(),
 | |
|                                       event.getWhen(), event.getModifiers(),
 | |
|                                       event.getKeyCode(), event.getKeyChar(),
 | |
|                                       path, manager);
 | |
|     processMenuKeyEvent(e);
 | |
| 
 | |
|     // Consume original key event, if the menu key event has been consumed.
 | |
|     if (e.isConsumed())
 | |
|       event.consume();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires MenuDragMouseEvents to registered listeners.
 | |
|    * Different types of MenuDragMouseEvents are fired depending
 | |
|    * on the observed mouse event.
 | |
|    *
 | |
|    * @param event Mouse
 | |
|    */
 | |
|   public void processMenuDragMouseEvent(MenuDragMouseEvent event)
 | |
|   {
 | |
|     switch (event.getID())
 | |
|       {
 | |
|       case MouseEvent.MOUSE_ENTERED:
 | |
|         isDragging = false;
 | |
|         fireMenuDragMouseEntered(event);
 | |
|         break;
 | |
|       case MouseEvent.MOUSE_EXITED:
 | |
|         isDragging = false;
 | |
|         fireMenuDragMouseExited(event);
 | |
|         break;
 | |
|       case MouseEvent.MOUSE_DRAGGED:
 | |
|         isDragging = true;
 | |
|         fireMenuDragMouseDragged(event);
 | |
|         break;
 | |
|       case MouseEvent.MOUSE_RELEASED:
 | |
|         if (isDragging)
 | |
|           fireMenuDragMouseReleased(event);
 | |
|         break;
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires MenuKeyEvent to registered listeners.
 | |
|    * Different types of MenuKeyEvents are fired depending
 | |
|    * on the observed key event.
 | |
|    *
 | |
|    * @param event DOCUMENT ME!
 | |
|    */
 | |
|   public void processMenuKeyEvent(MenuKeyEvent event)
 | |
|   {
 | |
|     switch (event.getID())
 | |
|     {
 | |
|       case KeyEvent.KEY_PRESSED:
 | |
|         fireMenuKeyPressed(event);
 | |
|         break;
 | |
|       case KeyEvent.KEY_RELEASED:
 | |
|         fireMenuKeyReleased(event);
 | |
|         break;
 | |
|       case KeyEvent.KEY_TYPED:
 | |
|         fireMenuKeyTyped(event);
 | |
|         break;
 | |
|       default:
 | |
|         break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners.
 | |
|    *
 | |
|    * @param event The event signifying that mouse entered menuItem while it was dragged
 | |
|    */
 | |
|   protected void fireMenuDragMouseEntered(MenuDragMouseEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuDragMouseListener) ll[i]).menuDragMouseEntered(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners.
 | |
|    *
 | |
|    * @param event The event signifying that mouse has exited menu item, while it was dragged
 | |
|    */
 | |
|   protected void fireMenuDragMouseExited(MenuDragMouseEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuDragMouseListener) ll[i]).menuDragMouseExited(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Fires MenuDragMouseEvent to all of the menuItem's MouseInputListeners.
 | |
|    *
 | |
|    * @param event The event signifying that mouse is being dragged over the menuItem
 | |
|    */
 | |
|   protected void fireMenuDragMouseDragged(MenuDragMouseEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuDragMouseListener) ll[i]).menuDragMouseDragged(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires a MenuDragMouseEvent to all the MenuItem's MouseInputListeners.
 | |
|    *
 | |
|    * @param event The event signifying that mouse was released while it was dragged over the menuItem
 | |
|    */
 | |
|   protected void fireMenuDragMouseReleased(MenuDragMouseEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuDragMouseListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuDragMouseListener) ll[i]).menuDragMouseReleased(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners.
 | |
|    *
 | |
|    * @param event The event signifying that key associated with this menu was pressed
 | |
|    */
 | |
|   protected void fireMenuKeyPressed(MenuKeyEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuKeyListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuKeyListener) ll[i]).menuKeyPressed(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners.
 | |
|    *
 | |
|    * @param event The event signifying that key associated with this menu was released
 | |
|    */
 | |
|   protected void fireMenuKeyReleased(MenuKeyEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuKeyListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuKeyListener) ll[i]).menuKeyTyped(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires a MenuKeyEvent to all the MenuItem's MenuKeyListeners.
 | |
|    *
 | |
|    * @param event The event signifying that key associated with this menu was typed.
 | |
|    *        The key is typed when it was pressed and then released
 | |
|    */
 | |
|   protected void fireMenuKeyTyped(MenuKeyEvent event)
 | |
|   {
 | |
|     EventListener[] ll = listenerList.getListeners(MenuKeyListener.class);
 | |
| 
 | |
|     for (int i = 0; i < ll.length; i++)
 | |
|       ((MenuKeyListener) ll[i]).menuKeyTyped(event);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Method of the MenuElement interface.
 | |
|    * This method is invoked by MenuSelectionManager when selection of
 | |
|    * this menu item has changed. If this menu item was selected then
 | |
|    * arm it's model, and disarm the model otherwise. The menu item
 | |
|    * is considered to be selected, and thus highlighted when its model
 | |
|    * is armed.
 | |
|    *
 | |
|    * @param changed indicates selection status of this menu item. If changed is
 | |
|    * true then menu item is selected and deselected otherwise.
 | |
|    */
 | |
|   public void menuSelectionChanged(boolean changed)
 | |
|   {
 | |
|     Component parent = this.getParent();
 | |
|     if (changed)
 | |
|       {
 | |
|         model.setArmed(true);
 | |
| 
 | |
|         if (parent != null && parent instanceof JPopupMenu)
 | |
|           ((JPopupMenu) parent).setSelected(this);
 | |
|       }
 | |
|     else
 | |
|       {
 | |
|         model.setArmed(false);
 | |
| 
 | |
|         if (parent != null && parent instanceof JPopupMenu)
 | |
|           ((JPopupMenu) parent).getSelectionModel().clearSelection();
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Method of the MenuElement interface.
 | |
|    *
 | |
|    * @return $MenuElement[]$ Returns array of sub-components for this menu
 | |
|    *         item. By default menuItem doesn't have any subcomponents and so
 | |
|    *         empty array is returned instead.
 | |
|    */
 | |
|   public MenuElement[] getSubElements()
 | |
|   {
 | |
|     return new MenuElement[0];
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns reference to the component that will paint this menu item.
 | |
|    *
 | |
|    * @return $Component$ Component that will paint this menu item.
 | |
|    *         Simply returns reference to this menu item.
 | |
|    */
 | |
|   public Component getComponent()
 | |
|   {
 | |
|     return this;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Adds a MenuDragMouseListener to this menu item. When mouse
 | |
|    * is dragged over the menu item the MenuDragMouseEvents will be
 | |
|    * fired, and these listeners will be called.
 | |
|    *
 | |
|    * @param listener The new listener to add
 | |
|    */
 | |
|   public void addMenuDragMouseListener(MenuDragMouseListener listener)
 | |
|   {
 | |
|     listenerList.add(MenuDragMouseListener.class, listener);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes a MenuDragMouseListener from the menuItem's listener list.
 | |
|    *
 | |
|    * @param listener The listener to remove
 | |
|    */
 | |
|   public void removeMenuDragMouseListener(MenuDragMouseListener listener)
 | |
|   {
 | |
|     listenerList.remove(MenuDragMouseListener.class, listener);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns all added MenuDragMouseListener objects.
 | |
|    *
 | |
|    * @return an array of listeners
 | |
|    *
 | |
|    * @since 1.4
 | |
|    */
 | |
|   public MenuDragMouseListener[] getMenuDragMouseListeners()
 | |
|   {
 | |
|     return (MenuDragMouseListener[]) listenerList.getListeners(MenuDragMouseListener.class);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Adds an MenuKeyListener to this menu item.  This listener will be
 | |
|    * invoked when MenuKeyEvents will be fired by this menu item.
 | |
|    *
 | |
|    * @param listener The new listener to add
 | |
|    */
 | |
|   public void addMenuKeyListener(MenuKeyListener listener)
 | |
|   {
 | |
|     listenerList.add(MenuKeyListener.class, listener);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes an MenuKeyListener from the menuItem's listener list.
 | |
|    *
 | |
|    * @param listener The listener to remove
 | |
|    */
 | |
|   public void removeMenuKeyListener(MenuKeyListener listener)
 | |
|   {
 | |
|     listenerList.remove(MenuKeyListener.class, listener);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns all added MenuKeyListener objects.
 | |
|    *
 | |
|    * @return an array of listeners
 | |
|    *
 | |
|    * @since 1.4
 | |
|    */
 | |
|   public MenuKeyListener[] getMenuKeyListeners()
 | |
|   {
 | |
|     return (MenuKeyListener[]) listenerList.getListeners(MenuKeyListener.class);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a string describing the attributes for the <code>JMenuItem</code>
 | |
|    * component, for use in debugging.  The return value is guaranteed to be
 | |
|    * non-<code>null</code>, but the format of the string may vary between
 | |
|    * implementations.
 | |
|    *
 | |
|    * @return A string describing the attributes of the <code>JMenuItem</code>.
 | |
|    */
 | |
|   protected String paramString()
 | |
|   {
 | |
|     // calling super seems to be sufficient here...
 | |
|     return super.paramString();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the object that provides accessibility features for this
 | |
|    * <code>JMenuItem</code> component.
 | |
|    *
 | |
|    * @return The accessible context (an instance of
 | |
|    *     {@link AccessibleJMenuItem}).
 | |
|    */
 | |
|   public AccessibleContext getAccessibleContext()
 | |
|   {
 | |
|     if (accessibleContext == null)
 | |
|       {
 | |
|         AccessibleJMenuItem ctx = new AccessibleJMenuItem();
 | |
|         addChangeListener(ctx);
 | |
|         accessibleContext = ctx;
 | |
|       }
 | |
| 
 | |
|     return accessibleContext;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Provides the accessibility features for the <code>JMenuItem</code>
 | |
|    * component.
 | |
|    *
 | |
|    * @see JMenuItem#getAccessibleContext()
 | |
|    */
 | |
|   protected class AccessibleJMenuItem extends AccessibleAbstractButton
 | |
|     implements ChangeListener
 | |
|   {
 | |
|     private static final long serialVersionUID = 6748924232082076534L;
 | |
| 
 | |
|     private boolean armed;
 | |
|     private boolean focusOwner;
 | |
|     private boolean pressed;
 | |
|     private boolean selected;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new <code>AccessibleJMenuItem</code> instance.
 | |
|      */
 | |
|     AccessibleJMenuItem()
 | |
|     {
 | |
|       //super(component);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Receives notification when the menu item's state changes and fires
 | |
|      * appropriate property change events to registered listeners.
 | |
|      *
 | |
|      * @param event the change event
 | |
|      */
 | |
|     public void stateChanged(ChangeEvent event)
 | |
|     {
 | |
|       // This is fired in all cases.
 | |
|       firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,
 | |
|                          Boolean.FALSE, Boolean.TRUE);
 | |
| 
 | |
|       ButtonModel model = getModel();
 | |
| 
 | |
|       // Handle the armed property.
 | |
|       if (model.isArmed())
 | |
|         {
 | |
|           if (! armed)
 | |
|             {
 | |
|               armed = true;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  AccessibleState.ARMED, null);
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           if (armed)
 | |
|             {
 | |
|               armed = false;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  null, AccessibleState.ARMED);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|       // Handle the pressed property.
 | |
|       if (model.isPressed())
 | |
|         {
 | |
|           if (! pressed)
 | |
|             {
 | |
|               pressed = true;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  AccessibleState.PRESSED, null);
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           if (pressed)
 | |
|             {
 | |
|               pressed = false;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  null, AccessibleState.PRESSED);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|       // Handle the selected property.
 | |
|       if (model.isSelected())
 | |
|         {
 | |
|           if (! selected)
 | |
|             {
 | |
|               selected = true;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  AccessibleState.SELECTED, null);
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           if (selected)
 | |
|             {
 | |
|               selected = false;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  null, AccessibleState.SELECTED);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|       // Handle the focusOwner property.
 | |
|       if (isFocusOwner())
 | |
|         {
 | |
|           if (! focusOwner)
 | |
|             {
 | |
|               focusOwner = true;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  AccessibleState.FOCUSED, null);
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           if (focusOwner)
 | |
|             {
 | |
|               focusOwner = false;
 | |
|               firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
 | |
|                                  null, AccessibleState.FOCUSED);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible role for the <code>JMenuItem</code> component.
 | |
|      *
 | |
|      * @return {@link AccessibleRole#MENU_ITEM}.
 | |
|      */
 | |
|     public AccessibleRole getAccessibleRole()
 | |
|     {
 | |
|       return AccessibleRole.MENU_ITEM;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns <code>true</code> if the component is guaranteed to be painted
 | |
|    * on top of others. This returns false by default and is overridden by
 | |
|    * components like JMenuItem, JPopupMenu and JToolTip to return true for
 | |
|    * added efficiency.
 | |
|    *
 | |
|    * @return <code>true</code> if the component is guaranteed to be painted
 | |
|    *         on top of others
 | |
|    */
 | |
|   boolean onTop()
 | |
|   {
 | |
|     return SwingUtilities.getAncestorOfClass(JInternalFrame.class, this)
 | |
|            == null;
 | |
|   }
 | |
| 
 | |
| }
 |