package edu.ualberta.med.biobank.mvp.presenter.impl;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.web.bindery.event.shared.EventBus;
import edu.ualberta.med.biobank.mvp.event.ExceptionEvent;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteCreateEvent;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteCreateHandler;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteEditEvent;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteEditHandler;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteViewEvent;
import edu.ualberta.med.biobank.mvp.event.model.site.SiteViewHandler;
import edu.ualberta.med.biobank.mvp.event.model.study.StudyCreateEvent;
import edu.ualberta.med.biobank.mvp.event.model.study.StudyCreateHandler;
import edu.ualberta.med.biobank.mvp.event.model.study.StudyEditEvent;
import edu.ualberta.med.biobank.mvp.event.model.study.StudyEditHandler;
import edu.ualberta.med.biobank.mvp.exception.InitPresenterException;
import edu.ualberta.med.biobank.mvp.presenter.impl.FormManagerPresenter.View;
import edu.ualberta.med.biobank.mvp.view.IFormView;
import edu.ualberta.med.biobank.mvp.view.IView;
public class FormManagerPresenter extends AbstractPresenter<View> {
private Provider<SiteEntryPresenter> siteEntryPresenterProvider;
private Provider<SiteViewPresenter> siteViewPresenterProvider;
private Provider<StudyEntryPresenter> studyEntryPresenterProvider;
private Provider<SpecimenLinkPresenter> specimenLinkPresenterProvider; // tmp
public interface View extends IView {
void openForm(IFormView view);
}
@Inject
public FormManagerPresenter(View view, EventBus eventBus,
Provider<SiteEntryPresenter> siteEntryPresenterProvider,
Provider<SiteViewPresenter> siteViewPresenterProvider,
Provider<StudyEntryPresenter> studyEntryPresenterProvider,
Provider<SpecimenLinkPresenter> specimenLinkPresenterProvider) { // tmp
super(view, eventBus);
this.siteEntryPresenterProvider = siteEntryPresenterProvider;
this.siteViewPresenterProvider = siteViewPresenterProvider;
this.studyEntryPresenterProvider = studyEntryPresenterProvider;
this.specimenLinkPresenterProvider = specimenLinkPresenterProvider; // tmp
}
@Override
protected void onBind() {
registerHandler(eventBus.addHandler(SiteEditEvent.getType(),
new SiteEditHandler() {
@Override
public void onSiteEdit(SiteEditEvent event) {
doSiteEdit(event.getSiteId());
}
}));
registerHandler(eventBus.addHandler(SiteCreateEvent.getType(),
new SiteCreateHandler() {
@Override
public void onSiteCreate(SiteCreateEvent event) {
// start: tmp
SpecimenLinkPresenter p =
specimenLinkPresenterProvider.get();
p.bind();
view.openForm(p.getView());
// end: tmp
doSiteCreate();
}
}));
registerHandler(eventBus.addHandler(SiteViewEvent.getType(),
new SiteViewHandler() {
@Override
public void onSiteView(SiteViewEvent event) {
doSiteView(event.getSiteId());
}
}));
registerHandler(eventBus.addHandler(StudyEditEvent.getType(),
new StudyEditHandler() {
@Override
public void onStudyEdit(StudyEditEvent event) {
doStudyEdit(event.getStudyId());
}
}));
registerHandler(eventBus.addHandler(StudyCreateEvent.getType(),
new StudyCreateHandler() {
@Override
public void onStudyCreate(StudyCreateEvent event) {
doStudyCreate();
}
}));
}
@Override
protected void onUnbind() {
}
private void doSiteEdit(Integer siteId) {
SiteEntryPresenter presenter = siteEntryPresenterProvider.get();
presenter.bind();
try {
// TODO: but the presenter.editSite(siteId) method should probably
// return IMMEDIATELY while the data is loaded in the background,
// but then there should never be an exception thrown. Oops,
// probably undo this work.
view.openForm(presenter.editSite(siteId));
} catch (InitPresenterException caught) {
eventBus.fireEvent(new ExceptionEvent(caught));
}
}
private void doSiteCreate() {
SiteEntryPresenter presenter = siteEntryPresenterProvider.get();
presenter.bind();
try {
view.openForm(presenter.createSite());
} catch (InitPresenterException caught) {
eventBus.fireEvent(new ExceptionEvent(caught));
}
}
private void doSiteView(Integer siteId) {
SiteViewPresenter presenter = siteViewPresenterProvider.get();
presenter.bind();
try {
view.openForm(presenter.viewSite(siteId));
} catch (InitPresenterException caught) {
eventBus.fireEvent(new ExceptionEvent(caught));
}
}
private void doStudyEdit(Integer studyId) {
StudyEntryPresenter presenter = studyEntryPresenterProvider.get();
presenter.bind();
try {
view.openForm(presenter.editStudy(studyId));
} catch (InitPresenterException caught) {
eventBus.fireEvent(new ExceptionEvent(caught));
}
}
private void doStudyCreate() {
StudyEntryPresenter presenter = studyEntryPresenterProvider.get();
presenter.bind();
try {
view.openForm(presenter.createStudy());
} catch (InitPresenterException caught) {
eventBus.fireEvent(new ExceptionEvent(caught));
}
}
}