package edu.ualberta.med.biobank.mvp.view.form;
import com.pietschy.gwt.pectin.client.form.validation.EmptyValidationResult;
import com.pietschy.gwt.pectin.client.form.validation.Severity;
import com.pietschy.gwt.pectin.client.form.validation.ValidationResult;
import com.pietschy.gwt.pectin.client.form.validation.message.ValidationMessage;
import com.pietschy.gwt.pectin.client.value.ValueTarget;
import edu.ualberta.med.biobank.mvp.user.ui.HasButton;
import edu.ualberta.med.biobank.mvp.view.IEntryFormView;
import edu.ualberta.med.biobank.mvp.view.form.ToolBarButtonManager.ButtonType;
import edu.ualberta.med.biobank.mvp.view.widget.DelegatingButton;
public abstract class AbstractEntryFormView extends AbstractFormView implements
IEntryFormView {
protected final DelegatingButton save = new DelegatingButton();
private final DirtyValueTarget dirtyValueTarget = new DirtyValueTarget();
private ValidationResult validationResult = EmptyValidationResult.INSTANCE;
private boolean dirty = false;
@Override
public HasButton getSave() {
return save;
}
@Override
public ValueTarget<Boolean> getDirty() {
return dirtyValueTarget;
}
private class DirtyValueTarget implements ValueTarget<Boolean> {
@Override
public void setValue(Boolean value) {
dirty = value;
updateDirty();
}
}
@Override
public void setValidationResult(ValidationResult result) {
validationResult = result;
updateFormMessage();
}
@Override
public void onCreate(BaseForm form) {
initActions(form);
updateFormMessage();
updateDirty();
}
public abstract String getOkMessage();
private void initActions(BaseForm form) {
HasButton saveButton = form.getToolbar().get(ButtonType.SAVE);
save.setDelegate(saveButton);
}
private void updateFormMessage() {
BaseForm form = getForm();
if (form != null) {
if (validationResult.contains(Severity.ERROR)) {
for (ValidationMessage message : validationResult
.getMessages(Severity.ERROR)) {
form.setErrorMessage(message.getMessage());
break;
}
} else {
form.setMessage(getOkMessage());
}
}
}
private void updateDirty() {
if (editor != null) {
editor.setDirty(dirty);
}
}
}