package edu.ualberta.med.biobank.mvp.view.item; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import edu.ualberta.med.biobank.mvp.user.ui.ValueField; public class AdaptedValueField<T, U> extends AbstractValueField<T> { private final AdapteeMonitor adapteeMonitor = new AdapteeMonitor(); private final ValueField<U> adaptee; private final Adapter<T, U> adapter; public AdaptedValueField(ValueField<U> adaptee, Adapter<T, U> adapter) { this.adaptee = adaptee; this.adapter = adapter; adaptee.addValueChangeHandler(adapteeMonitor); } @Override protected void updateGui() { T adaptedValue = getValue(); U unadaptedValue = adapter.unadapt(adaptedValue); adaptee.setValue(unadaptedValue, false); } private class AdapteeMonitor implements ValueChangeHandler<U> { @Override public void onValueChange(ValueChangeEvent<U> event) { U unadaptedValue = adaptee.getValue(); T adaptedValue = adapter.adapt(unadaptedValue); setValue(adaptedValue, true); } } }