package org.tessell.model.dsl;
import java.util.Arrays;
import org.tessell.gwt.user.client.ui.IsListBox;
import org.tessell.model.properties.EnumProperty;
import org.tessell.util.Inflector;
/** Binds {@link EnumProperty}s to widgets. */
public class EnumPropertyBinder<E extends Enum<E>> extends PropertyBinder<E> {
private final EnumProperty<E> ep;
EnumPropertyBinder(final Binder b, final EnumProperty<E> ep) {
super(b, ep);
this.ep = ep;
}
public void to(final IsListBox source, final E[] values) {
int i = 0;
for (E value : values) {
final String display;
if (value.name().equals(value.toString())) {
display = Inflector.humanize(value.name());
} else {
display = value.toString();
}
source.addItem(display, Integer.toString(i++));
}
if (ep.get() == null) {
// TODO don't currently support an empty option
ep.set(values[0]);
}
source.setSelectedIndex(Arrays.asList(values).indexOf(ep.get()));
b.add(source.addChangeHandler(e -> {
int j = source.getSelectedIndex();
if (j == -1) {
ep.set(null);
} else {
ep.set(values[j]);
}
}));
ep.addPropertyChangedHandler(e -> {
source.setSelectedIndex(Arrays.asList(values).indexOf(ep.get()));
});
}
}