diff options
author | Roman Kennke <roman@kennke.org> | 2006-02-24 12:01:32 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2006-02-24 12:01:32 +0000 |
commit | 27bc3e95bfd7ac25c3303dbf91ee043ef70c33f0 (patch) | |
tree | 5fc57231b52892f009cd91c7c1257cb74765bbc6 | |
parent | bacdaecaa5ebd7d62810d2bcefa921fb4c21128c (diff) | |
download | classpath-27bc3e95bfd7ac25c3303dbf91ee043ef70c33f0.tar.gz |
2006-02-24 Roman Kennke <kennke@aicas.com>
* javax/swing/plaf/basic/BasicLookAndFeel.java
(PopupHelper.autoClosePopups): New field.
(PopupHelper.mousePressed): Also autoclose any registered popups.
(PopupHelper.registerForAutoClose): New method.
(PopupHelper.autoClosePopups): New method.
(popupHelper): Changed type of field to PopupHelper.
(registerForAutoClose): New method.
* javax/swing/plaf/basic/BasicComboPopup.java
(show): Register this popup for autoclosing.
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | javax/swing/plaf/basic/BasicComboPopup.java | 6 | ||||
-rw-r--r-- | javax/swing/plaf/basic/BasicLookAndFeel.java | 65 |
3 files changed, 83 insertions, 2 deletions
@@ -1,10 +1,22 @@ +2006-02-24 Roman Kennke <kennke@aicas.com> + + * javax/swing/plaf/basic/BasicLookAndFeel.java + (PopupHelper.autoClosePopups): New field. + (PopupHelper.mousePressed): Also autoclose any registered popups. + (PopupHelper.registerForAutoClose): New method. + (PopupHelper.autoClosePopups): New method. + (popupHelper): Changed type of field to PopupHelper. + (registerForAutoClose): New method. + * javax/swing/plaf/basic/BasicComboPopup.java + (show): Register this popup for autoclosing. + 2006-02-24 Raif S. Naffah <raif@swiftdsl.com.au> * gnu/javax/crypto/mac/TMMH16.java (clone): New method. * gnu/java/security/prng/MDGenerator.java (clone): New method. * gnu/java/security/prng/BasePRNG.java (clone): Clone buffer. -2006-02-23 Roman Kennke <kennke@aicas.com> +2006-02-24 Roman Kennke <kennke@aicas.com> Reported by Ingo Proetel <proetel@aicas.com> * java/util/logging/LogManager.java diff --git a/javax/swing/plaf/basic/BasicComboPopup.java b/javax/swing/plaf/basic/BasicComboPopup.java index 08dab7f9f..23e139003 100644 --- a/javax/swing/plaf/basic/BasicComboPopup.java +++ b/javax/swing/plaf/basic/BasicComboPopup.java @@ -69,6 +69,7 @@ import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.Timer; +import javax.swing.UIManager; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; @@ -193,6 +194,11 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup if (selectedIndex > comboBox.getMaximumRowCount()) scrollbar.setValue(getPopupHeightForRowCount(selectedIndex)); + // Register this popup to be autoclosed when user clicks outside the + // popup. + BasicLookAndFeel laf = (BasicLookAndFeel) UIManager.getLookAndFeel(); + laf.registerForAutoClose(this); + // location specified is relative to comboBox super.show(comboBox, 0, cbBounds.height); } diff --git a/javax/swing/plaf/basic/BasicLookAndFeel.java b/javax/swing/plaf/basic/BasicLookAndFeel.java index 4d5c1cb88..3451224be 100644 --- a/javax/swing/plaf/basic/BasicLookAndFeel.java +++ b/javax/swing/plaf/basic/BasicLookAndFeel.java @@ -52,7 +52,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.Enumeration; +import java.util.Iterator; import java.util.ResourceBundle; +import java.util.Set; +import java.util.WeakHashMap; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; @@ -63,9 +66,11 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; +import javax.swing.JPopupMenu; import javax.swing.KeyStroke; import javax.swing.LookAndFeel; import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.BevelBorder; @@ -99,6 +104,11 @@ public abstract class BasicLookAndFeel extends LookAndFeel { /** + * Registered popups for autoclose. + */ + private WeakHashMap autoClosePopups = new WeakHashMap(); + + /** * Receives an event from the event queue. * * @param event @@ -120,12 +130,52 @@ public abstract class BasicLookAndFeel extends LookAndFeel */ private void mousePressed(MouseEvent ev) { + // Autoclose all menus managed by the MenuSelectionManager. MenuSelectionManager m = MenuSelectionManager.defaultManager(); Component target = ev.getComponent(); if (target instanceof Container) target = ((Container) target).findComponentAt(ev.getPoint()); if (! m.isComponentPartOfCurrentMenu(target)) m.clearSelectedPath(); + + // Handle other registered popup instances, like ComboBox popups. + autoClosePopups(ev, target); + } + + /** + * Registers Popup and its content to be autoclosed when a mouseclick + * occurs outside of the popup. + * + * @param popup the popup to be autoclosed when clicked outside + */ + void registerForAutoClose(JPopupMenu popup) + { + autoClosePopups.put(popup, null); + } + + /** + * Automatically closes all popups that are not 'hit' by the mouse event. + * + * @param ev the mouse event + * @param target the target of the mouse event + */ + private void autoClosePopups(MouseEvent ev, Component target) + { + if (autoClosePopups.size() != 0) + { + Set popups = autoClosePopups.keySet(); + Iterator i = popups.iterator(); + while (i.hasNext()) + { + JPopupMenu popup = (JPopupMenu) i.next(); + if (!(target == popup + || SwingUtilities.isDescendingFrom(target, popup))) + { + popup.setVisible(false); + i.remove(); + } + } + } } } @@ -192,7 +242,7 @@ public abstract class BasicLookAndFeel extends LookAndFeel /** * Helps closing menu popups when user clicks outside of the menu area. */ - private transient AWTEventListener popupHelper; + private transient PopupHelper popupHelper; private ActionMap audioActionMap; @@ -1598,4 +1648,17 @@ public abstract class BasicLookAndFeel extends LookAndFeel toolkit.removeAWTEventListener(popupHelper); popupHelper = null; } + + /** + * Registers a JPopupMenu for autoclosing when a mouseclick occurs outside + * of the JPopupMenu. This must be called when the popup gets opened. The + * popup is unregistered from autoclosing as soon as it either got closed + * by this helper, or when it has been garbage collected. + * + * @param popup the popup menu to autoclose + */ + void registerForAutoClose(JPopupMenu popup) + { + popupHelper.registerForAutoClose(popup); + } } |