|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package javax.swing.plaf.basic; |
|
|
|
import sun.swing.DefaultLookup; |
|
import sun.swing.UIAction; |
|
import javax.swing.*; |
|
import javax.swing.event.*; |
|
import java.awt.Color; |
|
import java.awt.Component; |
|
import java.awt.Container; |
|
import java.awt.Dimension; |
|
import java.awt.Graphics; |
|
import java.awt.Insets; |
|
import java.awt.Point; |
|
import java.awt.Rectangle; |
|
import java.awt.event.*; |
|
import java.beans.PropertyChangeEvent; |
|
import java.beans.PropertyChangeListener; |
|
|
|
import javax.swing.border.*; |
|
import javax.swing.plaf.*; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class BasicMenuBarUI extends MenuBarUI { |
|
protected JMenuBar menuBar = null; |
|
protected ContainerListener containerListener; |
|
protected ChangeListener changeListener; |
|
private Handler handler; |
|
|
|
public static ComponentUI createUI(JComponent x) { |
|
return new BasicMenuBarUI(); |
|
} |
|
|
|
static void loadActionMap(LazyActionMap map) { |
|
map.put(new Actions(Actions.TAKE_FOCUS)); |
|
} |
|
|
|
public void installUI(JComponent c) { |
|
menuBar = (JMenuBar) c; |
|
|
|
installDefaults(); |
|
installListeners(); |
|
installKeyboardActions(); |
|
|
|
} |
|
|
|
protected void installDefaults() { |
|
if (menuBar.getLayout() == null || |
|
menuBar.getLayout() instanceof UIResource) { |
|
menuBar.setLayout(new DefaultMenuLayout(menuBar,BoxLayout.LINE_AXIS)); |
|
} |
|
|
|
LookAndFeel.installProperty(menuBar, "opaque", Boolean.TRUE); |
|
LookAndFeel.installBorder(menuBar,"MenuBar.border"); |
|
LookAndFeel.installColorsAndFont(menuBar, |
|
"MenuBar.background", |
|
"MenuBar.foreground", |
|
"MenuBar.font"); |
|
} |
|
|
|
protected void installListeners() { |
|
containerListener = createContainerListener(); |
|
changeListener = createChangeListener(); |
|
|
|
for (int i = 0; i < menuBar.getMenuCount(); i++) { |
|
JMenu menu = menuBar.getMenu(i); |
|
if (menu!=null) |
|
menu.getModel().addChangeListener(changeListener); |
|
} |
|
menuBar.addContainerListener(containerListener); |
|
} |
|
|
|
protected void installKeyboardActions() { |
|
InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); |
|
|
|
SwingUtilities.replaceUIInputMap(menuBar, |
|
JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); |
|
|
|
LazyActionMap.installLazyActionMap(menuBar, BasicMenuBarUI.class, |
|
"MenuBar.actionMap"); |
|
} |
|
|
|
InputMap getInputMap(int condition) { |
|
if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) { |
|
Object[] bindings = (Object[])DefaultLookup.get |
|
(menuBar, this, "MenuBar.windowBindings"); |
|
if (bindings != null) { |
|
return LookAndFeel.makeComponentInputMap(menuBar, bindings); |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
public void uninstallUI(JComponent c) { |
|
uninstallDefaults(); |
|
uninstallListeners(); |
|
uninstallKeyboardActions(); |
|
|
|
menuBar = null; |
|
} |
|
|
|
protected void uninstallDefaults() { |
|
if (menuBar!=null) { |
|
LookAndFeel.uninstallBorder(menuBar); |
|
} |
|
} |
|
|
|
protected void uninstallListeners() { |
|
menuBar.removeContainerListener(containerListener); |
|
|
|
for (int i = 0; i < menuBar.getMenuCount(); i++) { |
|
JMenu menu = menuBar.getMenu(i); |
|
if (menu !=null) |
|
menu.getModel().removeChangeListener(changeListener); |
|
} |
|
|
|
containerListener = null; |
|
changeListener = null; |
|
handler = null; |
|
} |
|
|
|
protected void uninstallKeyboardActions() { |
|
SwingUtilities.replaceUIInputMap(menuBar, JComponent. |
|
WHEN_IN_FOCUSED_WINDOW, null); |
|
SwingUtilities.replaceUIActionMap(menuBar, null); |
|
} |
|
|
|
protected ContainerListener createContainerListener() { |
|
return getHandler(); |
|
} |
|
|
|
protected ChangeListener createChangeListener() { |
|
return getHandler(); |
|
} |
|
|
|
private Handler getHandler() { |
|
if (handler == null) { |
|
handler = new Handler(); |
|
} |
|
return handler; |
|
} |
|
|
|
|
|
public Dimension getMinimumSize(JComponent c) { |
|
return null; |
|
} |
|
|
|
public Dimension getMaximumSize(JComponent c) { |
|
return null; |
|
} |
|
|
|
private class Handler implements ChangeListener, ContainerListener { |
|
// |
|
// ChangeListener |
|
|
|
public void stateChanged(ChangeEvent e) { |
|
int i,c; |
|
for(i=0,c = menuBar.getMenuCount() ; i < c ; i++) { |
|
JMenu menu = menuBar.getMenu(i); |
|
if(menu !=null && menu.isSelected()) { |
|
menuBar.getSelectionModel().setSelectedIndex(i); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
// |
|
// ContainerListener |
|
|
|
public void componentAdded(ContainerEvent e) { |
|
Component c = e.getChild(); |
|
if (c instanceof JMenu) |
|
((JMenu)c).getModel().addChangeListener(changeListener); |
|
} |
|
public void componentRemoved(ContainerEvent e) { |
|
Component c = e.getChild(); |
|
if (c instanceof JMenu) |
|
((JMenu)c).getModel().removeChangeListener(changeListener); |
|
} |
|
} |
|
|
|
|
|
private static class Actions extends UIAction { |
|
private static final String TAKE_FOCUS = "takeFocus"; |
|
|
|
Actions(String key) { |
|
super(key); |
|
} |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
JMenuBar menuBar = (JMenuBar)e.getSource(); |
|
MenuSelectionManager defaultManager = MenuSelectionManager.defaultManager(); |
|
MenuElement me[]; |
|
MenuElement subElements[]; |
|
JMenu menu = menuBar.getMenu(0); |
|
if (menu!=null) { |
|
me = new MenuElement[3]; |
|
me[0] = (MenuElement) menuBar; |
|
me[1] = (MenuElement) menu; |
|
me[2] = (MenuElement) menu.getPopupMenu(); |
|
defaultManager.setSelectedPath(me); |
|
} |
|
} |
|
} |
|
} |