/*
* Copyright (c) 2011 Zhihua (Dennis) Jiang
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package com.gwtmobile.ui.client.page;
import java.util.Stack;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.gwtmobile.ui.client.utils.Utils;
/**
* This implementation works well for a native application. However, for
* a hyrbrid, native/webapp consider using the browser navigation model.
*
* @see BrowserPageHistory
*/
public class SerialPageHistory implements PageHistory {
private Stack<Page> _history = new Stack<Page>();
private NavigateInfo _navigateInfo;
public void add(Page page) {
_history.push(page);
}
@Override
public void navigate(String token) {
// DO nothing
}
@Override
public void navigate(String pageName, String params) {
// DO nothing
}
@Override
public Page current() {
if (_history.isEmpty()) {
return null;
}
return _history.peek();
}
@Override
public Page from() {
int size =_history.size();
if (size < 2) {
return null;
}
return _history.elementAt(size - 2);
}
public Page back() {
if (_history.isEmpty()) {
return null;
}
return _history.pop();
}
@Override
public void goTo(Page toPage, Object params, Transition transition) {
Element focus = Utils.getActiveElement();
focus.blur();
final Page fromPage = current();
setNavigateInfo(fromPage, params, false);
add(toPage);
toPage.setTransition(transition);
if (transition != null) {
transition.start(fromPage, toPage, RootLayoutPanel.get(), false);
} else {
Transition.start(fromPage, toPage, RootLayoutPanel.get());
}
}
@Override
public void goBack(Object returnValue) {
Page fromPage = back();
setNavigateInfo(fromPage, returnValue, true);
final Page toPage = current();
if (toPage == null) {
// exit app here.
return;
}
Element focus = Utils.getActiveElement();
focus.blur();
final Transition transition = fromPage.getTransition();
if (transition != null) {
transition.start(fromPage, toPage, RootLayoutPanel.get(), true);
}
else {
Transition.start(fromPage, toPage, RootLayoutPanel.get());
}
}
@Override
public void setMapper(Mapper mapper) {
// Do nothing b/c mapping is not required serial navigation
}
@Override
public void startUp(Page startUpPage) {
RootLayoutPanel rootPanel = RootLayoutPanel.get();
rootPanel.clear();
rootPanel.add(startUpPage);
_history.clear();
_navigateInfo = null;
add(startUpPage);
}
@Override
public NavigateInfo getNavigateInfo() {
NavigateInfo temp = _navigateInfo;
_navigateInfo = null; //memory: release reference once retrieved.
return temp;
}
private void setNavigateInfo(Page fromPage, Object value, boolean goBack) {
_navigateInfo = new NavigateInfo();
_navigateInfo.setFromPage(fromPage);
_navigateInfo.setValue(value);
_navigateInfo.setGoBack(goBack);
}
/**
* Go home and clear the stack. Just pass "this" from the calling page.
* </br>
* By Frank Mena 2012-04-11
*
* @param fromPage the from page
*/
public void goHome(Page fromPage) {
if (false == _history.empty()) {
Page homePage = _history.firstElement();
_history.clear();
Element focus = Utils.getActiveElement();
focus.blur();
final Transition transition = Transition.SLIDE;
transition.start(fromPage, homePage, RootLayoutPanel.get(), true);
}
}
/**
* Gets the home page and clears the stack.
* </br>
* By Frank Mena 2012-04-11
*
* @return the home page
*/
public Page getHomePageAndClearStack() {
if (false == _history.empty()) {
Page page = _history.firstElement();
_history.clear();
return page;
}
else {
return null;
}
}
/**
* Gets the home page.
* </br>
* By Frank Mena 2012-04-11
*
* @return the home page
*/
public Page getHomePage() {
if (false == _history.empty()) {
Page page = _history.firstElement();
_history.clear();
return page;
}
else {
return null;
}
}
}