GWT SuggestBox


December 5, 2013 Maithilish

6.2. AutoSuggest

AutoSuggest accepts user input and displays matching list of Symbols for selection. It uses GWT SuggestBox to display suggestions those matches input.
Default SuggestOracle of SuggestBox is MultiWordSuggestOracle which displays sorted drop down list of matches. List of names comes from SymbolDatabase.getSymbolNames(), which returns names of four symbols, and method MultiWordSuggestOracle.setSymbolNames() adds list to the oracle.
in.fins.client.widget/AutoSuggest.java

        private void setSymbolNames() {
                List<String> list = SymbolDatabase.getSymbolNames();
                ((MultiWordSuggestOracle) suggestBox.getSuggestOracle()).addAll(list);
        }

In Part 2 of the book, RPS calls to the server replaces SymbolDatabase calls.
To handle the text, SuggestBox provides two handlers ValueChangeHandler and SelectionHandler. We may either of them to handle selection, but ValueChangeHandler may not work seamlessly across browsers while SelectionHandler works seamlessly in all browsers. @UiHandler annotated handlSelection() method handles SelectionEvent. On selection, name is cleared from SuggestBox so that it is ready for the next input. We are going use the selected name in the next section, and for the time being handler just logs log tab.
in.fins.client.widget/AutoSuggest.java

        @UiHandler("suggestBox")
        public void handleSelection(SelectionEvent<SuggestOracle.Suggestion> s) {
                log.fine("Selection : " + suggestBox.getText());
                suggestBox.setText("");
        }

It is also possible to code the Handler as anonymous inner class as shown in following snippet but @UiHandler method is clear and easy to read.
         suggestBox.addSelectionHandler(new
          SelectionHandler<SuggestOracle.Suggestion>() {
                 @Override
                 public void onSelection(SelectionEvent<Suggestion> event) {
                     log.fine("Selection : " + suggestBox.getText());
                     suggestBox.setText("");
                  }
         });
On page load, we have to focus the AutoSuggest for user input. SuggestionBox.setFocus() call will not set focus as widgets are still being constructed and we have to call setFocus() method once the page loads the entire widget tree into browser. To do this, defer its execution by delegating the command to a Scheduler which executes setFocus() method once page loads the widgets tree.
in.fins.client.widget/AutoSuggest.java

        public void requestFocus() {
                Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
                        public void execute() {
                                suggestBox.setFocus(true);
                        }
                });
        }

Once UiBinder creates and binds the UI, constructor calls requestFocus() method.
in.fins.client.content/Snapshot.java

        public Snapshot() {
                initWidget(binder.createAndBindUi(this));
                autoSuggest.requestFocus();


Note

SymbolDatabase returns four symbol names A Sys, B Max, C World and D Dummy, and use A, B, C or D in AutoSuggest as input to get drop down list.
AutoSuggest is ready to accept the user input, but it just logs the Symbol name, and in the next section we design a widget to display the symbol name.