package com.example.listmaker.app.client.ui.widget; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.i18n.client.ConstantsWithLookup; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.ListBox; import com.example.listmaker.common.client.util.EnumTranslator; public class EnumListBox<T extends Enum<T>> extends ListBox implements HasValue<T> { private final Class<T> clazzOfEnum; private boolean valueChangeHandlerInitialized; public EnumListBox(final Class<T> clazzOfEnum, final ConstantsWithLookup constants) { if (clazzOfEnum == null) throw new IllegalArgumentException("Enum class cannot be null"); this.clazzOfEnum = clazzOfEnum; EnumTranslator enumTranslator = new EnumTranslator(constants); T[] values = clazzOfEnum.getEnumConstants(); for (T value : values) { // this.addItem(constant.toString(), constant.name()); this.addItem(enumTranslator.getText(value), value.name()); } } public T getSelectedValue() { if (getSelectedIndex() >= 0) { String name = getValue(getSelectedIndex()); T[] values = clazzOfEnum.getEnumConstants(); for (T value : values) { if (value.name().equals(name)) return value; } } return null; } public void setSelectedValue(T value) { T[] values = clazzOfEnum.getEnumConstants(); for (int i = 0; i < values.length; i++) { if (values[i] == value) { this.setSelectedIndex(i); return; } } throw new IllegalArgumentException("No index found for value " + value.toString()); } /* * Methods to implement HasValue */ @Override public T getValue() { return this.getSelectedValue(); } @Override public void setValue(T value) { this.setValue(value, false); } @Override public void setValue(T value, boolean fireEvents) { T oldValue = getValue(); this.setSelectedValue(value); if (fireEvents) { ValueChangeEvent.fireIfNotEqual(this, oldValue, value); } } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<T> handler) { // Initialization code if (!valueChangeHandlerInitialized) { valueChangeHandlerInitialized = true; super.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { ValueChangeEvent.fire(EnumListBox.this, getValue()); } }); } return addHandler(handler, ValueChangeEvent.getType()); } }