package org.activityinfo.ui.client.page.app;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.activityinfo.legacy.client.AsyncMonitor;
import org.activityinfo.legacy.shared.Log;
import org.activityinfo.model.auth.AuthenticatedUser;
import org.activityinfo.ui.client.EventBus;
import org.activityinfo.ui.client.local.ui.SyncStatusBar;
import org.activityinfo.ui.client.page.*;
import org.activityinfo.ui.client.page.config.DbListPageState;
import org.activityinfo.ui.client.page.dashboard.DashboardPlace;
import org.activityinfo.ui.client.page.entry.place.DataEntryPlace;
import org.activityinfo.ui.client.page.report.ReportsPlace;
import org.activityinfo.ui.client.widget.legacy.LoadingPlaceHolder;
@Singleton
public class AppFrameSet implements Frame {
private EventBus eventBus;
private Viewport viewport;
private Widget activeWidget;
private Page activePage;
private AppBar appBar;
private SyncStatusBar statusBar;
@Inject
public AppFrameSet(EventBus eventBus, AuthenticatedUser auth, AppBar appBar, SyncStatusBar statusBar) {
Log.trace("AppFrameSet constructor starting");
this.eventBus = eventBus;
this.appBar = appBar;
this.statusBar = statusBar;
viewport = new Viewport();
viewport.setLayout(new BorderLayout());
setupTabs();
setupStatus();
Log.trace("AppFrameSet constructor finished, about to add to RootPanel");
RootPanel.get().add(viewport);
Log.trace("AppFrameSet now added to RootPanel");
}
private void setupTabs() {
appBar.getSectionTabStrip().addSelectionHandler(new SelectionHandler<Section>() {
@Override
public void onSelection(SelectionEvent<Section> event) {
onSectionClicked(event.getSelectedItem());
}
});
eventBus.addListener(NavigationHandler.NAVIGATION_AGREED, new Listener<NavigationEvent>() {
@Override
public void handleEvent(NavigationEvent event) {
appBar.getSectionTabStrip().setSelection(event.getPlace().getSection());
}
});
BorderLayoutData layout = new BorderLayoutData(LayoutRegion.NORTH);
layout.setSize(AppBar.HEIGHT);
viewport.add(appBar, layout);
}
private void setupStatus() {
BorderLayoutData layout = new BorderLayoutData(LayoutRegion.SOUTH);
layout.setSize(SyncStatusBar.HEIGHT);
viewport.add(statusBar, layout);
}
private void onSectionClicked(Section selectedItem) {
switch (selectedItem) {
case HOME:
eventBus.fireEvent(new NavigationEvent(NavigationHandler.NAVIGATION_REQUESTED, new DashboardPlace()));
break;
case DATA_ENTRY:
eventBus.fireEvent(new NavigationEvent(NavigationHandler.NAVIGATION_REQUESTED, new DataEntryPlace()));
break;
case ANALYSIS:
eventBus.fireEvent(new NavigationEvent(NavigationHandler.NAVIGATION_REQUESTED, new ReportsPlace()));
break;
case DESIGN:
eventBus.fireEvent(new NavigationEvent(NavigationHandler.NAVIGATION_REQUESTED, new DbListPageState()));
break;
}
}
public void setWidget(Widget widget) {
if (activeWidget != null) {
viewport.remove(activeWidget);
}
viewport.add(widget, new BorderLayoutData(LayoutRegion.CENTER));
activeWidget = widget;
viewport.layout();
}
@Override
public void setActivePage(Page page) {
setWidget((Widget) page.getWidget());
activePage = page;
}
@Override
public Page getActivePage() {
return activePage;
}
@Override
public AsyncMonitor showLoadingPlaceHolder(PageId pageId, PageState loadingPlace) {
activePage = null;
LoadingPlaceHolder placeHolder = new LoadingPlaceHolder();
setWidget(placeHolder);
return placeHolder;
}
@Override
public PageId getPageId() {
return null;
}
@Override
public Object getWidget() {
return viewport;
}
@Override
public void requestToNavigateAway(PageState place, NavigationCallback callback) {
callback.onDecided(true);
}
@Override
public String beforeWindowCloses() {
return null;
}
@Override
public boolean navigate(PageState place) {
appBar.getSectionTabStrip().setSelection(place.getSection());
return true;
}
@Override
public void shutdown() {
}
}