Text

Text input components in Pivot include TextInput and TextArea. TextInput allows a user to enter a single line of unformatted text; the text may be presented in the clear or may be masked for use as a "password" field. TextArea is a rich, multi-line text component and is discussed in the next section.

The following example application demonstrates use of the TextInput component:

The example helps simplify the task of entering the name of a U.S. state. As soon as enough characters are entered to uniquely identify a state's name, the application automatically populates the component with the full name of the state. Some states, such as Florida, can be identified by a single character. Others, such as Washington, Wisconsin, and Wyoming, require two; Alaska and Alabama require 4.

<Window title="Text Input" maximized="true"
    xmlns:wtkx="http://pivot.apache.org/wtkx"
    xmlns="org.apache.pivot.wtk">
    <content>
        <BoxPane styles="{padding:4, verticalAlignment:'center'}">
            <Label text="State:"/>
            <TextInput wtkx:id="stateTextInput" textSize="20"/>
        </BoxPane>
    </content>
</Window>

The WTKX source for this example is quite short, consisting of only a BoxPane, Label, and TextInput. Most of the demo's functionality is defined in the Java source, shown below. The application's constructor first establishes a sorted list of state names. In startup(), the application attaches a TextInputCharacterListener to the text input. In the listener's charactersInserted() method, the handler attempts to identify the state whose name matches the entered text. If found, it is set as the text property of the text input.

package org.apache.pivot.tutorials.text;

import org.apache.pivot.collections.ArrayList;
import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.Application;
import org.apache.pivot.wtk.DesktopApplicationContext;
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.TextInput;
import org.apache.pivot.wtk.TextInputCharacterListener;
import org.apache.pivot.wtk.Window;
import org.apache.pivot.wtkx.WTKXSerializer;

public class Text implements Application {
    private Window window = null;
    private TextInput stateTextInput = null;

    private ArrayList<String> states;

    private TextInputCharacterListener textInputCharacterListener =
        new TextInputCharacterListener.Adapter() {
        public void charactersInserted(final TextInput textInput, int index, int count) {
            String text = textInput.getText();

            int i = ArrayList.binarySearch(states, text,
                states.getComparator());

            if (i < 0) {
                i = -(i + 1);
                int n = states.getLength();

                if (i < n) {
                    text = text.toLowerCase();
                    final String state = states.get(i);

                    if (state.toLowerCase().startsWith(text)) {
                        String nextState = (i == n - 1) ?
                            null : states.get(i + 1);

                        if (nextState == null
                            || !nextState.toLowerCase().startsWith(text)) {
                            textInput.setText(state);
                        }
                    }
                }
            }
        }
    };

    public Text() {
        // 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");
    }

    public void startup(Display display, Map<String, String> properties)
        throws Exception {
        WTKXSerializer wtkxSerializer = new WTKXSerializer();
        window = (Window)wtkxSerializer.readObject(this, "text.wtkx");
        stateTextInput = (TextInput)wtkxSerializer.get("stateTextInput");

        stateTextInput.getTextInputCharacterListeners().add(textInputCharacterListener);

        window.open(display);
        stateTextInput.requestFocus();
    }

    public boolean shutdown(boolean optional) {
        if (window != null) {
            window.close();
        }

        return false;
    }

    public void suspend() {
    }

    public void resume() {
    }

    public static void main(String[] args) {
        DesktopApplicationContext.main(Text.class, args);
    }
}

Next: Text Areas