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 69e29d442dc8..7a8d9a49f9b6 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java @@ -24,22 +24,21 @@ 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; -import com.intellij.ui.ScrollPaneFactory; -import com.intellij.ui.UIBundle; +import com.intellij.ui.*; import com.intellij.util.Function; import com.intellij.util.ui.ComponentWithEmptyText; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import javax.swing.*; +import javax.swing.event.DocumentEvent; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class ListWithFilter extends JPanel implements DataProvider { private final JList myList; - private final JTextField mySpeedSearchPatternField; + private final SearchTextField mySearchField = new SearchTextField(false); private final NameFilteringListModel myModel; private final JScrollPane myScroller; private final MySpeedSearch mySpeedSearch; @@ -47,7 +46,7 @@ public class ListWithFilter extends JPanel implements DataProvider { @Override public Object getData(@NonNls String dataId) { if (SpeedSearchSupply.SPEED_SEARCH_CURRENT_QUERY.is(dataId)) { - return mySpeedSearchPatternField.getText(); + return mySearchField.getText(); } return null; } @@ -75,11 +74,10 @@ public class ListWithFilter extends JPanel implements DataProvider { myList = list; myScroller = scroller; - mySpeedSearchPatternField = new JTextField(); - mySpeedSearchPatternField.setFocusable(false); - mySpeedSearchPatternField.setVisible(false); + mySearchField.getTextEditor().setFocusable(false); + mySearchField.setVisible(false); - add(mySpeedSearchPatternField, BorderLayout.NORTH); + add(mySearchField, BorderLayout.NORTH); add(myScroller, BorderLayout.CENTER); mySpeedSearch = new MySpeedSearch(); @@ -121,7 +119,7 @@ public class ListWithFilter extends JPanel implements DataProvider { public boolean resetFilter() { boolean hadPattern = mySpeedSearch.isHoldingFilter(); - if (mySpeedSearchPatternField.isVisible()) { + if (mySearchField.isVisible()) { mySpeedSearch.reset(); } return hadPattern; @@ -132,26 +130,42 @@ public class ListWithFilter extends JPanel implements DataProvider { } private class MySpeedSearch extends SpeedSearch { - boolean searchFieldShown = false; + boolean searchFieldShown; + boolean myInUpdate; + + private MySpeedSearch() { + // native mac "clear button" is not captured by SearchTextField.onFieldCleared + mySearchField.addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + if (myInUpdate) return; + if (mySearchField.getText().isEmpty()) { + mySpeedSearch.reset(); + } + } + }); + } public void update() { - mySpeedSearchPatternField.setBackground(new JTextField().getBackground()); + myInUpdate = true; + mySearchField.getTextEditor().setBackground(UIUtil.getTextFieldBackground()); onSpeedSearchPatternChanged(); - mySpeedSearchPatternField.setText(getFilter()); + mySearchField.setText(getFilter()); if (isHoldingFilter() && !searchFieldShown) { - mySpeedSearchPatternField.setVisible(true); + mySearchField.setVisible(true); searchFieldShown = true; } else if (!isHoldingFilter() && searchFieldShown) { - mySpeedSearchPatternField.setVisible(false); + mySearchField.setVisible(false); searchFieldShown = false; } + myInUpdate = false; revalidate(); } private void revalidate() { - JBPopup popup = PopupUtil.getPopupContainerFor(mySpeedSearchPatternField); + JBPopup popup = PopupUtil.getPopupContainerFor(mySearchField); if (popup != null) { popup.pack(false, true); } @@ -173,7 +187,7 @@ public class ListWithFilter extends JPanel implements DataProvider { } } else { - mySpeedSearchPatternField.setBackground(LightColors.RED); + mySearchField.getTextEditor().setBackground(LightColors.RED); revalidate(); } }