src/macosx/classes/com/apple/laf/ScreenMenuBar.java
Print this page
*** 23,32 ****
--- 23,35 ----
* questions.
*/
package com.apple.laf;
+ import sun.awt.AWTAccessor;
+ import sun.lwawt.macosx.CMenuBar;
+
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import java.security.*;
import java.util.*;
*** 241,298 ****
menu.removeComponentListener(this);
remove(screenMenu);
fSubmenus.remove(menu);
}
- private static Field[] stolenFields = null;
-
- static {
- stolenFields = AccessController.doPrivileged(new PrivilegedAction<Field[]>() {
- public Field[] run() {
- try {
- final Field[] localFields = new Field[2];
- localFields[0] = MenuBar.class.getDeclaredField("menus");
- localFields[1] = MenuComponent.class.getDeclaredField("parent");
- AccessibleObject.setAccessible(localFields, true);
- return localFields;
- } catch (final NoSuchFieldException nsf) {
- // If this happens, Sun changed the definition of MenuBar and MenuComponent!
- nsf.printStackTrace(System.err);
- return null;
- }
- }
- });
- };
-
public Menu add(final Menu m, final int index) {
synchronized (getTreeLock()) {
if (m.getParent() != null) {
m.getParent().remove(m);
}
! // Use nasty reflection to get at the menus array and parent fields.
! try {
! if (stolenFields == null) return m;
!
! @SuppressWarnings("unchecked")
! final Vector<Menu> menus = (Vector<Menu>)stolenFields[0].get(this);
menus.insertElementAt(m, index);
! stolenFields[1].set(m, this);
!
! final sun.lwawt.macosx.CMenuBar peer = (sun.lwawt.macosx.CMenuBar)getPeer();
if (peer == null) return m;
peer.setNextInsertionIndex(index);
if (m.getPeer() == null) {
m.addNotify();
}
peer.setNextInsertionIndex(-1);
- } catch (final IllegalAccessException iae) {
- iae.printStackTrace(System.err);
- }
-
return m;
}
}
}
--- 244,271 ----
menu.removeComponentListener(this);
remove(screenMenu);
fSubmenus.remove(menu);
}
public Menu add(final Menu m, final int index) {
synchronized (getTreeLock()) {
if (m.getParent() != null) {
m.getParent().remove(m);
}
! final Vector<Menu> menus = AWTAccessor.getMenuBarAccessor().getMenus(this);
menus.insertElementAt(m, index);
+ AWTAccessor.getMenuComponentAccessor().setParent(m, this);
! final CMenuBar peer = (CMenuBar)getPeer();
if (peer == null) return m;
peer.setNextInsertionIndex(index);
if (m.getPeer() == null) {
m.addNotify();
}
peer.setNextInsertionIndex(-1);
return m;
}
}
}