package org.activityinfo.ui.client.page.home;
import com.google.common.base.Function;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import org.activityinfo.core.client.ResourceLocator;
import org.activityinfo.core.shared.application.FolderClass;
import org.activityinfo.core.shared.criteria.ClassCriteria;
import org.activityinfo.core.shared.criteria.CriteriaIntersection;
import org.activityinfo.core.shared.criteria.ParentCriteria;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.ui.client.page.*;
import org.activityinfo.ui.client.page.instance.InstancePage;
import org.activityinfo.ui.client.page.instance.InstancePlace;
import org.activityinfo.ui.client.style.BaseStylesheet;
import javax.annotation.Nullable;
import java.util.List;
public class PageLoader implements org.activityinfo.ui.client.page.PageLoader {
private final NavigationHandler pageManager;
private ResourceLocator resourceLocator;
@Inject
public PageLoader(NavigationHandler pageManager,
PageStateSerializer placeSerializer,
ResourceLocator resourceLocator) {
this.resourceLocator = resourceLocator;
this.pageManager = pageManager;
pageManager.registerPageLoader(HomePage.PAGE_ID, this);
placeSerializer.registerParser(HomePage.PAGE_ID, new HomePlace.Parser());
pageManager.registerPageLoader(InstancePage.DESIGN_PAGE_ID, this);
placeSerializer.registerParser(InstancePage.DESIGN_PAGE_ID, new InstancePlace.Parser(InstancePage.DESIGN_PAGE_ID));
pageManager.registerPageLoader(InstancePage.TABLE_PAGE_ID, this);
placeSerializer.registerParser(InstancePage.TABLE_PAGE_ID, new InstancePlace.Parser(InstancePage.TABLE_PAGE_ID));
}
@Override
public void load(final PageId pageId, final PageState pageState, final AsyncCallback<Page> callback) {
BaseStylesheet.INSTANCE.ensureInjected();
GWT.runAsync(new RunAsyncCallback() {
@Override
public void onSuccess() {
if (pageState instanceof HomePlace) {
loadHomePage(callback);
} else if (pageState instanceof InstancePlace) {
InstancePlace instancePlace = (InstancePlace) pageState;
InstancePage page = new InstancePage(resourceLocator, instancePlace.getPageId(), pageManager.getEventBus());
page.navigate(pageState);
callback.onSuccess(page);
}
}
@Override
public void onFailure(Throwable throwable) {
callback.onFailure(throwable);
}
});
}
private void loadHomePage(AsyncCallback<Page> callback) {
CriteriaIntersection criteria = new CriteriaIntersection(new ClassCriteria(FolderClass.CLASS_ID),
ParentCriteria.isRoot());
resourceLocator.queryInstances(criteria).then(new Function<List<FormInstance>, Page>() {
@Nullable @Override
public Page apply(List<FormInstance> formInstances) {
return new HomePage(formInstances);
}
}).then(callback);
}
}