Added bindText(). Never again will I have to remember what secret combination of listeners are needed to get character by character updates from a text box, whether they come from key presses or pastes or wherever the fuck. Plus I can do awesome stuff like this:
Added bindText(). Never again will I have to remember what secret combination
of listeners are needed to get character by character updates from a text box,
whether they come from key presses or pastes or wherever the fuck. Plus I can
do awesome stuff like this:

    final MyObject p = ..., np = p.clone();
    List<Value<Boolean>> changed = new ArrayList<Value<Boolean>>();
    for (final Property prop : Property.values()) {
        final Value<String> current = Value.create(prop.get(p));
        final TextBox box = Widgets.newTextBox(prop.get(p), prop.maxLen, prop.vizLen);
        Bindings.bindText(current, box);
        changed.add(current.map(new Function<String, Boolean>() {
            public Boolean apply (String text) {
                return !prop.get(p).equals(text);
            }
        }));
        current.addListenerAndTrigger(new Value.Listener<String>() {
            public void valueChanged (String text) {
                prop.update(np, text);
            }
        });
        data.add().setText(prop.label).right().setWidget(box);
    }

    Button update = new Button("Update", new ClickHandler() { ... });
    Bindings.bindEnabled(Values.or(changed), update);

wherein a list of text boxes display the fields of an object. Each field is
mapped to a boolean value which indicates whether that field currently differs
from the unedited version of the text. All of those boolean fields are then
or-ed together and an Update button is enabled if any of the fields are
modified, and disabled otherwise.

I also bind a listener to each of the values that represent the object fields
to write the new values of the fields into a new object which will be sent to
the server when update is clicked.

threerings/gwt-utils