3030import gwt .material .design .client .base .SearchObject ;
3131import gwt .material .design .client .constants .IconType ;
3232import gwt .material .design .client .constants .InputType ;
33+ import gwt .material .design .client .events .SearchFinishEvent ;
3334import gwt .material .design .client .ui .html .Label ;
3435
3536import java .util .ArrayList ;
@@ -74,10 +75,32 @@ public class MaterialSearch extends MaterialValueBox<String> implements HasClose
7475 private Label label = new Label ();
7576 private MaterialIcon iconSearch = new MaterialIcon (IconType .SEARCH );
7677 private MaterialIcon iconClose = new MaterialIcon (IconType .CLOSE );
78+
79+ /**
80+ * The list of search objects added to MaterialSearchResult panel to
81+ * display the lists of result items
82+ */
7783 private List <SearchObject > listSearches = new ArrayList <>();
84+ /**
85+ * Used to determine the selected searches while matching the keyword to result
86+ */
87+ private List <SearchObject > tempSearches = new ArrayList <>();
88+ /**
89+ * Panel to display the result items
90+ */
7891 private MaterialSearchResult searchResult ;
92+ /**
93+ * Link selected to determine easily during the selection event (up / down key events)
94+ */
7995 private MaterialLink selectedLink ;
96+ /**
97+ * Gets the selected object after Search Finish event
98+ */
8099 private SearchObject selectedObject ;
100+ /**
101+ * -1 means that the selected index is not yet selected.
102+ * It will increment or decrement once triggere by key up / down events
103+ */
81104 private int curSel = -1 ;
82105
83106 public MaterialSearch () {
@@ -106,7 +129,9 @@ public void onLoad() {
106129 @ Override
107130 public void onKeyUp (KeyUpEvent event ) {
108131 String keyword = getText ().toLowerCase ();
132+ // Clear the panel and temp objects
109133 searchResult .clear ();
134+ tempSearches .clear ();
110135
111136 // Populate the search result items
112137 for (final SearchObject obj : getListSearches ()) {
@@ -119,20 +144,26 @@ public void onKeyUp(KeyUpEvent event) {
119144 link .addClickHandler (new ClickHandler () {
120145 @ Override
121146 public void onClick (ClickEvent event ) {
147+ setSelectedObject (obj );
122148 reset (obj .getKeyword ());
123149 }
124150 });
125- // If matches add to search result container
151+ // If matches add to search result container and object to temp searches
126152 if (obj .getKeyword ().toLowerCase ().contains (keyword )){
127153 searchResult .add (link );
154+ tempSearches .add (obj );
128155 }
129156 }
130157
131158 // Apply selected search
132159 if (event .getNativeEvent ().getKeyCode () == KeyCodes .KEY_ENTER ){
133160 if (getCurSel ()==-1 ){
161+ setSelectedObject (tempSearches .get (0 ));
134162 setSelectedLink ((MaterialLink ) searchResult .getWidget (0 ));
163+ }else {
164+ setSelectedObject (tempSearches .get (curSel ));
135165 }
166+
136167 MaterialLink selLink = getSelectedLink ();
137168 locateSearch (selLink .getHref ());
138169 reset (selLink .getText ());
@@ -164,6 +195,7 @@ public void onClick(ClickEvent event) {
164195
165196 // Resets the search result panel
166197 private void reset (String keyword ){
198+ SearchFinishEvent .fire (MaterialSearch .this );
167199 curSel = -1 ;
168200 setText (keyword );
169201 searchResult .clear ();
@@ -227,13 +259,27 @@ public void setCurSel(int curSel) {
227259 }
228260
229261 public SearchObject getSelectedObject () {
230- listSearches .get (curSel );
231262 return selectedObject ;
232263 }
233264
234265 public void setSelectedObject (SearchObject selectedObject ) {
235266 this .selectedObject = selectedObject ;
236267 }
268+
269+ /**
270+ * Gets the tempory search objects
271+ * @return
272+ */
273+ public List <SearchObject > getTempSearches () {
274+ return tempSearches ;
275+ }
276+
277+ /**
278+ * This handler will be triggered when search is finish
279+ */
280+ public HandlerRegistration addSearchFinishHandler (SearchFinishEvent .SearchFinishHandler handler ) {
281+ return addHandler (handler , SearchFinishEvent .TYPE );
282+ }
237283}
238284
239285
0 commit comments