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 + -
显示快捷键?