/* * 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 Object _returnValue; @Override 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); } @Override public Page back() { if (_history.isEmpty()) { return null; } return _history.pop(); } @Override public void goBack(Page fromPage, Object returnValue) { setReturnValue(returnValue); final Page toPage = from(); 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(Object param) { Page initial = (Page) param; Page.load(initial); } @Override public void setReturnValue(Object returnValue) { _returnValue = returnValue; } @Override public Object getReturnValue() { return _returnValue; } }