[gui][PATCH] JMenu & other small fixes

Olga Rodimina rodimina@redhat.com
Tue May 18 17:32:00 GMT 2004


Hi,

Attached patch implements basics of JMenu and makes other relevent fixes
to  menu items and popup menu.

I will be committing this patch java-gui-branch.

Olga.
-------------- next part --------------
? .snprj
? libjava.proj
? patch
? javax/swing/patch
? javax/swing/plaf/basic/patch
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2660.2.101
diff -c -p -u -r1.2660.2.101 ChangeLog
--- ChangeLog	17 May 2004 19:49:02 -0000	1.2660.2.101
+++ ChangeLog	18 May 2004 14:17:22 -0000
@@ -7,6 +7,29 @@
 
 2004-05-17  Olga Rodimina  <rodimina@redhat.com>
 
+	* Makefile.am: Added new file.
+	* Makefile.in: Regenerate.
+	* javax/swing/JMenu.java: Started 
+	implementation.
+	* javax/swing/JPopupMenu.java:
+	(insert): If specified index is -1, then
+	add component at the end.
+	(isPopupTrigger): Reimplemented.
+	(JPopupMenu.LightWeightPopup): setBounds
+	of the lightWeightPopup before adding it 
+	to the layeredPane.
+	(javax/swing/plaf/basic/BasicIconFactory.java):
+	(getMenuArrowIcon): Implemented.
+	* javax/swing/plaf/basic/BasicMenuItemUI.java:
+	(getPreferredSize): Add size of the arrow icon 
+	if this menu item is instance of JMenu.
+	(paintMenuItem): Paint arrow icon if this 
+	menu item is a submenu.
+	* javax/swing/plaf/basic/BasicMenuUI.java:
+	New File. UI Delegate for JMenu.
+
+2004-05-17  Olga Rodimina  <rodimina@redhat.com>
+
 	* javax/swing/JRootPane.java
 	(JRootPane.RootLayout): Reimplemented to 
 	set bounds of contentPane and menuBar.
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.361.2.11
diff -c -p -u -r1.361.2.11 Makefile.am
--- Makefile.am	3 May 2004 15:38:31 -0000	1.361.2.11
+++ Makefile.am	18 May 2004 14:17:22 -0000
@@ -1251,6 +1251,7 @@ javax/swing/plaf/basic/BasicCheckBoxUI.j
 javax/swing/plaf/basic/BasicGraphicsUtils.java \
 javax/swing/plaf/basic/BasicLabelUI.java \
 javax/swing/plaf/basic/BasicListUI.java \
+javax/swing/plaf/basic/BasicMenuUI.java \
 javax/swing/plaf/basic/BasicMenuItemUI.java \
 javax/swing/plaf/basic/BasicOptionPaneUI.java \
 javax/swing/plaf/basic/BasicPanelUI.java \
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.in,v
retrieving revision 1.385.2.11
diff -c -p -u -r1.385.2.11 Makefile.in
--- Makefile.in	3 May 2004 15:38:31 -0000	1.385.2.11
+++ Makefile.in	18 May 2004 14:17:22 -0000
@@ -956,6 +956,7 @@ javax/swing/plaf/basic/BasicCheckBoxUI.j
 javax/swing/plaf/basic/BasicGraphicsUtils.java \
 javax/swing/plaf/basic/BasicLabelUI.java \
 javax/swing/plaf/basic/BasicListUI.java \
+javax/swing/plaf/basic/BasicMenuUI.java \
 javax/swing/plaf/basic/BasicMenuItemUI.java \
 javax/swing/plaf/basic/BasicOptionPaneUI.java \
 javax/swing/plaf/basic/BasicPanelUI.java \
@@ -3002,6 +3003,7 @@ javax/swing/plaf/basic/BasicCheckBoxUI.l
 javax/swing/plaf/basic/BasicGraphicsUtils.lo \
 javax/swing/plaf/basic/BasicLabelUI.lo \
 javax/swing/plaf/basic/BasicListUI.lo \
+javax/swing/plaf/basic/BasicMenuUI.lo \
 javax/swing/plaf/basic/BasicMenuItemUI.lo \
 javax/swing/plaf/basic/BasicOptionPaneUI.lo \
 javax/swing/plaf/basic/BasicPanelUI.lo \
@@ -5097,6 +5099,7 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_D
 .deps/javax/swing/plaf/basic/BasicListUI.P \
 .deps/javax/swing/plaf/basic/BasicLookAndFeel.P \
 .deps/javax/swing/plaf/basic/BasicMenuItemUI.P \
+.deps/javax/swing/plaf/basic/BasicMenuUI.P \
 .deps/javax/swing/plaf/basic/BasicOptionPaneUI.P \
 .deps/javax/swing/plaf/basic/BasicPanelUI.P \
 .deps/javax/swing/plaf/basic/BasicPopupMenuUI.P \
Index: javax/swing/JMenu.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JMenu.java,v
retrieving revision 1.3
diff -c -p -u -r1.3 JMenu.java
--- javax/swing/JMenu.java	9 Jan 2004 10:18:47 -0000	1.3
+++ javax/swing/JMenu.java	18 May 2004 14:17:23 -0000
@@ -46,724 +46,796 @@ import java.beans.PropertyChangeListener
 import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
+import java.util.EventListener;
 import java.util.Hashtable;
 import javax.accessibility.Accessible;
 import javax.accessibility.AccessibleContext;
 import javax.accessibility.AccessibleRole;
 import javax.accessibility.AccessibleSelection;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
-import javax.swing.event.ChangeListener;
+import javax.swing.plaf.MenuItemUI;
+
 
 /**
- * JMenu
- * @author	Andrew Selkirk
- * @version	1.0
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
  */
-public class JMenu
-  extends JMenuItem
-  implements Accessible, MenuElement
+public class JMenu extends JMenuItem implements Accessible, MenuElement
 {
   static final long serialVersionUID = 4227225638931828014L;
-
-	//-------------------------------------------------------------
-	// Classes ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * AccessibleJMenu
-	 */
-	protected class AccessibleJMenu extends AccessibleJMenuItem 
-			implements AccessibleSelection {
-
-		//-------------------------------------------------------------
-		// Variables --------------------------------------------------
-		//-------------------------------------------------------------
-
-
-		//-------------------------------------------------------------
-		// Initialization ---------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * Constructor AccessibleJMenu
-		 * @param component TODO
-		 */
-		protected AccessibleJMenu(JMenu component) {
-			super(component);
-			// TODO
-		} // AccessibleJMenu()
-
-
-		//-------------------------------------------------------------
-		// Methods ----------------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * getAccessibleChildrenCount
-		 * @returns int
-		 */
-		public int getAccessibleChildrenCount() {
-			return 0; // TODO
-		} // getAccessibleChildrenCount()
-
-		/**
-		 * getAccessibleChild
-		 * @param value0 TODO
-		 * @returns Accessible
-		 */
-		public Accessible getAccessibleChild(int value0) {
-			return null; // TODO
-		} // getAccessibleChild()
-
-		/**
-		 * getAccessibleSelection
-		 * @returns AccessibleSelection
-		 */
-		public AccessibleSelection getAccessibleSelection() {
-			return null; // TODO
-		} // getAccessibleSelection()
-
-		/**
-		 * getAccessibleSelection
-		 * @param value0 TODO
-		 * @returns Accessible
-		 */
-		public Accessible getAccessibleSelection(int value0) {
-			return null; // TODO
-		} // getAccessibleSelection()
-
-		/**
-		 * isAccessibleChildSelected
-		 * @param value0 TODO
-		 * @returns boolean
-		 */
-		public boolean isAccessibleChildSelected(int value0) {
-			return false; // TODO
-		} // isAccessibleChildSelected()
-
-		/**
-		 * getAccessibleRole
-		 * @returns AccessibleRole
-		 */
-		public AccessibleRole getAccessibleRole() {
-			return AccessibleRole.MENU;
-		} // getAccessibleRole()
-
-		/**
-		 * getAccessibleSelectionCount
-		 * @returns int
-		 */
-		public int getAccessibleSelectionCount() {
-			return 0; // TODO
-		} // getAccessibleSelectionCount()
-
-		/**
-		 * addAccessibleSelection
-		 * @param value0 TODO
-		 */
-		public void addAccessibleSelection(int value0) {
-			// TODO
-		} // addAccessibleSelection()
-
-		/**
-		 * removeAccessibleSelection
-		 * @param value0 TODO
-		 */
-		public void removeAccessibleSelection(int value0) {
-			// TODO
-		} // removeAccessibleSelection()
-
-		/**
-		 * clearAccessibleSelection
-		 */
-		public void clearAccessibleSelection() {
-			// TODO
-		} // clearAccessibleSelection()
-
-		/**
-		 * selectAllAccessibleSelection
-		 */
-		public void selectAllAccessibleSelection() {
-			// TODO
-		} // selectAllAccessibleSelection()
-
-
-	} // AccessibleJMenu
-
-	/**
-	 * WinListener
-	 */
-	protected class WinListener extends WindowAdapter implements Serializable {
-
-		//-------------------------------------------------------------
-		// Variables --------------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * popupMenu
-		 */
-		JPopupMenu popupMenu;
-
-
-		//-------------------------------------------------------------
-		// Initialization ---------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * Constructor WinListener
-		 * @param value0 TODO
-		 * @param value1 TODO
-		 */
-		public WinListener(JMenu value0, JPopupMenu value1) {
-			// TODO
-		} // WinListener()
-
-
-		//-------------------------------------------------------------
-		// Methods ----------------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * windowClosing
-		 * @param value0 TODO
-		 */
-		public void windowClosing(WindowEvent value0) {
-			// TODO
-		} // windowClosing()
-
-
-	} // WinListener
-
-
-	//-------------------------------------------------------------
-	// Variables --------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * uiClassID
-	 */
-	private static final String uiClassID = "MenuUI";
-
-	/**
-	 * popupMenu
-	 */
-	private JPopupMenu popupMenu;
-
-	/**
-	 * menuChangeListener
-	 */
-	private ChangeListener menuChangeListener;
-
-	/**
-	 * menuEvent
-	 */
-	private MenuEvent menuEvent;
-
-	/**
-	 * listenerRegistry
-	 */
-	private static Hashtable listenerRegistry = null; // TODO
-
-	/**
-	 * delay
-	 */
-	private int delay;
-
-	/**
-	 * TRACE
-	 */
-	private static final boolean TRACE = false; // TODO
-
-	/**
-	 * VERBOSE
-	 */
-	private static final boolean VERBOSE = false; // TODO
-
-	/**
-	 * DEBUG
-	 */
-	private static final boolean DEBUG = false; // TODO
-
-	/**
-	 * popupListener
-	 */
-	protected JMenu.WinListener popupListener;
-
-
-	//-------------------------------------------------------------
-	// Initialization ---------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * Constructor JMenu
-	 */
-	public JMenu() {
-		// TODO
-	} // JMenu()
-
-	/**
-	 * Constructor JMenu
-	 * @param text TODO
-	 */
-	public JMenu(String text) {
-		// TODO
-	} // JMenu()
-
-	/**
-	 * Constructor JMenu
-	 * @param action TODO
-	 */
-	public JMenu(Action action) {
-		// TODO
-	} // JMenu()
-
-	/**
-	 * Constructor JMenu
-	 * @param text TODO
-	 * @param tearoff TODO
-	 */
-	public JMenu(String text, boolean tearoff) {
-		// TODO
-	} // JMenu()
-
-
-	//-------------------------------------------------------------
-	// Methods ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * writeObject
-	 * @param stream TODO
-	 * @exception IOException TODO
-	 */
-	private void writeObject(ObjectOutputStream stream) throws IOException {
-		// TODO
-	} // writeObject()
-
-	/**
-	 * add
-	 * @param value0 TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem add(JMenuItem item) {
-		return null; // TODO
-	} // add()
-
-	/**
-	 * add
-	 * @param component TODO
-	 * @returns Component
-	 */
-	public Component add(Component component) {
-		return null; // TODO
-	} // add()
-
-	/**
-	 * add
-	 * @param component TODO
-	 * @param index TODO
-	 * @returns Component
-	 */
-	public Component add(Component component, int index) {
-		return null; // TODO
-	} // add()
-
-	/**
-	 * add
-	 * @param text TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem add(String text) {
-		return null; // TODO
-	} // add()
-
-	/**
-	 * add
-	 * @param action TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem add(Action action) {
-		return null; // TODO
-	} // add()
-
-	/**
-	 * remove
-	 * @param item TODO
-	 */
-	public void remove(JMenuItem item) {
-		// TODO
-	} // remove()
-
-	/**
-	 * remove
-	 * @param index TODO
-	 */
-	public void remove(int index) {
-		// TODO
-	} // remove()
-
-	/**
-	 * remove
-	 * @param component TODO
-	 */
-	public void remove(Component component) {
-		// TODO
-	} // remove()
-
-	/**
-	 * removeAll
-	 */
-	public void removeAll() {
-		// TODO
-	} // removeAll()
-
-	/**
-	 * insert
-	 * @param text TODO
-	 * @param index TODO
-	 */
-	public void insert(String text, int index) {
-		// TODO
-	} // insert()
-
-	/**
-	 * insert
-	 * @param item TODO
-	 * @param index TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem insert(JMenuItem item, int index) {
-		return null; // TODO
-	} // insert()
-
-	/**
-	 * insert
-	 * @param action TODO
-	 * @param index TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem insert(Action action, int index) {
-		return null; // TODO
-	} // insert()
-
-	/**
-	 * updateUI
-	 */
-	public void updateUI() {
-		//setUI((MenuUI) UIManager.get(this));
-		invalidate();
-	} // updateUI()
-
-	/**
-	 * getUIClassID
-	 * @returns String
-	 */
-	public String getUIClassID() {
-		return uiClassID;
-	} // getUIClassID()
-
-	/**
-	 * setModel
-	 * @param model TODO
-	 */
-	public void setModel(ButtonModel model) {
-		// TODO
-	} // setModel()
-
-	/**
-	 * isSelected
-	 * @returns boolean
-	 */
-	public boolean isSelected() {
-		return false; // TODO
-	} // isSelected()
-
-	/**
-	 * setSelected
-	 * @param selected TODO
-	 */
-	public void setSelected(boolean selected) {
-		// TODO
-	} // setSelected()
-
-	/**
-	 * isPopupMenuVisible
-	 * @returns boolean
-	 */
-	public boolean isPopupMenuVisible() {
-		return false; // TODO
-	} // isPopupMenuVisible()
-
-	/**
-	 * setPopupMenuVisible
-	 * @param popup TODO
-	 */
-	public void setPopupMenuVisible(boolean popup) {
-		// TODO
-	} // setPopupMenuVisible()
-
-	/**
-	 * getPopupMenuOrigin
-	 * @returns Point
-	 */
-	protected Point getPopupMenuOrigin() {
-		return null; // TODO
-	} // getPopupMenuOrigin()
-
-	/**
-	 * getDelay
-	 * @returns int
-	 */
-	public int getDelay() {
-		return 0; // TODO
-	} // getDelay()
-
-	/**
-	 * setDelay
-	 * @param value0 TODO
-	 */
-	public void setDelay(int delay) {
-		// TODO
-	} // setDelay()
-
-	/**
-	 * setMenuLocation
-	 * @param x TODO
-	 * @param y TODO
-	 */
-	public void setMenuLocation(int x, int y) {
-		// TODO
-	} // setMenuLocation()
-
-	/**
-	 * createActionComponent
-	 * @param action TODO
-	 * @returns JMenuItem
-	 */
-	protected JMenuItem createActionComponent(Action action) {
-		return null; // TODO
-	} // createActionComponent()
-
-	/**
-	 * createActionChangeListener
-	 * @param item TODO
-	 * @returns PropertyChangeListener
-	 */
-	protected PropertyChangeListener createActionChangeListener(JMenuItem item) {
-		return null; // TODO
-	} // createActionChangeListener()
-
-	/**
-	 * addSeparator
-	 */
-	public void addSeparator() {
-		// TODO
-	} // addSeparator()
-
-	/**
-	 * insertSeparator
-	 * @param index TODO
-	 */
-	public void insertSeparator(int index) {
-		// TODO
-	} // insertSeparator()
-
-	/**
-	 * getItem
-	 * @param index TODO
-	 * @returns JMenuItem
-	 */
-	public JMenuItem getItem(int index) {
-		return null; // TODO
-	} // getItem()
-
-	/**
-	 * getItemCount
-	 * @returns int
-	 */
-	public int getItemCount() {
-		return 0; // TODO
-	} // getItemCount()
-
-	/**
-	 * isTearOff
-	 * @returns boolean
-	 */
-	public boolean isTearOff() {
-		return false; // TODO
-	} // isTearOff()
-
-	/**
-	 * getMenuComponentCount
-	 * @returns int
-	 */
-	public int getMenuComponentCount() {
-		return 0; // TODO
-	} // getMenuComponentCount()
-
-	/**
-	 * getMenuComponent
-	 * @param index TODO
-	 * @returns Component
-	 */
-	public Component getMenuComponent(int index) {
-		return null; // TODO
-	} // getMenuComponent()
-
-	/**
-	 * getMenuComponents
-	 * @returns Component[]
-	 */
-	public Component[] getMenuComponents() {
-		return null; // TODO
-	} // getMenuComponents()
-
-	/**
-	 * isTopLevelMenu
-	 * @returns boolean
-	 */
-	public boolean isTopLevelMenu() {
-		return false; // TODO
-	} // isTopLevelMenu()
-
-	/**
-	 * isMenuComponent
-	 * @param component TODO
-	 * @returns boolean
-	 */
-	public boolean isMenuComponent(Component component) {
-		return false; // TODO
-	} // isMenuComponent()
-
-	/**
-	 * getPopupMenu
-	 * @returns JPopupMenu
-	 */
-	public JPopupMenu getPopupMenu() {
-		return null; // TODO
-	} // getPopupMenu()
-
-	/**
-	 * addMenuListener
-	 * @param listener TODO
-	 */
-	public void addMenuListener(MenuListener listener) {
-		// TODO
-	} // addMenuListener()
-
-	/**
-	 * removeMenuListener
-	 * @param listener TODO
-	 */
-	public void removeMenuListener(MenuListener listener) {
-		// TODO
-	} // removeMenuListener()
-
-	/**
-	 * fireMenuSelected
-	 */
-	protected void fireMenuSelected() {
-		// TODO
-	} // fireMenuSelected()
-
-	/**
-	 * fireMenuDeselected
-	 */
-	protected void fireMenuDeselected() {
-		// TODO
-	} // fireMenuDeselected()
-
-	/**
-	 * fireMenuCanceled
-	 */
-	protected void fireMenuCanceled() {
-		// TODO
-	} // fireMenuCanceled()
-
-	/**
-	 * createMenuChangeListener
-	 * @returns ChangeListener
-	 */
-	private ChangeListener createMenuChangeListener() {
-		return null; // TODO
-	} // createMenuChangeListener()
-
-	/**
-	 * createWinListener
-	 * @param popup TODO
-	 * @returns JMenu.WinListener
-	 */
-	protected JMenu.WinListener createWinListener(JPopupMenu popup) {
-		return null; // TODO
-	} // createWinListener()
-
-	/**
-	 * menuSelectionChanged
-	 * @param value0 TODO
-	 */
-	public void menuSelectionChanged(boolean changed) {
-		// TODO
-	} // menuSelectionChanged()
-
-	/**
-	 * getSubElements
-	 * @returns MenuElement[]
-	 */
-	public MenuElement[] getSubElements() {
-		return null; // TODO
-	} // getSubElements()
-
-	/**
-	 * getComponent
-	 * @returns Component
-	 */
-	public Component getComponent() {
-		return null; // TODO
-	} // getComponent()
-
-	/**
-	 * setAccelerator
-	 * @param keystroke TODO
-	 */
-	public void setAccelerator(KeyStroke keystroke) {
-		// TODO
-	} // setAccelerator()
-
-	/**
-	 * processKeyEvent
-	 * @param event TODO
-	 */
-	protected void processKeyEvent(KeyEvent event) {
-		// TODO
-	} // processKeyEvent()
-
-	/**
-	 * doClick
-	 * @param time TODO
-	 */
-	public void doClick(int time) {
-		// TODO
-	} // doClick()
-
-	/**
-	 * paramString
-	 * @returns String
-	 */
-	protected String paramString() {
-		return null; // TODO
-	} // paramString()
-
-	/**
-	 * getAccessibleContext
-	 * @returns AccessibleContext
-	 */
-	public AccessibleContext getAccessibleContext() {
-		if (accessibleContext == null) {
-			accessibleContext = new AccessibleJMenu(this);
-		} // if
-		return accessibleContext;
-	} // getAccessibleContext()
-
-
-} // JMenu
+  private static final String uiClassID = "MenuUI";
+  private static Hashtable listenerRegistry = null;
+  private JPopupMenu popupMenu = new JPopupMenu();
+  private ChangeListener menuChangeListener;
+  private MenuEvent menuEvent;
+  private int delay;
+  protected JMenu.WinListener popupListener;
+
+  /**
+   * Creates a new JMenu object.
+   */
+  public JMenu()
+  {
+    super();
+  }
+
+  /**
+   * Creates a new JMenu object.
+   *
+   * @param text DOCUMENT ME!
+   */
+  public JMenu(String text)
+  {
+    super(text);
+  }
+
+  /**
+   * Creates a new JMenu object.
+   *
+   * @param action DOCUMENT ME!
+   */
+  public JMenu(Action action)
+  {
+    super(action);
+  }
+
+  /**
+   * Creates a new JMenu object.
+   *
+   * @param text DOCUMENT ME!
+   * @param tearoff DOCUMENT ME!
+   */
+  public JMenu(String text, boolean tearoff)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param stream DOCUMENT ME!
+   *
+   * @throws IOException DOCUMENT ME!
+   */
+  private void writeObject(ObjectOutputStream stream) throws IOException
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param item DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem add(JMenuItem item)
+  {
+    return popupMenu.add(item);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param component DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Component add(Component component)
+  {
+    return popupMenu.add(component);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param component DOCUMENT ME!
+   * @param index DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Component add(Component component, int index)
+  {
+    return popupMenu.add(component, index);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param text DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem add(String text)
+  {
+    return popupMenu.add(text);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param action DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem add(Action action)
+  {
+    return popupMenu.add(action);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param item DOCUMENT ME!
+   */
+  public void remove(JMenuItem item)
+  {
+    popupMenu.remove(item);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param index DOCUMENT ME!
+   */
+  public void remove(int index)
+  {
+    popupMenu.remove(index);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param component DOCUMENT ME!
+   */
+  public void remove(Component component)
+  {
+    int index = popupMenu.getComponentIndex(component);
+    popupMenu.remove(index);
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void removeAll()
+  {
+    popupMenu.removeAll();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param text DOCUMENT ME!
+   * @param index DOCUMENT ME!
+   */
+  public void insert(String text, int index)
+  {
+    popupMenu.insert(new JMenuItem(text), index);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param item DOCUMENT ME!
+   * @param index DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem insert(JMenuItem item, int index)
+  {
+    popupMenu.insert(item, index);
+
+    return item;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param action DOCUMENT ME!
+   * @param index DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem insert(Action action, int index)
+  {
+    JMenuItem item = new JMenuItem(action);
+    popupMenu.insert(item, index);
+
+    return item;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void updateUI()
+  {
+    super.setUI((MenuItemUI) UIManager.getUI(this));
+    invalidate();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public String getUIClassID()
+  {
+    return uiClassID;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param model DOCUMENT ME!
+   */
+  public void setModel(ButtonModel model)
+  {
+    super.setModel(model);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public boolean isSelected()
+  {
+    return super.isSelected();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param selected DOCUMENT ME!
+   */
+  public void setSelected(boolean selected)
+  {
+    super.setSelected(selected);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public boolean isPopupMenuVisible()
+  {
+    return popupMenu.isVisible();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param popup DOCUMENT ME!
+   */
+  public void setPopupMenuVisible(boolean popup)
+  {
+    if (isEnabled())
+      popupMenu.setVisible(popup);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected Point getPopupMenuOrigin()
+  {
+    // if menu in the menu bar
+    if (isTopLevelMenu())
+      return new Point(0, this.getHeight());
+
+    // if submenu            
+    return new Point(this.getWidth(), 0);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public int getDelay()
+  {
+    return delay;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param delay DOCUMENT ME!
+   */
+  public void setDelay(int delay)
+  {
+    this.delay = delay;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param x DOCUMENT ME!
+   * @param y DOCUMENT ME!
+   */
+  public void setMenuLocation(int x, int y)
+  {
+    popupMenu.setLocation(x, y);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param action DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected JMenuItem createActionComponent(Action action)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param item DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected PropertyChangeListener createActionChangeListener(JMenuItem item)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void addSeparator()
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param index DOCUMENT ME!
+   */
+  public void insertSeparator(int index)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param index DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JMenuItem getItem(int index)
+  {
+    Component c = popupMenu.getComponentAtIndex(index);
+
+    if (c instanceof JMenuItem)
+      return (JMenuItem) c;
+    else
+      return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public int getItemCount()
+  {
+    return 0;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public boolean isTearOff()
+  {
+    return false;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public int getMenuComponentCount()
+  {
+    return popupMenu.getComponentCount();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param index DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Component getMenuComponent(int index)
+  {
+    return (Component) popupMenu.getComponentAtIndex(index);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Component[] getMenuComponents()
+  {
+    return popupMenu.getComponents();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public boolean isTopLevelMenu()
+  {
+    if (getParent() instanceof JMenuBar)
+      return true;
+    else
+      return false;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param component DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public boolean isMenuComponent(Component component)
+  {
+    return false;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public JPopupMenu getPopupMenu()
+  {
+    return popupMenu;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param listener DOCUMENT ME!
+   */
+  public void addMenuListener(MenuListener listener)
+  {
+    listenerList.add(MenuListener.class, listener);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param listener DOCUMENT ME!
+   */
+  public void removeMenuListener(MenuListener listener)
+  {
+    listenerList.remove(MenuListener.class, listener);
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void fireMenuSelected()
+  {
+    EventListener[] ll = listenerList.getListeners(MenuListener.class);
+
+    for (int i = 0; i < ll.length; i++)
+      ((MenuListener) ll[i]).menuSelected(new MenuEvent(this));
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void fireMenuDeselected()
+  {
+    EventListener[] ll = listenerList.getListeners(MenuListener.class);
+
+    for (int i = 0; i < ll.length; i++)
+      ((MenuListener) ll[i]).menuDeselected(new MenuEvent(this));
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void fireMenuCanceled()
+  {
+    EventListener[] ll = listenerList.getListeners(MenuListener.class);
+
+    for (int i = 0; i < ll.length; i++)
+      ((MenuListener) ll[i]).menuCanceled(new MenuEvent(this));
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  private ChangeListener createMenuChangeListener()
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param popup DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected JMenu.WinListener createWinListener(JPopupMenu popup)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param changed DOCUMENT ME!
+   */
+  public void menuSelectionChanged(boolean changed)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public MenuElement[] getSubElements()
+  {
+    return new MenuElement[] { popupMenu };
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Component getComponent()
+  {
+    return this;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param keystroke DOCUMENT ME!
+   */
+  public void setAccelerator(KeyStroke keystroke)
+  {
+    super.setAccelerator(keystroke);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param event DOCUMENT ME!
+   */
+  protected void processKeyEvent(KeyEvent event)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param time DOCUMENT ME!
+   */
+  public void doClick(int time)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected String paramString()
+  {
+    return "JMenu";
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public AccessibleContext getAccessibleContext()
+  {
+    if (accessibleContext == null)
+      accessibleContext = new AccessibleJMenu(this);
+
+    return accessibleContext;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @author $author$
+   * @version $Revision$
+   */
+  protected class AccessibleJMenu extends AccessibleJMenuItem
+    implements AccessibleSelection
+  {
+    /**
+     * Creates a new AccessibleJMenu object.
+     *
+     * @param component DOCUMENT ME!
+     */
+    protected AccessibleJMenu(JMenu component)
+    {
+      super(component);
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getAccessibleChildrenCount()
+    {
+      return 0;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public Accessible getAccessibleChild(int value0)
+    {
+      return null;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public AccessibleSelection getAccessibleSelection()
+    {
+      return null;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public Accessible getAccessibleSelection(int value0)
+    {
+      return null;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public boolean isAccessibleChildSelected(int value0)
+    {
+      return false;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.MENU;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @return DOCUMENT ME!
+     */
+    public int getAccessibleSelectionCount()
+    {
+      return 0;
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     */
+    public void addAccessibleSelection(int value0)
+    {
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     */
+    public void removeAccessibleSelection(int value0)
+    {
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void clearAccessibleSelection()
+    {
+    }
+
+    /**
+     * DOCUMENT ME!
+     */
+    public void selectAllAccessibleSelection()
+    {
+    }
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @author $author$
+   * @version $Revision$
+   */
+  protected class WinListener extends WindowAdapter implements Serializable
+  {
+    JPopupMenu popupMenu;
+
+    /**
+     * Creates a new WinListener object.
+     *
+     * @param value0 DOCUMENT ME!
+     * @param value1 DOCUMENT ME!
+     */
+    public WinListener(JMenu value0, JPopupMenu value1)
+    {
+    }
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param value0 DOCUMENT ME!
+     */
+    public void windowClosing(WindowEvent value0)
+    {
+    }
+  }
+}
Index: javax/swing/JPopupMenu.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JPopupMenu.java,v
retrieving revision 1.3.8.1
diff -c -p -u -r1.3.8.1 JPopupMenu.java
--- javax/swing/JPopupMenu.java	3 May 2004 15:38:32 -0000	1.3.8.1
+++ javax/swing/JPopupMenu.java	18 May 2004 14:17:23 -0000
@@ -218,6 +218,10 @@ public class JPopupMenu extends JCompone
     constraints.fill = GridBagConstraints.HORIZONTAL;
     constraints.weightx = 100.0;
     constraints.weighty = 100.0;
+    
+    if (index == -1)
+       index = getComponents().length;
+       
     constraints.gridy = index;
     super.add(component, constraints, index);
 
@@ -755,7 +759,8 @@ public class JPopupMenu extends JCompone
    */
   public boolean isPopupTrigger(MouseEvent event)
   {
-    return event.isPopupTrigger();
+    return ((PopupMenuUI)getUI()).isPopupTrigger(event);
+    
   }
 
   /**
@@ -825,6 +830,7 @@ public class JPopupMenu extends JCompone
     {
       JLayeredPane layeredPane;
       layeredPane = SwingUtilities.getRootPane(invoker).getLayeredPane();
+      this.setBounds(x, y, width, height);
       layeredPane.add(this, JLayeredPane.POPUP_LAYER, 0);
     }
 
Index: javax/swing/plaf/basic/BasicIconFactory.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicIconFactory.java,v
retrieving revision 1.3.2.2
diff -c -p -u -r1.3.2.2 BasicIconFactory.java
--- javax/swing/plaf/basic/BasicIconFactory.java	2 Apr 2004 20:00:52 -0000	1.3.2.2
+++ javax/swing/plaf/basic/BasicIconFactory.java	18 May 2004 14:17:23 -0000
@@ -82,7 +82,34 @@ public class BasicIconFactory implements
   }
   public static Icon getMenuArrowIcon()
   {
-    return new DummyIcon();
+    return new Icon()
+      {
+	public int getIconHeight()
+	{
+	  return 12;
+	}
+
+	public int getIconWidth()
+	{
+	  return 12;
+	}
+
+	public void paintIcon(Component c, Graphics g, int x, int y)
+	{
+	  g.translate(x, y);
+
+	  Color saved = g.getColor();
+
+	  g.setColor(Color.BLACK);
+
+	  g.fillPolygon(new Polygon(new int[] { 3, 9, 3 },
+                                  new int[] { 2, 6, 10 },
+                                  3));
+
+	  g.setColor(saved);
+	  g.translate(-x, -y);
+	}
+      };
   }
 
   public static Icon getCheckBoxIcon()
Index: javax/swing/plaf/basic/BasicMenuItemUI.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicMenuItemUI.java,v
retrieving revision 1.1.2.7
diff -c -p -u -r1.1.2.7 BasicMenuItemUI.java
--- javax/swing/plaf/basic/BasicMenuItemUI.java	27 Apr 2004 16:33:31 -0000	1.1.2.7
+++ javax/swing/plaf/basic/BasicMenuItemUI.java	18 May 2004 14:17:23 -0000
@@ -62,6 +62,7 @@ import javax.swing.ButtonModel;
 import javax.swing.Icon;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
+import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JRadioButtonMenuItem;
 import javax.swing.KeyStroke;
@@ -172,7 +173,7 @@ public class BasicMenuItemUI extends Men
    */
   private int defaultAcceleratorLabelGap = 4;
 
-  BasicMenuItemUI()
+  public BasicMenuItemUI()
   {
     mouseInputListener = createMouseInputListener(menuItem);
     menuDragMouseListener = createMenuDragMouseListener(menuItem);
@@ -240,7 +241,6 @@ public class BasicMenuItemUI extends Men
    */
   public Dimension getMaximumSize(JComponent c)
   {
-    // TODO    
     return null;
   }
 
@@ -253,7 +253,6 @@ public class BasicMenuItemUI extends Men
    */
   public Dimension getMinimumSize(JComponent c)
   {
-    // TODO
     return null;
   }
 
@@ -325,7 +324,15 @@ public class BasicMenuItemUI extends Men
 	  d.height = checkIcon.getIconHeight();
       }
 
-    return d;
+     if (arrowIcon != null && (c instanceof JMenu))
+      {
+       d.width = d.width + arrowIcon.getIconWidth() + defaultTextIconGap;
+
+       if (arrowIcon.getIconHeight() > d.height)
+         d.height = arrowIcon.getIconHeight();
+       }
+
+     return d;
   }
 
   /**
@@ -364,7 +371,6 @@ public class BasicMenuItemUI extends Men
     acceleratorFont = defaults.getFont("MenuItem.acceleratorFont");
     acceleratorForeground = defaults.getColor("MenuItem.acceleratorForeground");
     acceleratorSelectionForeground = defaults.getColor("MenuItem.acceleratorSelectionForeground");
-    arrowIcon = defaults.getIcon("MenuItem.arrowIcon");
     selectionBackground = defaults.getColor("MenuItem.selectionBackground");
     selectionForeground = defaults.getColor("MenuItem.selectionForeground");
     acceleratorDelimiter = defaults.getString("MenuItem.acceleratorDelimiter");
@@ -495,10 +501,16 @@ public class BasicMenuItemUI extends Men
 	vr.x = cr.x + cr.width + defaultTextIconGap;
       }
 
-    if (arrowIcon != null)
+    if (arrowIcon != null && (c instanceof JMenu))
       {
-	// FIXME: if this menu contains a submenu, we need to draw arrow icon 
-	// here as well
+	if (! ((JMenu) c).isTopLevelMenu())
+	  {
+	    int width = arrowIcon.getIconWidth();
+	    int height = arrowIcon.getIconHeight();
+
+	    arrowIcon.paintIcon(c, g, vr.width - width + defaultTextIconGap,
+	                        vr.y + 2);
+	  }
       }
 
     // paint text and user menu icon if it exists	     
Index: javax/swing/plaf/basic/BasicMenuUI.java
===================================================================
RCS file: javax/swing/plaf/basic/BasicMenuUI.java
diff -N javax/swing/plaf/basic/BasicMenuUI.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ javax/swing/plaf/basic/BasicMenuUI.java	18 May 2004 14:17:23 -0000
@@ -0,0 +1,349 @@
+/* BasicMenuUI.java
+   Copyright (C) 2002, 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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.plaf.basic;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Insets;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.MenuElement;
+import javax.swing.MenuSelectionManager;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.MenuDragMouseEvent;
+import javax.swing.event.MenuDragMouseListener;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuKeyEvent;
+import javax.swing.event.MenuKeyListener;
+import javax.swing.event.MenuListener;
+import javax.swing.event.MouseInputListener;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.MenuItemUI;
+
+
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision: 1.1.2.7 $
+ */
+public class BasicMenuUI extends BasicMenuItemUI
+{
+  protected ChangeListener changeListener;
+  protected MenuListener menuListener;
+  protected PropertyChangeListener propertyChangeListener;
+
+  /**
+   * Creates a new BasicMenuUI object.
+   */
+  public BasicMenuUI()
+  {
+    mouseInputListener = createMouseInputListener(menuItem);
+    menuListener = createMenuListener(menuItem);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected ChangeListener createChangeListener(JComponent c)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected MenuDragMouseListener createMenuDragMouseListener(JComponent c)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected MenuKeyListener createMenuKeyListener(JComponent c)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected MenuListener createMenuListener(JComponent c)
+  {
+    return new MenuHandler();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected MouseInputListener createMouseInputListener(JComponent c)
+  {
+    return new MouseInputHandler();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected PropertyChangeListener createPropertyChangeListener(JComponent c)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param x DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public static ComponentUI createUI(JComponent x)
+  {
+    return new BasicMenuUI();
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param c DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Dimension getMaximumSize(JComponent c)
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  protected String getPropertyPrefix()
+  {
+    return null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void installDefaults()
+  {
+    UIDefaults defaults = UIManager.getLookAndFeelDefaults();
+
+    menuItem.setBackground(defaults.getColor("Menu.background"));
+    menuItem.setBorder(defaults.getBorder("Menu.border"));
+    menuItem.setFont(defaults.getFont("Menu.font"));
+    menuItem.setForeground(defaults.getColor("Menu.foreground"));
+    menuItem.setMargin(defaults.getInsets("Menu.margin"));
+    acceleratorFont = defaults.getFont("Menu.acceleratorFont");
+    acceleratorForeground = defaults.getColor("Menu.acceleratorForeground");
+    acceleratorSelectionForeground = defaults.getColor("Menu.acceleratorSelectionForeground");
+    arrowIcon = defaults.getIcon("Menu.arrowIcon");
+    oldBorderPainted = defaults.getBoolean("Menu.borderPainted");
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void installKeyboardActions()
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void installListeners()
+  {
+    ((JMenu) menuItem).addMouseListener(mouseInputListener);
+    ((JMenu) menuItem).addMenuListener(menuListener);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param menu DOCUMENT ME!
+   */
+  protected void setupPostTimer(JMenu menu)
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void uninstallDefaults()
+  {
+    menuItem.setBackground(null);
+    menuItem.setBorder(null);
+    menuItem.setFont(null);
+    menuItem.setForeground(null);
+    menuItem.setMargin(null);
+    acceleratorFont = null;
+    acceleratorForeground = null;
+    acceleratorSelectionForeground = null;
+    arrowIcon = null;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void uninstallKeyboardActions()
+  {
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  protected void uninstallListeners()
+  {
+  }
+
+  /**
+  * DOCUMENT ME!
+  *
+  * @author $author$
+  * @version $Revision: 1.1.2.7 $
+  */
+  protected class MouseInputHandler implements MouseInputListener
+  {
+    protected MouseInputHandler()
+    {
+    }
+
+    public void mouseClicked(MouseEvent e)
+    {
+    }
+
+    public void mouseDragged(MouseEvent e)
+    {
+      MenuSelectionManager manager = MenuSelectionManager.defaultManager();
+      manager.processMouseEvent(e);
+    }
+
+    public void mouseEntered(MouseEvent e)
+    {
+      MenuSelectionManager manager = MenuSelectionManager.defaultManager();
+      manager.setSelectedPath(manager.getPath((Component) e.getSource()));
+      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())
+	y = subMenu.getHeight();
+
+      else
+	x = subMenu.getWidth();
+
+      subMenu.getPopupMenu().show(subMenu, x, y);
+    }
+
+    public void mouseExited(MouseEvent e)
+    {
+    }
+
+    public void mouseMoved(MouseEvent e)
+    {
+    }
+
+    public void mousePressed(MouseEvent e)
+    {
+    }
+
+    public void mouseReleased(MouseEvent e)
+    {
+      MenuSelectionManager manager = MenuSelectionManager.defaultManager();
+      manager.processMouseEvent(e);
+    }
+  }
+
+  protected class MenuHandler implements MenuListener
+  {
+    public void menuCanceled(MenuEvent e)
+    {
+    }
+
+    public void menuDeselected(MenuEvent e)
+    {
+    }
+
+    public void menuSelected(MenuEvent e)
+    {
+    }
+  }
+}


More information about the Java-patches mailing list