diff options
Diffstat (limited to 'libjava/javax/swing/plaf/basic/BasicMenuUI.java')
| -rw-r--r-- | libjava/javax/swing/plaf/basic/BasicMenuUI.java | 312 |
1 files changed, 235 insertions, 77 deletions
diff --git a/libjava/javax/swing/plaf/basic/BasicMenuUI.java b/libjava/javax/swing/plaf/basic/BasicMenuUI.java index 97f64fea0a0..1953f480a8e 100644 --- a/libjava/javax/swing/plaf/basic/BasicMenuUI.java +++ b/libjava/javax/swing/plaf/basic/BasicMenuUI.java @@ -1,5 +1,5 @@ /* BasicMenuUI.java - Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -53,6 +53,7 @@ import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; import javax.swing.MenuElement; import javax.swing.MenuSelectionManager; import javax.swing.UIDefaults; @@ -71,12 +72,16 @@ import javax.swing.plaf.MenuItemUI; /** - * DOCUMENT ME! + * UI Delegate for JMenu */ public class BasicMenuUI extends BasicMenuItemUI { protected ChangeListener changeListener; + + /* MenuListener listens to MenuEvents fired by JMenu */ protected MenuListener menuListener; + + /* PropertyChangeListner that listens to propertyChangeEvents occuring in JMenu*/ protected PropertyChangeListener propertyChangeListener; /** @@ -84,52 +89,53 @@ public class BasicMenuUI extends BasicMenuItemUI */ public BasicMenuUI() { - mouseInputListener = createMouseInputListener(menuItem); - menuListener = createMenuListener(menuItem); + mouseInputListener = createMouseInputListener((JMenu) menuItem); + menuListener = createMenuListener((JMenu) menuItem); + propertyChangeListener = createPropertyChangeListener((JMenu) menuItem); } /** - * DOCUMENT ME! - * - * @param c DOCUMENT ME! + * This method creates a new ChangeListener. * - * @return DOCUMENT ME! + * @return A new ChangeListener. */ protected ChangeListener createChangeListener(JComponent c) { - return null; + return new ChangeHandler(); } /** - * DOCUMENT ME! + * This method creates new MenuDragMouseListener to listen to mouse dragged events + * occuring in the Menu * - * @param c DOCUMENT ME! + * @param c the menu to listen to * - * @return DOCUMENT ME! + * @return The MenuDrageMouseListener */ protected MenuDragMouseListener createMenuDragMouseListener(JComponent c) { - return null; + return new MenuDragMouseHandler(); } /** - * DOCUMENT ME! + * This method creates new MenuDragKeyListener to listen to key events * - * @param c DOCUMENT ME! + * @param c the menu to listen to * - * @return DOCUMENT ME! + * @return The MenuKeyListener */ protected MenuKeyListener createMenuKeyListener(JComponent c) { - return null; + return new MenuKeyHandler(); } /** - * DOCUMENT ME! + * This method creates new MenuListener to listen to menu events + * occuring in the Menu * - * @param c DOCUMENT ME! + * @param c the menu to listen to * - * @return DOCUMENT ME! + * @return The MenuListener */ protected MenuListener createMenuListener(JComponent c) { @@ -137,11 +143,12 @@ public class BasicMenuUI extends BasicMenuItemUI } /** - * DOCUMENT ME! + * This method creates new MouseInputListener to listen to mouse input events + * occuring in the Menu * - * @param c DOCUMENT ME! + * @param c the menu to listen to * - * @return DOCUMENT ME! + * @return The MouseInputListener */ protected MouseInputListener createMouseInputListener(JComponent c) { @@ -149,53 +156,50 @@ public class BasicMenuUI extends BasicMenuItemUI } /** - * DOCUMENT ME! + * This method creates newPropertyChangeListener to listen to property changes + * occuring in the Menu * - * @param c DOCUMENT ME! + * @param c the menu to listen to * - * @return DOCUMENT ME! + * @return The PropertyChangeListener */ protected PropertyChangeListener createPropertyChangeListener(JComponent c) { - return null; + return new PropertyChangeHandler(); } /** - * DOCUMENT ME! + * This method creates a new BasicMenuUI. * - * @param x DOCUMENT ME! + * @param c The JComponent to create a UI for. * - * @return DOCUMENT ME! + * @return A new BasicMenuUI. */ - public static ComponentUI createUI(JComponent x) + public static ComponentUI createUI(JComponent c) { return new BasicMenuUI(); } /** - * DOCUMENT ME! + * Get the component's maximum size. * - * @param c DOCUMENT ME! + * @param c The JComponent for which to get maximum size * - * @return DOCUMENT ME! + * @return The maximum size of the component */ public Dimension getMaximumSize(JComponent c) { return null; } - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ protected String getPropertyPrefix() { return null; } /** - * DOCUMENT ME! + * Initializes any default properties that this UI has from the defaults for + * the Basic look and feel. */ protected void installDefaults() { @@ -214,14 +218,17 @@ public class BasicMenuUI extends BasicMenuItemUI } /** - * DOCUMENT ME! + * Installs any keyboard actions. The list of keys that need to be bound are + * listed in Basic look and feel's defaults. + * */ protected void installKeyboardActions() { + // FIXME: Need to implement } /** - * DOCUMENT ME! + * Creates and registers all the listeners for this UI delegate. */ protected void installListeners() { @@ -229,17 +236,13 @@ public class BasicMenuUI extends BasicMenuItemUI ((JMenu) menuItem).addMenuListener(menuListener); } - /** - * DOCUMENT ME! - * - * @param menu DOCUMENT ME! - */ protected void setupPostTimer(JMenu menu) { } /** - * DOCUMENT ME! + * This method uninstalls the defaults and sets any objects created during + * install to null */ protected void uninstallDefaults() { @@ -255,30 +258,35 @@ public class BasicMenuUI extends BasicMenuItemUI } /** - * DOCUMENT ME! + * Uninstalls any keyboard actions. The list of keys used are listed in + * Basic look and feel's defaults. */ protected void uninstallKeyboardActions() { + // FIXME: Need to implement } /** - * DOCUMENT ME! + * Unregisters all the listeners that this UI delegate was using. In + * addition, it will also null any listeners that it was using. */ protected void uninstallListeners() { + ((JMenu) menuItem).removeMouseListener(mouseInputListener); + ((JMenu) menuItem).removeMenuListener(menuListener); + ((JMenu) menuItem).removePropertyChangeListener(propertyChangeListener); } /** - * DOCUMENT ME! + * This class is used by menus to handle mouse events occuring in the + * menu. */ protected class MouseInputHandler implements MouseInputListener { - protected MouseInputHandler() - { - } - public void mouseClicked(MouseEvent e) { + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + manager.processMouseEvent(e); } public void mouseDragged(MouseEvent e) @@ -289,34 +297,30 @@ public class BasicMenuUI extends BasicMenuItemUI public void mouseEntered(MouseEvent e) { - MenuSelectionManager manager = MenuSelectionManager.defaultManager(); - manager.setSelectedPath(getPath()); - manager.processMouseEvent(e); - - JMenu subMenu = (JMenu) menuItem; - - int x = 0; - int y = 0; - - // location of the popup menu is relative to the invoker - if (subMenu.isTopLevelMenu()) + /* When mouse enters menu item, it should be considered selected + + if (i) if this menu is a submenu in some other menu + (ii) or if this menu is in a menu bar and some other menu in a menu bar was just + selected. (If nothing was selected, menu should be pressed before + it will be selected) + */ + + JMenu menu = (JMenu) menuItem; + if (! menu.isTopLevelMenu() + || (menu.isTopLevelMenu() + && (((JMenuBar) menu.getParent()).isSelected()))) { - JMenuBar mb = (JMenuBar) subMenu.getParent(); - - // Subtract menuBar's insets.bottom and popupMenu's insets.top, - // s.t. the space between menu bar and its popup menu is equal to - // menuBar's margin. By default menuBar's margin is Insets(0,0,0,0). - y = subMenu.getHeight() - mb.getInsets().bottom - - subMenu.getPopupMenu().getInsets().top + mb.getMargin().bottom; + // set new selection and forward this event to MenuSelectionManager + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + manager.setSelectedPath(getPath()); + manager.processMouseEvent(e); } - else - x = subMenu.getWidth(); - - subMenu.getPopupMenu().show(subMenu, x, y); } public void mouseExited(MouseEvent e) { + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + manager.processMouseEvent(e); } public void mouseMoved(MouseEvent e) @@ -325,6 +329,37 @@ public class BasicMenuUI extends BasicMenuItemUI public void mousePressed(MouseEvent e) { + + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + JMenu menu = (JMenu) menuItem; + manager.processMouseEvent(e); + + // Menu should be displayed when the menu is pressed only if + // it is top-level menu + if (menu.isTopLevelMenu()) + { + if (menu.getPopupMenu().isVisible()) + { + // If menu is visible and menu button was pressed.. + // then need to cancel the menu + menu.fireMenuCanceled(); + manager.clearSelectedPath(); + } + else + { + // Display the menu + int x = 0; + int y = menu.getHeight(); + + menu.fireMenuSelected(); + manager.setSelectedPath(getPath()); + + JMenuBar mb = (JMenuBar) menu.getParent(); + + // set selectedIndex of the selectionModel of a menuBar + mb.getSelectionModel().setSelectedIndex(mb.getComponentIndex(menu)); + } + } } public void mouseReleased(MouseEvent e) @@ -334,18 +369,141 @@ public class BasicMenuUI extends BasicMenuItemUI } } + /** + * This class handles MenuEvents fired by the JMenu + */ protected class MenuHandler implements MenuListener { + /** + * This method is called when menu is cancelled. The menu is cancelled + * when its popup menu is closed without selection. + * + * @param e The MenuEvent. + */ public void menuCanceled(MenuEvent e) { } + /** + * This method is called when menu is deselected. + * + * @param e The MenuEvent. + */ public void menuDeselected(MenuEvent e) { } + /** + * This method is called when menu is selected. + * + * @param e The MenuEvent. + */ public void menuSelected(MenuEvent e) { } } + + /** + * This class handles PropertyChangeEvents fired from the JMenu + */ + protected class PropertyChangeHandler implements PropertyChangeListener + { + /** + * This method is called whenever one of the properties of the menu item + * changes. + * + * @param e The PropertyChangeEvent. + */ + public void propertyChange(PropertyChangeEvent evt) + { + } + } + + protected class ChangeHandler implements ChangeListener + { + public void stateChanged(ChangeEvent e) + { + // FIXME: It seems that this class is not used anywhere + } + } + + /** + * This class handles mouse dragged events. + */ + protected class MenuDragMouseHandler implements MenuDragMouseListener + { + /** + * Tbis method is invoked when mouse is dragged over the menu item. + * + * @param e The MenuDragMouseEvent + */ + public void menuDragMouseDragged(MenuDragMouseEvent e) + { + } + + /** + * Tbis method is invoked when mouse enters the menu item while it is + * being dragged. + * + * @param e The MenuDragMouseEvent + */ + public void menuDragMouseEntered(MenuDragMouseEvent e) + { + } + + /** + * Tbis method is invoked when mouse exits the menu item while + * it is being dragged + * + * @param e The MenuDragMouseEvent + */ + public void menuDragMouseExited(MenuDragMouseEvent e) + { + } + + /** + * Tbis method is invoked when mouse was dragged and released + * inside the menu item. + * + * @param e The MenuDragMouseEvent + */ + public void menuDragMouseReleased(MenuDragMouseEvent e) + { + } + } + + /** + * This class handles key events occuring when menu item is visible on the + * screen. + */ + protected class MenuKeyHandler implements MenuKeyListener + { + /** + * This method is invoked when key has been pressed + * + * @param e A {@link MenuKeyEvent}. + */ + public void menuKeyPressed(MenuKeyEvent e) + { + } + + /** + * This method is invoked when key has been pressed + * + * @param e A {@link MenuKeyEvent}. + */ + public void menuKeyReleased(MenuKeyEvent e) + { + } + + /** + * This method is invoked when key has been typed + * It handles the mnemonic key for the menu item. + * + * @param e A {@link MenuKeyEvent}. + */ + public void menuKeyTyped(MenuKeyEvent e) + { + } + } } |

