1414import javax .swing .MenuElement ;
1515import javax .swing .event .DocumentEvent ;
1616import javax .swing .event .DocumentListener ;
17+ import javax .swing .event .MenuEvent ;
18+ import javax .swing .event .MenuListener ;
19+ import java .awt .event .HierarchyEvent ;
20+ import java .awt .event .HierarchyListener ;
1721import java .util .Arrays ;
1822import java .util .Set ;
1923import java .util .stream .Collectors ;
@@ -45,10 +49,39 @@ protected SearchMenusMenu(Gui gui) {
4549 this .add (this .field );
4650 this .add (this .noResults );
4751
52+ // Always focus field, but don't always select its text, because it loses focus when packing new search results.
4853 this .field .addHierarchyListener (e -> {
4954 if (this .field .isShowing ()) {
5055 this .field .requestFocus ();
51- this .field .selectAll ();
56+ }
57+ });
58+
59+ // Only select field text when the menu is selected, so text isn't selected when packing new search results.
60+ this .addMenuListener (new MenuListener () {
61+ final HierarchyListener fieldTextSelector = new HierarchyListener () {
62+ @ Override
63+ public void hierarchyChanged (HierarchyEvent e ) {
64+ if (SearchMenusMenu .this .field .isShowing ()) {
65+ SearchMenusMenu .this .field .removeHierarchyListener (this );
66+
67+ SearchMenusMenu .this .field .selectAll ();
68+ }
69+ }
70+ };
71+
72+ @ Override
73+ public void menuSelected (MenuEvent e ) {
74+ SearchMenusMenu .this .field .addHierarchyListener (this .fieldTextSelector );
75+ }
76+
77+ @ Override
78+ public void menuDeselected (MenuEvent e ) {
79+ SearchMenusMenu .this .field .removeHierarchyListener (this .fieldTextSelector );
80+ }
81+
82+ @ Override
83+ public void menuCanceled (MenuEvent e ) {
84+ SearchMenusMenu .this .field .removeHierarchyListener (this .fieldTextSelector );
5285 }
5386 });
5487
@@ -58,23 +91,21 @@ void updateResultItems() {
5891
5992 if (searchTerm .isEmpty ()) {
6093 SearchMenusMenu .this .noResults .setVisible (false );
61- SearchMenusMenu .this .invalidate ();
62- SearchMenusMenu .this .repaint ();
6394 SearchMenusMenu .this .resultManager .clearCurrent ();
95+
96+ SearchMenusMenu .this .getPopupMenu ().pack ();
6497 } else {
6598 switch (SearchMenusMenu .this .resultManager .updateResultItems (searchTerm )) {
6699 case NO_RESULTS -> {
67- SearchMenusMenu .this .noResults .setVisible (false );
100+ SearchMenusMenu .this .noResults .setVisible (true );
68101
69102 SearchMenusMenu .this .getPopupMenu ().pack ();
70- SearchMenusMenu .this .getPopupMenu ().pack ();
71103 }
72104 case SAME_RESULTS -> { }
73105 case DIFFERENT_RESULTS -> {
74- SearchMenusMenu .this .noResults .setVisible (true );
106+ SearchMenusMenu .this .noResults .setVisible (false );
75107
76108 SearchMenusMenu .this .getPopupMenu ().pack ();
77- SearchMenusMenu .this .getPopupMenu ().pack ();
78109 }
79110 }
80111 }
@@ -112,6 +143,7 @@ public void retranslate() {
112143
113144 this .setText (I18n .translate ("menu.help.search" ));
114145 this .field .setPlaceholder (I18n .translate ("menu.help.search.placeholder" ));
146+ this .noResults .setText (I18n .translate ("menu.help.search.no_results" ));
115147 }
116148
117149 private static class Result {
0 commit comments