diff options
Diffstat (limited to 'libjava/java/awt/MenuBar.java')
-rw-r--r-- | libjava/java/awt/MenuBar.java | 555 |
1 files changed, 298 insertions, 257 deletions
diff --git a/libjava/java/awt/MenuBar.java b/libjava/java/awt/MenuBar.java index 40de61abbb5..7ad688b65c4 100644 --- a/libjava/java/awt/MenuBar.java +++ b/libjava/java/awt/MenuBar.java @@ -1,288 +1,329 @@ -/* Copyright (C) 1999, 2000, 2001 Free Software Foundation +/* MenuBar.java -- An AWT menu bar class + Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. - This file is part of libjava. +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., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ -This software is copyrighted work licensed under the terms of the -Libjava License. Please consult the file "LIBJAVA_LICENSE" for -details. */ package java.awt; import java.awt.peer.MenuBarPeer; -import java.util.Vector; +import java.awt.peer.MenuComponentPeer; + +import java.io.Serializable; import java.util.Enumeration; -import java.util.NoSuchElementException; +import java.util.Vector; + +/** + * This class implements a menu bar in the AWT system. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey <tromey@redhat.com> + */ +public class MenuBar extends MenuComponent + implements MenuContainer, Serializable +{ + +/* + * Static Variables + */ + +// Serialization Constant +private static final long serialVersionUID = -4930327919388951260L; + +/*************************************************************************/ + +/* + * Instance Variables + */ -/** This class implements a MenuBar, such as might appear across the - * top of a window. - * @author Tom Tromey <tromey@redhat.com> - * @date December 25, 2000 +/** + * @serial The menu used for providing help information + */ +private Menu helpMenu; + +/** + * @serial The menus contained in this menu bar. + */ +private Vector menus = new Vector(); + +/*************************************************************************/ + +/* + * Constructors */ -public class MenuBar extends MenuComponent implements MenuContainer + +/** + * Initializes a new instance of <code>MenuBar</code>. + */ +public +MenuBar() { - /** Create a new MenuBar. */ - public MenuBar () - { - menus = new Vector (); - } - - /** Add a menu to this MenuBar. If the menu has already has a - * parent, it is first removed from its old parent before being - * added. - * @param menu The menu to add. - * @returns menu - */ - public synchronized Menu add (Menu menu) - { - if (menu.parent != null) - menu.parent.remove (menu); - - menu.parent = this; - menus.add (menu); - - if (peer != null) - { - MenuBarPeer mp = (MenuBarPeer) peer; - mp.add (menu); - } - - return menu; - } - - /** This creates the component's peer. */ - public void addNotify () - { - if (peer != null) - { - // This choice of toolkit seems unsatisfying, but I'm not sure - // what else to do. - peer = Toolkit.getDefaultToolkit ().createMenuBar (this); - } - } - - /** @deprecated Use getMenuCount() instead. */ - public int countMenus () - { - return getMenuCount (); - } - - /** Delete a keyboard shortcut. - * @param shortcut The short cut which should be deleted from all - * menus on this MenuBar. - */ - public void deleteShortcut (MenuShortcut shortcut) - { - MenuItem it; - // This is a slow implementation, but it probably doesn't matter. - while ((it = getShortcutMenuItem (shortcut)) != null) - it.deleteShortcut (); - } - - /** Returns the current Help menu. */ - public Menu getHelpMenu () - { - return help_menu; - } - - /** Returns a menu from this object. - * @param index Index of menu to return. - */ - public Menu getMenu (int index) - { - return (Menu) menus.get (index); - } - - /** Returns the number of menus on this MenuBar. */ - public int getMenuCount () - { - return menus.size (); - } - - /** Returns the menu item on this MenuBar with the specified - * shortcut. - * @param shortcut Shortcut to look for - */ - public MenuItem getShortcutMenuItem (MenuShortcut shortcut) - { - Enumeration m = new MenuEnumeration (this); - while (m.hasMoreElements ()) - { - MenuItem item = (MenuItem) m.nextElement (); - if (item.getShortcut () == shortcut) - return item; - } - return null; - } - - /** Remove a menu from the menu bar. If the menu is specified by - * component (and not index), and does not exist on the menu, then - * the method does nothing. If the removed menu has a peer, it is - * destroyed. - * @param menu The menu to remove - * @param index The index of the menu to remove - */ - public synchronized void remove (MenuComponent menu) - { - int s = menus.size (); - for (int i = 0; i < s; ++i) - { - if (menus.get (i) == menu) - { - remove (i); - break; - } - } - } - - public synchronized void remove (int index) - { - Menu m = (Menu) menus.get (index); - menus.remove (index); - m.removeNotify (); - m.parent = null; - - if (peer != null) - { - MenuBarPeer mp = (MenuBarPeer) peer; - mp.remove (index); - } - } - - /** Set the Help menu for this MenuBar. If a Help menu already - * exists, it is first removed. - * @param menu The new Help menu. - */ - public synchronized void setHelpMenu (Menu menu) - { - if (help_menu != null) - { - help_menu.removeNotify (); - help_menu.parent = null; - } - - if (menu.parent != null) - menu.parent.remove (menu); - if (menu.parent != null) - menu.parent.remove (menu); - menu.parent = this; - - if (peer != null) - { - MenuBarPeer mp = (MenuBarPeer) peer; - mp.addHelpMenu (menu); - } - } - - /** Returns an Enumeration which lists the keyboard shortcuts - * associated with menu items on this MenuBar. - */ - public synchronized Enumeration shortcuts () - { - return new ShortcutEnumeration (new MenuEnumeration (this)); - } - - // Iterate over the items of a menu. - private static class MenuEnumeration implements Enumeration - { - // Enumerate over the menu's items. - Enumeration main; - // Enumerate over a submenu. - Enumeration sub; - // Menubar so we can keep track of help menu too. - MenuBar menubar; - - MenuEnumeration (Menu m) - { - sub = null; - menubar = null; - main = m.items.elements (); - } +} + +/*************************************************************************/ + +/* + * Instance Methods + */ - MenuEnumeration (MenuBar mb) +/** + * Returns the help menu for this menu bar. This may be <code>null</code>. + * + * @return The help menu for this menu bar. + */ +public Menu +getHelpMenu() +{ + return(helpMenu); +} + +/*************************************************************************/ + +/** + * Sets the help menu for this menu bar. + * + * @param helpMenu The new help menu for this menu bar. + */ +public synchronized void +setHelpMenu(Menu menu) +{ + if (helpMenu != null) { - sub = null; - menubar = mb; - main = mb.menus.elements (); + helpMenu.removeNotify (); + helpMenu.parent = null; } - public boolean hasMoreElements () + if (menu.parent != null) + menu.parent.remove (menu); + if (menu.parent != null) + menu.parent.remove (menu); + menu.parent = this; + + if (peer != null) { - boolean r = false; - if (sub != null) - r = sub.hasMoreElements (); - if (! r) - r = main.hasMoreElements (); - if (! r && menubar != null) - { - if (menubar.help_menu != null) - { - main = new MenuEnumeration (menubar.help_menu); - r = main.hasMoreElements (); - } - menubar = null; - } - return r; + MenuBarPeer mp = (MenuBarPeer) peer; + mp.addHelpMenu (menu); } +} + +/*************************************************************************/ - public Object nextElement () throws NoSuchElementException +/** Add a menu to this MenuBar. If the menu has already has a + * parent, it is first removed from its old parent before being + * added. + * + * @param menu The menu to add. + * + * @return The menu that was added. + */ +public synchronized Menu +add(Menu menu) +{ + if (menu.parent != null) + menu.parent.remove (menu); + + menu.parent = this; + menus.addElement(menu); + + if (peer != null) { - while (true) - { - if (! sub.hasMoreElements ()) - sub = null; - else - return sub.nextElement (); - - if (! main.hasMoreElements () && menubar != null - && menubar.help_menu != null) - { - main = new MenuEnumeration (menubar.help_menu); - menubar = null; - } - - Object r = main.nextElement (); - if (r instanceof Menu) - { - sub = new MenuEnumeration ((Menu) r); - continue; - } - - return r; - } + MenuBarPeer mp = (MenuBarPeer) peer; + mp.addMenu (menu); } - } - // This is an enumeration that shadows another enumeration and - // returns the shortcut for each item returned. I wonder if we're - // only supposed to return unique shortcuts? If so then we could - // keep a hash table here and remove duplicates. - private static class ShortcutEnumeration implements Enumeration - { - Enumeration back; + return(menu); +} + +/*************************************************************************/ - ShortcutEnumeration (Enumeration back) +/** + * Removes the menu at the specified index. + * + * @param index The index of the menu to remove from the menu bar. + */ +public synchronized void +remove(int index) +{ + Menu m = (Menu) menus.get (index); + menus.remove (index); + m.removeNotify (); + m.parent = null; + + if (peer != null) { - this.back = back; + MenuBarPeer mp = (MenuBarPeer) peer; + mp.delMenu (index); } +} + +/*************************************************************************/ + +/** + * Removes the specified menu from the menu bar. + * + * @param menu The menu to remove from the menu bar. + */ +public void +remove(MenuComponent menu) +{ + int index = menus.indexOf(menu); + if (index == -1) + return; + + remove(index); +} + +/*************************************************************************/ + +/** + * Returns the number of elements in this menu bar. + * + * @return The number of elements in the menu bar. + */ +public int +getMenuCount() +{ + // FIXME: How does the help menu fit in here? + return(menus.size()); +} + +/*************************************************************************/ + +/** + * Returns the number of elements in this menu bar. + * + * @return The number of elements in the menu bar. + * + * @deprecated This method is deprecated in favor of <code>getMenuCount()</code>. + */ +public int +countMenus() +{ + return(getMenuCount()); +} + +/*************************************************************************/ + +/** + * Returns the menu at the specified index. + * + * @return The requested menu. + * + * @exception ArrayIndexOutOfBoundsException If the index is not valid. + */ +public Menu +getMenu(int index) +{ + return((Menu)menus.elementAt(index)); +} + +/*************************************************************************/ - public boolean hasMoreElements () +/** + * Creates this object's native peer. + */ +public void +addNotify() +{ + if (getPeer() == null) + setPeer((MenuComponentPeer)getToolkit().createMenuBar(this)); +} + +/*************************************************************************/ + +/** + * Destroys this object's native peer. + */ +public void +removeNotify() +{ + super.removeNotify(); +} + +/*************************************************************************/ + +/** + * Returns a list of all shortcuts for the menus in this menu bar. + * + * @return A list of all shortcuts for the menus in this menu bar. + */ +public synchronized Enumeration +shortcuts() +{ + Vector shortcuts = new Vector(); + Enumeration e = menus.elements(); + + while (e.hasMoreElements()) { - return back.hasMoreElements (); + Menu menu = (Menu)e.nextElement(); + if (menu.getShortcut() != null) + shortcuts.addElement(menu.getShortcut()); } - public Object nextElement () throws NoSuchElementException + return(shortcuts.elements()); +} + +/*************************************************************************/ + +/** + * Returns the menu item for the specified shortcut, or <code>null</code> + * if no such item exists. + * + * @param shortcut The shortcut to return the menu item for. + * + * @return The menu item for the specified shortcut. + */ +public MenuItem +getShortcutMenuItem(MenuShortcut shortcut) +{ + Enumeration e = menus.elements(); + + while (e.hasMoreElements()) { - while (true) - { - MenuItem item = (MenuItem) back.nextElement (); - if (item.getShortcut () != null) - return item.getShortcut (); - } + Menu menu = (Menu)e.nextElement(); + MenuShortcut s = menu.getShortcut(); + if ((s != null) && (s.equals(shortcut))) + return(menu); } - } - // We use Vector because it makes enumerating easier than ArrayList - // in this case. - Vector menus; - Menu help_menu; + return(null); } + +/*************************************************************************/ + +/** + * Deletes the specified menu shortcut. + * + * @param shortcut The shortcut to delete. + */ +public void +deleteShortcut(MenuShortcut shortcut) +{ + MenuItem it; + // This is a slow implementation, but it probably doesn't matter. + while ((it = getShortcutMenuItem (shortcut)) != null) + it.deleteShortcut (); +} + +} // class MenuBar |