| Method from javax.swing.plaf.basic.BasicPopupMenuUI$MouseGrabber Detail: |
void cancelPopupMenu() {
// We should ungrab window if a user code throws
// an unexpected runtime exception. See 6495920.
try {
// 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();
} catch (RuntimeException ex) {
realUngrabWindow();
throw ex;
} catch (Error err) {
realUngrabWindow();
throw err;
}
}
|
public void componentHidden(ComponentEvent e) {
cancelPopupMenu();
}
|
public void componentMoved(ComponentEvent e) {
cancelPopupMenu();
}
|
public void componentResized(ComponentEvent e) {
cancelPopupMenu();
}
|
public void componentShown(ComponentEvent e) {
cancelPopupMenu();
}
|
public void eventDispatched(AWTEvent ev) {
if(ev instanceof sun.awt.UngrabEvent) {
// Popup should be canceled in case of ungrab event
cancelPopupMenu( );
return;
}
if (!(ev instanceof MouseEvent)) {
// We are interested in MouseEvents only
return;
}
MouseEvent me = (MouseEvent) ev;
Component src = me.getComponent();
switch (me.getID()) {
case MouseEvent.MOUSE_PRESSED:
if (isInPopup(src) ||
(src instanceof JMenu && ((JMenu)src).isSelected())) {
return;
}
if (!(src instanceof JComponent) ||
! (((JComponent)src).getClientProperty("doNotCancelPopup")
== BasicComboBoxUI.HIDE_POPUP_KEY)) {
// Cancel popup only if this property was not set.
// If this property is set to TRUE component wants
// to deal with this event by himself.
cancelPopupMenu();
// Ask UIManager about should we consume event that closes
// popup. This made to match native apps behaviour.
boolean consumeEvent =
UIManager.getBoolean("PopupMenu.consumeEventOnClose");
// Consume the event so that normal processing stops.
if(consumeEvent && !(src instanceof MenuElement)) {
me.consume();
}
}
break;
case MouseEvent.MOUSE_RELEASED:
if(!(src instanceof MenuElement)) {
// Do not forward event to MSM, let component handle it
if (isInPopup(src)) {
break;
}
}
if(src instanceof JMenu || !(src instanceof JMenuItem)) {
MenuSelectionManager.defaultManager().
processMouseEvent(me);
}
break;
case MouseEvent.MOUSE_DRAGGED:
if(!(src instanceof MenuElement)) {
// For the MOUSE_DRAGGED event the src is
// the Component in which mouse button was pressed.
// If the src is in popupMenu,
// do not forward event to MSM, let component handle it.
if (isInPopup(src)) {
break;
}
}
MenuSelectionManager.defaultManager().
processMouseEvent(me);
break;
case MouseEvent.MOUSE_WHEEL:
if (isInPopup(src)) {
return;
}
cancelPopupMenu();
break;
}
}
|
void grabWindow(MenuElement[] newPath) {
// A grab needs to be added
final Toolkit tk = Toolkit.getDefaultToolkit();
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
tk.addAWTEventListener(MouseGrabber.this,
AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.MOUSE_WHEEL_EVENT_MASK |
AWTEvent.WINDOW_EVENT_MASK | sun.awt.SunToolkit.GRAB_EVENT_MASK);
return null;
}
}
);
Component invoker = newPath[0].getComponent();
if (invoker instanceof JPopupMenu) {
invoker = ((JPopupMenu)invoker).getInvoker();
}
grabbedWindow = invoker instanceof Window?
(Window)invoker :
SwingUtilities.getWindowAncestor(invoker);
if(grabbedWindow != null) {
if(tk instanceof sun.awt.SunToolkit) {
((sun.awt.SunToolkit)tk).grab(grabbedWindow);
} else {
grabbedWindow.addComponentListener(this);
grabbedWindow.addWindowListener(this);
}
}
}
|
boolean isInPopup(Component src) {
for (Component c=src; c!=null; c=c.getParent()) {
if (c instanceof Applet || c instanceof Window) {
break;
} else if (c instanceof JPopupMenu) {
return true;
}
}
return false;
}
|
void realUngrabWindow() {
Toolkit tk = Toolkit.getDefaultToolkit();
if(grabbedWindow != null) {
if(tk instanceof sun.awt.SunToolkit) {
((sun.awt.SunToolkit)tk).ungrab(grabbedWindow);
} else {
grabbedWindow.removeComponentListener(this);
grabbedWindow.removeWindowListener(this);
}
grabbedWindow = null;
}
}
|
public void stateChanged(ChangeEvent e) {
MenuSelectionManager msm = MenuSelectionManager.defaultManager();
MenuElement[] p = msm.getSelectedPath();
if (lastPathSelected.length == 0 && p.length != 0) {
grabWindow(p);
}
if (lastPathSelected.length != 0 && p.length == 0) {
ungrabWindow();
}
lastPathSelected = p;
}
|
void ungrabWindow() {
final Toolkit tk = Toolkit.getDefaultToolkit();
// The grab should be removed
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
tk.removeAWTEventListener(MouseGrabber.this);
return null;
}
}
);
realUngrabWindow();
}
|
void uninstall() {
synchronized (MOUSE_GRABBER_KEY) {
MenuSelectionManager.defaultManager().removeChangeListener(this);
ungrabWindow();
AppContext.getAppContext().remove(MOUSE_GRABBER_KEY);
}
}
|
public void windowActivated(WindowEvent e) {
}
|
public void windowClosed(WindowEvent e) {
cancelPopupMenu();
}
|
public void windowClosing(WindowEvent e) {
cancelPopupMenu();
}
|
public void windowDeactivated(WindowEvent e) {
cancelPopupMenu();
}
|
public void windowDeiconified(WindowEvent e) {
}
|
public void windowIconified(WindowEvent e) {
cancelPopupMenu();
}
|
public void windowOpened(WindowEvent e) {
}
|