summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2006-02-24 12:01:32 +0000
committerRoman Kennke <roman@kennke.org>2006-02-24 12:01:32 +0000
commit27bc3e95bfd7ac25c3303dbf91ee043ef70c33f0 (patch)
tree5fc57231b52892f009cd91c7c1257cb74765bbc6
parentbacdaecaa5ebd7d62810d2bcefa921fb4c21128c (diff)
downloadclasspath-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--ChangeLog14
-rw-r--r--javax/swing/plaf/basic/BasicComboPopup.java6
-rw-r--r--javax/swing/plaf/basic/BasicLookAndFeel.java65
3 files changed, 83 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 761f1b13a..36f23b139 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
+ }
}