package edu.ualberta.med.biobank.mvp.presenter.state;
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.user.client.ui.HasValue;
public class ValueState<T> extends AbstractState {
private final SourceMonitor sourceMonitor = new SourceMonitor();
private final HandlerRegistration handlerRegistration;
private final HasValue<T> source;
private T checkpointValue;
ValueState(HasValue<T> source) {
this.source = source;
handlerRegistration = source.addValueChangeHandler(sourceMonitor);
checkpoint();
}
@Override
public void checkpoint() {
checkpointValue = source.getValue();
dirty.setValue(false);
}
@Override
public void revert() {
source.setValue(checkpointValue, true);
}
@Override
public void dispose() {
handlerRegistration.removeHandler();
}
private class SourceMonitor implements ValueChangeHandler<T> {
@Override
public void onValueChange(ValueChangeEvent<T> event) {
boolean equal = areEqual(source.getValue(), checkpointValue);
dirty.setValue(!equal);
}
}
}