Suggestion Popups

SuggestionPopup is a component that can be used to provide "auto-complete" functionality for a text input. This example is essentially an extension of the previous example that replaces the inline auto-complete with a popup list of suggested matches:

The following is the BXML source for the application. It is not significantly different from the previous example, though it is arranged to provide more room for the suggestion popup:

            
            <text:SuggestionPopups title="Suggestion Popups" maximized="true"
                xmlns:bxml="http://pivot.apache.org/bxml"
                xmlns:text="org.apache.pivot.tutorials.text"
                xmlns="org.apache.pivot.wtk">
                <Border>
                    <BoxPane orientation="vertical" styles="{padding:4, verticalAlignment:'top'}">
                        <BoxPane styles="{verticalAlignment:'center'}">
                            <Label text="State:"/>
                            <TextInput bxml:id="stateTextInput"/>
                        </BoxPane>
                    </BoxPane>
                </Border>
            </text:SuggestionPopups>
            
        

The Java source is as follows. The only difference between this code and the code from the previous example is the definition of the text input character listener. In the previous example, the listener performed a binary search to identify possible matches. In this example, the listener generates a list of suggestions and displays them in a suggestion popup. As the user enters text in the text input, the listener builds the suggestion list and then opens a SuggestionPopup to present the suggestions. If the user selects an entry from the popup, it is automatically copied to the text input:

            
            package org.apache.pivot.tutorials.text;

            import java.net.URL;

            import org.apache.pivot.beans.Bindable;
            import org.apache.pivot.collections.ArrayList;
            import org.apache.pivot.collections.Map;
            import org.apache.pivot.util.Resources;
            import org.apache.pivot.wtk.Display;
            import org.apache.pivot.wtk.SuggestionPopup;
            import org.apache.pivot.wtk.TextInput;
            import org.apache.pivot.wtk.TextInputContentListener;
            import org.apache.pivot.wtk.Window;

            public class SuggestionPopups extends Window implements Bindable {
                private TextInput stateTextInput = null;

                private ArrayList<String> states;
                private SuggestionPopup suggestionPopup = new SuggestionPopup();

                public SuggestionPopups() {
                    // Populate the lookup values, ensuring that they are sorted
                    states = new ArrayList<String>();
                    states.setComparator(String.CASE_INSENSITIVE_ORDER);

                    states.add("Alabama");
                    states.add("Alaska");
                    states.add("Arizona");
                    states.add("Arkansas");
                    states.add("California");
                    states.add("Colorado");
                    states.add("Connecticut");
                    states.add("Delaware");
                    states.add("District of Columbia");
                    states.add("Florida");
                    states.add("Georgia");
                    states.add("Hawaii");
                    states.add("Idaho");
                    states.add("Illinois");
                    states.add("Indiana");
                    states.add("Iowa");
                    states.add("Kansas");
                    states.add("Kentucky");
                    states.add("Louisiana");
                    states.add("Maine");
                    states.add("Maryland");
                    states.add("Massachusetts");
                    states.add("Michigan");
                    states.add("Minnesota");
                    states.add("Mississippi");
                    states.add("Missouri");
                    states.add("Montana");
                    states.add("Nebraska");
                    states.add("Nevada");
                    states.add("New Hampshire");
                    states.add("New Jersey");
                    states.add("New Mexico");
                    states.add("New York");
                    states.add("North Carolina");
                    states.add("North Dakota");
                    states.add("Ohio");
                    states.add("Oklahoma");
                    states.add("Oregon");
                    states.add("Pennsylvania");
                    states.add("Rhode Island");
                    states.add("South Carolina");
                    states.add("South Dakota");
                    states.add("Tennessee");
                    states.add("Texas");
                    states.add("Utah");
                    states.add("Vermont");
                    states.add("Virginia");
                    states.add("Washington");
                    states.add("West Virginia");
                    states.add("Wisconsin");
                    states.add("Wyoming");
                }

                @Override
                public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
                    stateTextInput = (TextInput)namespace.get("stateTextInput");
                    stateTextInput.getTextInputContentListeners().add(new TextInputContentListener.Adapter() {
                        @Override
                        public void textInserted(TextInput textInput, int index, int count) {
                            String text = textInput.getText();
                            ArrayList<String> suggestions = new ArrayList<String>();

                            for (String state : states) {
                                if (state.toUpperCase().startsWith(text.toUpperCase())) {
                                    suggestions.add(state);
                                }
                            }

                            if (suggestions.getLength() > 0) {
                                suggestionPopup.setSuggestionData(suggestions);
                                suggestionPopup.open(textInput);
                            }
                        }

                        @Override
                        public void textRemoved(TextInput textInput, int index, int count) {
                            suggestionPopup.close();
                        }
                    });

                    suggestionPopup.setListSize(4);
                }

                @Override
                public void open(Display display, Window owner) {
                    super.open(display, owner);
                    stateTextInput.requestFocus();
                }
            }
            
        

Next: Text Areas