package edu.ualberta.med.biobank.mvp.presenter.impl; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.web.bindery.event.shared.EventBus; import com.pietschy.gwt.pectin.client.condition.Condition; import com.pietschy.gwt.pectin.client.condition.Conditions; import com.pietschy.gwt.pectin.client.form.validation.HasValidation; import edu.ualberta.med.biobank.mvp.exception.InitPresenterException; import edu.ualberta.med.biobank.mvp.presenter.HasState; import edu.ualberta.med.biobank.mvp.presenter.IEntryFormPresenter; import edu.ualberta.med.biobank.mvp.presenter.state.ModelState; import edu.ualberta.med.biobank.mvp.presenter.validation.ValidationTree; import edu.ualberta.med.biobank.mvp.view.IEntryFormView; public abstract class AbstractEntryFormPresenter<V extends IEntryFormView> extends AbstractFormPresenter<V> implements IEntryFormPresenter<V> { protected final ValidationTree validation = new ValidationTree(); protected final ModelState state = new ModelState(); private final SaveClickHandler saveClickHandler = new SaveClickHandler(); @SuppressWarnings("unchecked") private final Condition validAndDirty = Conditions.and(state.dirty(), validation.valid()); public AbstractEntryFormPresenter(V view, EventBus eventBus) { super(view, eventBus); } @Override public HasState getState() { return state; } @Override public HasValidation getValidation() { return validation; } @Override public void save() { if (Boolean.TRUE.equals(validAndDirty.getValue())) { doSave(); } } @Override protected void onBind() { super.onBind(); registerHandler(view.getSave().addClickHandler(saveClickHandler)); binder.enable(view.getSave()).when(validAndDirty); binder.bind(state.dirty()).to(view.getDirty()); state.add(view); validation.bindValidationTo(view); } @Override protected void onUnbind() { validation.dispose(); state.dispose(); } @Override protected V load(Loadable loadable) throws InitPresenterException { super.load(loadable); state.checkpoint(); return view; } protected abstract void doSave(); private class SaveClickHandler implements ClickHandler { @Override public void onClick(ClickEvent event) { save(); } } }