summaryrefslogtreecommitdiff
path: root/libjava/java/awt/MenuBar.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/awt/MenuBar.java')
-rw-r--r--libjava/java/awt/MenuBar.java555
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