package org.activityinfo.ui.client.page.instance; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.inject.Provider; import org.activityinfo.core.client.ResourceLocator; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.model.form.FormInstance; import org.activityinfo.promise.Promise; import org.activityinfo.ui.client.EventBus; import org.activityinfo.ui.client.component.formdesigner.FormSavedGuard; import org.activityinfo.ui.client.page.NavigationCallback; import org.activityinfo.ui.client.page.Page; import org.activityinfo.ui.client.page.PageId; import org.activityinfo.ui.client.page.PageState; import org.activityinfo.ui.client.pageView.formClass.DesignTab; import org.activityinfo.ui.client.pageView.formClass.TableTab; import org.activityinfo.ui.client.style.Icons; import org.activityinfo.ui.client.widget.LoadingPanel; import org.activityinfo.ui.client.widget.loading.PageLoadingPanel; /** * Adapter that hosts a view of a given instance. */ public class InstancePage implements Page { public static final PageId DESIGN_PAGE_ID = new PageId("idesign"); public static final PageId TABLE_PAGE_ID = new PageId("itable"); // scrollpanel.bs > div.container > loadingPanel private final ScrollPanel scrollPanel; private final SimplePanel container; private final LoadingPanel<FormInstance> loadingPanel; private final PageId pageId; private final ResourceLocator locator; private final EventBus eventBus; public InstancePage(ResourceLocator resourceLocator, PageId pageId, EventBus eventBus) { this.locator = resourceLocator; this.pageId = pageId; this.eventBus = eventBus; Icons.INSTANCE.ensureInjected(); this.loadingPanel = new LoadingPanel<>(new PageLoadingPanel()); this.container = new SimplePanel(loadingPanel.asWidget()); this.container.addStyleName("container"); this.scrollPanel = new ScrollPanel(container); this.scrollPanel.addStyleName("bs"); } @Override public PageId getPageId() { return pageId; } @Override public Object getWidget() { return scrollPanel; } @Override public void requestToNavigateAway(PageState place, NavigationCallback callback) { if (!FormSavedGuard.callNavigationCallback(scrollPanel, callback)) { callback.onDecided(true); } } @Override public String beforeWindowCloses() { FormSavedGuard guard = FormSavedGuard.getGuard(scrollPanel); if (guard == null || guard.isSaved()) { return null; } else { return I18N.CONSTANTS.unsavedChangesWarning(); } } @Override public boolean navigate(PageState place) { final InstancePlace instancePlace = (InstancePlace) place; if (instancePlace.getPageId() == InstancePage.DESIGN_PAGE_ID) { loadingPanel.setDisplayWidget(new DesignTab(locator)); } else if (instancePlace.getPageId() == InstancePage.TABLE_PAGE_ID) { loadingPanel.setDisplayWidget(new TableTab(locator)); } else { throw new UnsupportedOperationException("Unknown page id:" + instancePlace.getPageId()); } this.loadingPanel.show(new Provider<Promise<FormInstance>>() { @Override public Promise<FormInstance> get() { return locator.getFormInstance(instancePlace.getInstanceId()); } }); return true; } @Override public void shutdown() { } }