From ccfb1974c024d53a672359006ddee036a92c0ffe Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 15 Apr 2011 21:44:46 +0400 Subject: [PATCH] list with filter revalidates popup on filtering text changes --- .../intellij/openapi/ui/popup/JBPopup.java | 2 + .../openapi/ui/popup/PopupChooserBuilder.java | 1 - .../openapi/ui/popup/util/PopupUtil.java | 13 +++++ .../ui/speedSearch/ListWithFilter.java | 10 ++++ .../com/intellij/ui/popup/AbstractPopup.java | 53 +++++++++++++++++-- 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/JBPopup.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/JBPopup.java index 0ea51772bae2..60bf855e72d0 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/JBPopup.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/JBPopup.java @@ -182,4 +182,6 @@ public interface JBPopup extends Disposable, LightweightWindow { void moveToFitScreen(); Point getLocationOnScreen(); + + void pack(boolean with, boolean height); } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java index 58a90ad1f6f9..122e391bab84 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java @@ -219,7 +219,6 @@ public class PopupChooserBuilder { } scrollPane.getViewport().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - ((JComponent)scrollPane.getViewport().getView()).setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); if (myChooserComponent instanceof ListWithFilter) { contentPane.add(myChooserComponent, BorderLayout.CENTER); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/util/PopupUtil.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/util/PopupUtil.java index 02a92ed721f0..0893cc93add0 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/util/PopupUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/util/PopupUtil.java @@ -50,6 +50,19 @@ public class PopupUtil { } } + public static JBPopup getPopupContainerFor(@Nullable Component c) { + if (c == null) return null; + + final Window wnd = SwingUtilities.getWindowAncestor(c); + if (wnd instanceof JWindow) { + final JRootPane root = ((JWindow)wnd).getRootPane(); + return (JBPopup)root.getClientProperty(JBPopup.KEY); + } + + return null; + + } + public static void setPopupType(@NotNull final PopupFactory factory, final int type) { try { final Method method = PopupFactory.class.getDeclaredMethod("setPopupType", int.class); diff --git a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java index bec6bfb7b44b..35ded84d72bf 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java @@ -19,6 +19,8 @@ */ package com.intellij.ui.speedSearch; +import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.LightColors; @@ -101,6 +103,14 @@ public class ListWithFilter extends JPanel { revalidate(); } } + + private void revalidate() { + JBPopup popup = PopupUtil.getPopupContainerFor(mySpeedSearchPatternField); + if (popup != null) { + popup.pack(false, true); + } + ListWithFilter.this.revalidate(); + } } protected void onSpeedSearchPatternChanged() { diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 2bc0e2b5a3ca..064a70e34540 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -692,6 +692,7 @@ public class AbstractPopup implements JBPopup { } myPopup.setRequestFocus(myRequestFocus); + pack(true, true); myPopup.show(); final Window window = SwingUtilities.getWindowAncestor(myContent); @@ -939,6 +940,28 @@ public class AbstractPopup implements JBPopup { wnd.setLocation(p.getScreenPoint()); } + @Override + public void pack(boolean width, boolean height) { + if (!isVisible() || (!width && !height)) return; + + Dimension size = getSize(); + Dimension prefSize = myContent.computePreferredSize(); + + + if (width) { + size.width = prefSize.width; + } + + if (height) { + size.height = prefSize.height; + } + + size = computeWindowSize(size); + + final Window window = SwingUtilities.getWindowAncestor(myContent); + window.setSize(size); + } + public void pack() { final Window window = SwingUtilities.getWindowAncestor(myContent); @@ -1046,6 +1069,18 @@ public class AbstractPopup implements JBPopup { this); } } + + public Dimension computePreferredSize() { + if (isPreferredSizeSet()) { + Dimension setSize; + setSize = getPreferredSize(); + setPreferredSize(null); + Dimension result = getPreferredSize(); + setPreferredSize(setSize); + return result; + } + return getPreferredSize(); + } } public boolean isCancelOnClickOutside() { @@ -1122,19 +1157,27 @@ public class AbstractPopup implements JBPopup { } private void setSize(Dimension size, boolean adjustByContent) { + Dimension toSet = size; if (myPopup == null) { - myForcedSize = size; + myForcedSize = toSet; } else { if (adjustByContent) { - if (myAdCmp != null) { - size.height += myAdCmp.getPreferredSize().height; - } + toSet = computeWindowSize(toSet); } - updateMaskAndAlpha(setSize(myContent, size)); + updateMaskAndAlpha(setSize(myContent, toSet)); } } + private Dimension computeWindowSize(Dimension size) { + Dimension result = new Dimension(size); + if (myAdCmp != null && myAdCmp.isVisible()) { + result.height += myAdCmp.getPreferredSize().height; + } + + return result; + } + @Override public Dimension getSize() { if (myPopup != null) {