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 com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.HasValue;
import edu.ualberta.med.biobank.mvp.user.ui.ValueField;
public abstract class AbstractValueField<T> extends AbstractValidationField
implements ValueField<T> {
private final HandlerManager handlerManager = new HandlerManager(this);
protected T value;
@Override
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<T> handler) {
return handlerManager.addHandler(ValueChangeEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event) {
handlerManager.fireEvent(event);
}
@Override
public T getValue() {
return value;
}
/**
* Finalized to agree to the {@link HasValue#setValue(Object)} contract of
* being the same as {@link HasValue#setValue(Object, boolean)} with false.
*/
@Override
public final void setValue(T value) {
setValue(value, false);
}
@Override
public synchronized void setValue(T value, boolean fireEvents) {
setValue(value, fireEvents, true);
}
protected void setValueInternal(T value) {
setValue(value, true, false);
}
/**
* Update the GUI's value to match {@link #getValue()}. Do so without firing
* any events.
*/
protected abstract void updateGui();
private synchronized void setValue(T newValue, boolean fireEvents,
boolean updateGui) {
T oldValue = value;
value = newValue;
if (updateGui) {
updateGui();
}
if (fireEvents) {
ValueChangeEvent.fireIfNotEqual(this, oldValue, newValue);
}
}
}