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 edu.ualberta.med.biobank.mvp.event.ExceptionEvent;
import edu.ualberta.med.biobank.mvp.exception.InitPresenterException;
import edu.ualberta.med.biobank.mvp.presenter.IFormPresenter;
import edu.ualberta.med.biobank.mvp.view.IFormView;
public abstract class AbstractFormPresenter<V extends IFormView>
extends AbstractCloseablePresenter<V>
implements IFormPresenter<V> {
private final ReloadClickHandler reloadClickHandler =
new ReloadClickHandler();
private Loadable reload;
public AbstractFormPresenter(V view, EventBus eventBus) {
super(view, eventBus);
}
@Override
public void reload() throws InitPresenterException {
if (reload != null) {
load(reload);
}
}
@Override
protected void onBind() {
super.onBind();
registerHandler(view.getReload().addClickHandler(reloadClickHandler));
}
private class ReloadClickHandler implements ClickHandler {
@Override
public void onClick(ClickEvent event) {
try {
reload();
} catch (InitPresenterException e) {
eventBus.fireEvent(new ExceptionEvent(e));
}
}
}
protected V load(Loadable loadable) throws InitPresenterException {
this.reload = loadable;
try {
loadable.run();
} catch (Exception exception) {
close();
throw new InitPresenterException(exception);
}
return view;
}
protected interface Loadable {
void run() throws Exception;
}
}