📄 basicpopupmenuui.java
字号:
/* * @(#)BasicPopupMenuUI.java 1.101 03/01/31 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.basic;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.border.*;import java.awt.Component;import java.awt.Container;import java.awt.Dimension;import java.awt.KeyboardFocusManager;import java.awt.Window;import java.awt.event.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.util.*;/** * A Windows L&F implementation of PopupMenuUI. This implementation * is a "combined" view/controller. * * @version 1.101 01/31/03 * @author Georges Saab * @author David Karlton * @author Arnaud Weber */public class BasicPopupMenuUI extends PopupMenuUI { protected JPopupMenu popupMenu = null; static boolean menuKeyboardHelperInstalled = false; static MenuKeyboardHelper menuKeyboardHelper = null;private static boolean checkInvokerEqual(MenuElement present, MenuElement last) { Component invokerPresent = present.getComponent(); Component invokerLast = last.getComponent(); if (invokerPresent instanceof JPopupMenu) { invokerPresent = ((JPopupMenu)invokerPresent).getInvoker(); } if (invokerLast instanceof JPopupMenu) { invokerLast = ((JPopupMenu)invokerLast).getInvoker(); } return (invokerPresent == invokerLast); } public static ComponentUI createUI(JComponent x) { return new BasicPopupMenuUI(); } public void installUI(JComponent c) { popupMenu = (JPopupMenu) c; installDefaults(); installListeners(); installKeyboardActions(); } public void installDefaults() { if (popupMenu.getLayout() == null || popupMenu.getLayout() instanceof UIResource) popupMenu.setLayout(new DefaultMenuLayout(popupMenu, BoxLayout.Y_AXIS)); popupMenu.setOpaque(true); LookAndFeel.installBorder(popupMenu, "PopupMenu.border"); LookAndFeel.installColorsAndFont(popupMenu, "PopupMenu.background", "PopupMenu.foreground", "PopupMenu.font"); } protected void installListeners() { if (mouseGrabber == null) { mouseGrabber = new MouseGrabber(); } if (basicPopupMenuListener == null) { basicPopupMenuListener = createPopupMenuListener(); } popupMenu.addPopupMenuListener(basicPopupMenuListener); if (!menuKeyboardHelperInstalled) { if (menuKeyboardHelper == null) { menuKeyboardHelper = new MenuKeyboardHelper(); } MenuSelectionManager msm = MenuSelectionManager.defaultManager(); msm.addChangeListener(menuKeyboardHelper); } } protected void installKeyboardActions() { } static InputMap getInputMap(JPopupMenu popup, JComponent c) { InputMap windowInputMap = null; Object[] bindings = (Object[])UIManager.get("PopupMenu.selectedWindowInputMapBindings"); if (bindings != null) { windowInputMap = LookAndFeel.makeComponentInputMap(c, bindings); if (!popup.getComponentOrientation().isLeftToRight()) { Object[] km = (Object[])UIManager.get("PopupMenu.selectedWindowInputMapBindings.RightToLeft"); if (km != null) { InputMap rightToLeftInputMap = LookAndFeel.makeComponentInputMap(c, km); rightToLeftInputMap.setParent(windowInputMap); windowInputMap = rightToLeftInputMap; } } } return windowInputMap; } static ActionMap getActionMap() { ActionMap map = (ActionMap)UIManager.get("PopupMenu.actionMap"); if (map == null) { map = createActionMap(); if (map != null) { UIManager.getLookAndFeelDefaults().put("PopupMenu.actionMap", map); } } return map; } static ActionMap createActionMap() { ActionMap map = new ActionMapUIResource(); // Set the ActionMap's parent to the Auditory Feedback Action Map BasicLookAndFeel lf = (BasicLookAndFeel)UIManager.getLookAndFeel(); ActionMap audioMap = lf.getAudioActionMap(); map.setParent(audioMap); map.put("cancel", new CancelAction()); map.put("selectNext", new SelectNextItemAction(SelectNextItemAction.FORWARD)); map.put("selectPrevious", new SelectNextItemAction(SelectNextItemAction.BACKWARD)); map.put("selectParent", new SelectParentChildAction(SelectParentChildAction.PARENT)); map.put("selectChild", new SelectParentChildAction(SelectParentChildAction.CHILD)); map.put("return", new ReturnAction()); // return the created map return map; } public void uninstallUI(JComponent c) { uninstallDefaults(); uninstallListeners(); uninstallKeyboardActions(); popupMenu = null; } protected void uninstallDefaults() { LookAndFeel.uninstallBorder(popupMenu); } protected void uninstallListeners() { if (basicPopupMenuListener != null) { popupMenu.removePopupMenuListener(basicPopupMenuListener); } } protected void uninstallKeyboardActions() { SwingUtilities.replaceUIActionMap(popupMenu, null); SwingUtilities.replaceUIInputMap(popupMenu, JComponent.WHEN_IN_FOCUSED_WINDOW, null); } public Dimension getMinimumSize(JComponent c) { return getPreferredSize(c); } public Dimension getPreferredSize(JComponent c) { return null; } public Dimension getMaximumSize(JComponent c) { return getPreferredSize(c); }/////////////////////////////////////////////////////////////////////////////////// Grab Code/////////////////////////////////////////////////////////////////////////////// private static Window getWindow(Component c) { Component w = c; while(!(w instanceof Window) && (w!=null)) { w = w.getParent(); } return (Window)w; } private static MenuElement getFirstPopup() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); MenuElement me = null; for(int i = 0 ; me == null && i < p.length ; i++) { if (p[i] instanceof JPopupMenu) me = p[i]; } return me; } private static JPopupMenu getLastPopup() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); JPopupMenu popup = null; for(int i = p.length - 1; popup == null && i >= 0; i--) { if (p[i] instanceof JPopupMenu) popup = (JPopupMenu)p[i]; } return popup; } private static List getPopups() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); List list = new ArrayList(p.length); for(int i = 0; i < p.length; i++) { if (p[i] instanceof JPopupMenu) { list.add((JPopupMenu)p[i]); } } return list; } private transient static MouseGrabber mouseGrabber = null; private static class MouseGrabber implements MouseListener, MouseMotionListener, MouseWheelListener, WindowListener, WindowFocusListener, ComponentListener, ChangeListener { Vector grabbed = new Vector(); MenuElement lastGrabbed = null; boolean lastGrabbedMenuBarChild = false; public MouseGrabber() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); msm.addChangeListener(this); } private void requestAddGrab(Component invoker) { Window ancestor; ancestor = getWindow(invoker); MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); Component excluded = null; for(int i = 0 ; excluded == null && i < p.length ; i++) { if (p[i] instanceof JPopupMenu) excluded = p[i].getComponent(); } grabContainer(ancestor, excluded); } private void requestRemoveGrab() { ungrabContainers(); } void cancelPopupMenu() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); JPopupMenu firstPopup = (JPopupMenu)getFirstPopup(); if (lastGrabbed == firstPopup) { // 4234793: This action should call firePopupMenuCanceled but it's // a protected method. The real solution could be to make // firePopupMenuCanceled public and call it directly. List popups = getPopups(); Iterator iter = popups.iterator(); while (iter.hasNext()) { JPopupMenu popup = (JPopupMenu)iter.next(); popup.putClientProperty("JPopupMenu.firePopupMenuCanceled", Boolean.TRUE); } MenuSelectionManager.defaultManager().clearSelectedPath(); ungrabContainers(); } else { // The cancel has cause another menu selection lastGrabbed = firstPopup; if (p[0] instanceof JMenuBar) { lastGrabbedMenuBarChild = true; } else { lastGrabbedMenuBarChild = false; } } } MenuElement[] lastPathSelected = new MenuElement[0]; public void stateChanged(ChangeEvent e) { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); if (lastPathSelected.length != 0 && p.length != 0 ) { if (!checkInvokerEqual(p[0],lastPathSelected[0])) { requestRemoveGrab(); lastPathSelected = new MenuElement[0]; } } if (lastPathSelected.length == 0 && p.length != 0) { // A grab needs to be added Component invoker = p[0].getComponent(); if (invoker instanceof JPopupMenu) invoker = ((JPopupMenu)invoker).getInvoker(); requestAddGrab(invoker); } if (lastPathSelected.length != 0 && p.length == 0) { // The grab should be removed requestRemoveGrab(); } // Switch between menubar children if (p!=null && p.length>2 && (p[0] instanceof JMenuBar && lastGrabbedMenuBarChild == true)) { if (!(lastGrabbed==getFirstPopup())) { lastGrabbed=getFirstPopup(); if (p[0] instanceof JMenuBar) { lastGrabbedMenuBarChild = true; } else { lastGrabbedMenuBarChild = false; } } } // Remember the last path selected lastPathSelected = p; } void grabContainer(Container c, Component excluded) { if(c == excluded) return; MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] p = msm.getSelectedPath(); lastGrabbed = getFirstPopup();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -