From a015163e042a6dd70baafe8a847e9dc28e36fcec Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 18 Apr 2011 19:03:44 +0400 Subject: [PATCH] filtering popup fixes --- .../openapi/ui/popup/PopupChooserBuilder.java | 34 +++++++++++++------ .../com/intellij/ui/components/JBList.java | 15 ++++++++ .../ui/speedSearch/ListWithFilter.java | 11 ++++-- .../src/com/intellij/util/ui/StatusText.java | 11 ++++-- .../com/intellij/ui/popup/AbstractPopup.java | 2 -- .../src/messages/UIBundle.properties | 3 +- 6 files changed, 58 insertions(+), 18 deletions(-) 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 122e391bab84..8fc6f4cd1cac 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 @@ -24,9 +24,11 @@ import com.intellij.ui.InplaceButton; import com.intellij.ui.ListScrollingUtil; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBScrollPane; +import com.intellij.ui.components.JBViewport; import com.intellij.ui.speedSearch.ListWithFilter; import com.intellij.ui.treeStructure.treetable.TreeTable; import com.intellij.util.Function; +import com.intellij.util.ui.ComponentWithEmptyText; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.Nls; @@ -36,6 +38,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; @@ -219,6 +222,7 @@ 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); @@ -399,7 +403,26 @@ public class PopupChooserBuilder { private final JList myList; private MyListWrapper(final JList list) { - super(list); + JBViewport viewport = new JBViewport() { + @Override + protected LayoutManager createLayoutManager() { + return new ViewportLayout() { + @Override + public Dimension preferredLayoutSize(Container parent) { + int size = list.getModel().getSize(); + if (size >= 0 && size <= 20) { + return list.getPreferredSize(); + } else { + return super.preferredLayoutSize(parent); + } + } + }; + } + }; + setViewport(viewport); + setViewportView(list); + + if (myAutoselectOnMouseMove) { list.addMouseMotionListener(new MouseMotionAdapter() { boolean myIsEngaged = false; @@ -418,19 +441,10 @@ public class PopupChooserBuilder { ListScrollingUtil.installActions(list); - int modelSize = list.getModel().getSize(); setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - if (modelSize > 0 && modelSize <= 20) { - list.setVisibleRowCount(0); - getViewport().setPreferredSize(list.getPreferredSize()); - } - else { - list.setVisibleRowCount(20); - } myList = list; } - @Nullable public Object getData(@NonNls String dataId) { if (PlatformDataKeys.SELECTED_ITEM.is(dataId)){ diff --git a/platform/platform-api/src/com/intellij/ui/components/JBList.java b/platform/platform-api/src/com/intellij/ui/components/JBList.java index 0849651a54ed..9c31672bee49 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBList.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBList.java @@ -71,6 +71,21 @@ public class JBList extends JList implements ComponentWithEmptyText, ComponentWi myEmptyText.paint(this, g); } + @Override + public Dimension getPreferredSize() { + if (getModel().getSize() == 0) { + Dimension s = getEmptyText().getPreferredSize(); + Insets insets = getInsets(); + if (insets != null) { + s.width += (insets.left + insets.right); + s.height += (insets.top + insets.bottom); + } + return s; + } else { + return super.getPreferredSize(); + } + } + private void init() { setSelectionBackground(UIUtil.getListSelectionBackground()); setSelectionForeground(UIUtil.getListSelectionForeground()); 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 35ded84d72bf..cfbffe7f8b8f 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java @@ -25,7 +25,9 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.LightColors; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.UIBundle; import com.intellij.util.Function; +import com.intellij.util.ui.ComponentWithEmptyText; import javax.swing.*; import java.awt.*; @@ -50,6 +52,10 @@ public class ListWithFilter extends JPanel { private ListWithFilter(JList list, JScrollPane scroller, Function namer) { super(new BorderLayout()); + if (list instanceof ComponentWithEmptyText) { + ((ComponentWithEmptyText)list).getEmptyText().setText(UIBundle.message("message.noMatchesFound")); + } + myList = list; myScroller = scroller; @@ -95,13 +101,13 @@ public class ListWithFilter extends JPanel { if (isHoldingFilter() && !searchFieldShown) { mySpeedSearchPatternField.setVisible(true); searchFieldShown = true; - revalidate(); } else if (!isHoldingFilter() && searchFieldShown) { mySpeedSearchPatternField.setVisible(false); searchFieldShown = false; - revalidate(); } + + revalidate(); } private void revalidate() { @@ -127,6 +133,7 @@ public class ListWithFilter extends JPanel { } else { mySpeedSearchPatternField.setBackground(LightColors.RED); + revalidate(); } } diff --git a/platform/platform-api/src/com/intellij/util/ui/StatusText.java b/platform/platform-api/src/com/intellij/util/ui/StatusText.java index acedc6097ad4..2510f91d6940 100644 --- a/platform/platform-api/src/com/intellij/util/ui/StatusText.java +++ b/platform/platform-api/src/com/intellij/util/ui/StatusText.java @@ -16,6 +16,7 @@ package com.intellij.util.ui; +import com.intellij.ui.ScreenUtil; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.UIBundle; @@ -108,11 +109,11 @@ public abstract class StatusText { } private Rectangle getTextComponentBound() { - Rectangle bounds = myOwner == null ? new Rectangle(0, 0, 0, 0) : myOwner.getBounds(); + Rectangle ownerRec = myOwner == null ? new Rectangle(0, 0, 0, 0) : myOwner.getBounds(); Dimension size = myComponent.getPreferredSize(); - int x = (bounds.width - size.width) / 2; - int y = bounds.height / 3; + int x = (ownerRec.width - size.width) / 2; + int y = (ownerRec.height - size.height) / 2; return new Rectangle(x, y, size.width, size.height); } @@ -167,4 +168,8 @@ public abstract class StatusText { myComponent.paint(g2); g2.dispose(); } + + public Dimension getPreferredSize() { + return myComponent.getPreferredSize(); + } } \ No newline at end of file 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 064a70e34540..8b2279922650 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -692,7 +692,6 @@ public class AbstractPopup implements JBPopup { } myPopup.setRequestFocus(myRequestFocus); - pack(true, true); myPopup.show(); final Window window = SwingUtilities.getWindowAncestor(myContent); @@ -947,7 +946,6 @@ public class AbstractPopup implements JBPopup { Dimension size = getSize(); Dimension prefSize = myContent.computePreferredSize(); - if (width) { size.width = prefSize.width; } diff --git a/platform/platform-resources-en/src/messages/UIBundle.properties b/platform/platform-resources-en/src/messages/UIBundle.properties index 8e67db4679b1..0bf27c3cbf5c 100644 --- a/platform/platform-resources-en/src/messages/UIBundle.properties +++ b/platform/platform-resources-en/src/messages/UIBundle.properties @@ -167,4 +167,5 @@ move.down.action.name=Move Down file.chooser.save.dialog.file.name=File name: tool.window.name.documentation=Documentation -message.nothingToShow=Nothing to show \ No newline at end of file +message.nothingToShow=Nothing to show +message.noMatchesFound=No matches found \ No newline at end of file