synthpopupmenuui.java
来自「java jdk 1.4的源码」· Java 代码 · 共 1,206 行 · 第 1/3 页
JAVA
1,206 行
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(); if (p[0] instanceof JMenuBar) { lastGrabbedMenuBarChild = true; } else { lastGrabbedMenuBarChild = false; } Component ignore = null; if(c instanceof java.awt.Window) { ((java.awt.Window)c).addWindowListener(this); ((java.awt.Window)c).addWindowFocusListener(this); ((java.awt.Window)c).addComponentListener(this); grabbed.addElement(c); } else if (c instanceof JRootPane) { // Only add listeners to the glass pane if it listeners, // otherwise if the glass pane is visible no mouse move // events will come to us. ignore = ((JRootPane)c).getGlassPane(); if (ignore.getMouseListeners().length > 0 || ignore.getMouseMotionListeners().length > 0 || ignore.getMouseWheelListeners().length > 0) { ignore = null; } } synchronized(c.getTreeLock()) { int ncomponents = c.getComponentCount(); Component[] component = c.getComponents(); for (int i = 0 ; i < ncomponents ; i++) { Component comp = component[i]; if(!comp.isVisible()) continue; if (comp != ignore) { comp.addMouseListener(this); comp.addMouseMotionListener(this); comp.addMouseWheelListener(this); grabbed.addElement(comp); } if (comp instanceof Container) { Container cont = (Container) comp; grabContainer(cont, excluded); } } } } void ungrabContainers() { int i,c; Component cpn; for(i=0,c=grabbed.size();i<c;i++) { cpn = (Component)grabbed.elementAt(i); if(cpn instanceof java.awt.Window) { ((java.awt.Window)cpn).removeWindowListener(this); ((java.awt.Window)cpn).removeWindowFocusListener(this); ((java.awt.Window)cpn).removeComponentListener(this); } else { cpn.removeMouseListener(this); cpn.removeMouseMotionListener(this); cpn.removeMouseWheelListener(this); } } grabbed = new Vector(); lastGrabbed = null; lastGrabbedMenuBarChild = false; } public void mousePressed(MouseEvent e) { Component c = (Component)e.getSource(); MenuSelectionManager msm = MenuSelectionManager.defaultManager(); cancelPopupMenu(); /* if(msm.isComponentPartOfCurrentMenu(popupMenu) && msm.isComponentPartOfCurrentMenu(c)) { return; } else { cancelPopupMenu(); } */ } public void mouseReleased(MouseEvent e) { MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseEntered(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseExited(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseMoved(MouseEvent e) { // MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseDragged(MouseEvent e) { MenuSelectionManager.defaultManager().processMouseEvent(e); } public void mouseClicked(MouseEvent e) { } public void mouseWheelMoved(MouseWheelEvent e) { cancelPopupMenu(); } public void componentResized(ComponentEvent e) { cancelPopupMenu(); } public void componentMoved(ComponentEvent e) { cancelPopupMenu(); } public void componentShown(ComponentEvent e) { cancelPopupMenu(); } public void componentHidden(ComponentEvent e) { cancelPopupMenu(); } public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { cancelPopupMenu(); } public void windowClosed(WindowEvent e) { cancelPopupMenu(); } public void windowIconified(WindowEvent e) { cancelPopupMenu(); } public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } public void windowLostFocus(WindowEvent e) { } public void windowGainedFocus(WindowEvent e) { } } public boolean isPopupTrigger(MouseEvent e) { return ((e.getID()==MouseEvent.MOUSE_RELEASED) && ((e.getModifiers() & MouseEvent.BUTTON3_MASK)!=0)); } // for auditory feedback private transient PopupMenuListener basicPopupMenuListener = null; // for auditory feedback private PopupMenuListener createPopupMenuListener() { return new BasicPopupMenuListener(); } /** * This Listener fires the Action that provides the correct auditory * feedback. * * @since 1.4 */ private class BasicPopupMenuListener implements PopupMenuListener { public void popupMenuCanceled(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { // Fire the Action that renders the auditory cue. SynthLookAndFeel.playSound((JComponent)e.getSource(), "PopupMenu.popupSound"); } } private static class CancelAction extends AbstractAction { public void actionPerformed(ActionEvent e) { // 4234793: This action should call JPopupMenu.firePopupMenuCanceled but it's // a protected method. The real solution could be to make // firePopupMenuCanceled public and call it directly. JPopupMenu lastPopup = (JPopupMenu)getLastPopup(); if (lastPopup != null) { lastPopup.putClientProperty("JPopupMenu.firePopupMenuCanceled", Boolean.TRUE); } MenuElement path[] = MenuSelectionManager.defaultManager().getSelectedPath(); if(path.length > 4) { /* PENDING(arnaud) Change this to 2 when a mouse grabber is available for MenuBar */ MenuElement newPath[] = new MenuElement[path.length - 2]; System.arraycopy(path,0,newPath,0,path.length-2); MenuSelectionManager.defaultManager().setSelectedPath(newPath); } else MenuSelectionManager.defaultManager().clearSelectedPath(); } } private static class ReturnAction extends AbstractAction { public void actionPerformed(ActionEvent e) { KeyboardFocusManager fmgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); Component focusOwner = fmgr.getFocusOwner(); if(focusOwner != null && !(focusOwner instanceof JRootPane)) { return; } MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement path[] = msm.getSelectedPath(); MenuElement lastElement; if(path.length > 0) { lastElement = path[path.length-1]; if(lastElement instanceof JMenu) { MenuElement newPath[] = new MenuElement[path.length+1]; System.arraycopy(path,0,newPath,0,path.length); newPath[path.length] = ((JMenu)lastElement).getPopupMenu(); msm.setSelectedPath(newPath); } else if(lastElement instanceof JMenuItem) { JMenuItem mi = (JMenuItem)lastElement; if (mi.getUI() instanceof SynthMenuItemUI) { ((SynthMenuItemUI)mi.getUI()).doClick(msm); } else { msm.clearSelectedPath(); mi.doClick(0); } } } } } private static MenuElement nextEnabledChild(MenuElement e[], int fromIndex, int toIndex) { for (int i=fromIndex; i<=toIndex; i++) { if (e[i] != null) { Component comp = e[i].getComponent(); if (comp != null && comp.isEnabled()) return e[i]; } } return null; } private static MenuElement previousEnabledChild(MenuElement e[], int fromIndex, int toIndex) { for (int i=fromIndex; i>=toIndex; i--) { if (e[i] != null) { Component comp = e[i].getComponent(); if (comp != null && comp.isEnabled()) return e[i]; } } return null; } private static MenuElement findEnabledChild(MenuElement e[], int fromIndex, boolean forward) { MenuElement result = null; if (forward) { result = nextEnabledChild(e, fromIndex+1, e.length-1); if (result == null) result = nextEnabledChild(e, 0, fromIndex-1); } else { result = previousEnabledChild(e, fromIndex-1, 0); if (result == null) result = previousEnabledChild(e, e.length-1, fromIndex+1); } return result; } private static MenuElement findEnabledChild(MenuElement e[], MenuElement elem, boolean forward) { for (int i=0; i<e.length; i++) { if (e[i] == elem) { return findEnabledChild(e, i, forward); } } return null; } private static class SelectNextItemAction extends AbstractAction { static boolean FORWARD = true; static boolean BACKWARD = false; boolean direction; SelectNextItemAction(boolean dir) { direction = dir; } public void actionPerformed(ActionEvent e) { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement path[] = msm.getSelectedPath(); if (path.length < 2) { return; } int len = path.length; if (path[0] instanceof JMenuBar && path[1] instanceof JMenu && len == 2) { // a toplevel menu is selected, but its popup not shown. // Show the popup and select the first item JPopupMenu popup = ((JMenu)path[1]).getPopupMenu(); MenuElement next = findEnabledChild(popup.getSubElements(), -1, FORWARD); MenuElement[] newPath; if (next != null) { // an enabled item found -- include it in newPath newPath = new MenuElement[4]; newPath[3] = next; } else { // menu has no enabled items -- still must show the popup newPath = new MenuElement[3]; } System.arraycopy(path, 0, newPath, 0, 2); newPath[2] = popup; msm.setSelectedPath(newPath);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?