/*
* Copyright (c) 2010 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 com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.gwtmobile.ui.client.utils.Utils;
import com.gwtmobile.ui.client.widgets.WidgetBase;
//FIXME: extends PanelBase?
public abstract class Page extends WidgetBase {
final static private String CONSUMED_TOKEN = "#?#";
private Transition _transition;
private static Transition _defaultTransition = Transition.SLIDE;
protected String tokenStateInfo = CONSUMED_TOKEN;
@Override
protected void initWidget(Widget widget) {
super.initWidget(widget);
setStyleName("Page");
// TODO: use permutation instead?
if (Utils.isAndroid()) {
addStyleName("Android");
} else if (Utils.isIOS()) {
addStyleName("iOS");
} else {
addStyleName("Desktop");
}
}
/**
* Gives the page an opportunity to load state that was sent as part of the
* history token prior to display.
*
* @see PageHistory#navigateTo(String, String)
* @see BrowserPageHistory#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*
* @param stateInfo
*/
protected void initNavigationalState(String stateInfo) {
}
@Override
public void onTransitionEnd() {
final Page to, from;
final PageHistory pageHistory = PageHistory.Instance;
if (pageHistory.from() == null
|| pageHistory.from() != Page.this) { // goto
Utils.Console("goto");
from = pageHistory.current();
to = this;
pageHistory.add(to);
// TODO: change to use scheduler deferred command.
Timer timer = new Timer() {
@Override
public void run() {
to.onNavigateTo();
to.initNavigationIfRequired();
}
};
timer.schedule(1);
} else { // goback
Utils.Console("goback");
from = pageHistory.current();
pageHistory.back();
to = pageHistory.current();
Timer timer = new Timer() {
@Override
public void run() {
to.onNavigateBack(from,
pageHistory.getReturnValue());
to.initNavigationIfRequired();
}
};
timer.schedule(1);
}
}
protected void initNavigationIfRequired() {
if (!CONSUMED_TOKEN.equals(tokenStateInfo)) {
initNavigationalState(tokenStateInfo);
tokenStateInfo = CONSUMED_TOKEN;
}
}
protected void onNavigateTo() {
}
protected void onNavigateBack(Page from, Object object) {
}
public void goTo(final Page toPage, final Transition transition) {
Element focus = Utils.getActiveElement();
focus.blur();
final Page fromPage = this;
toPage.setTransition(transition);
if (transition != null) {
transition.start(fromPage, toPage, RootLayoutPanel.get(), false);
} else {
Transition.start(fromPage, toPage, RootLayoutPanel.get());
}
}
public void goBack(Object returnValue) {
PageHistory.Instance.goBack(this, returnValue);
}
void setTransition(Transition transition) {
_transition = transition;
}
Transition getTransition() {
return _transition;
}
public static void load(Page mainPage) {
setPageResolution();
RootLayoutPanel.get().add(mainPage);
PageHistory.Instance.add(mainPage);
}
public static void setDefaultTransition(Transition transition) {
_defaultTransition = transition;
}
public void goTo(final Page toPage) {
goTo(toPage, _defaultTransition);
}
@Override
public Widget getWidget() { // make getWidget() public
return super.getWidget();
}
private static void setPageResolution() {
double ratio = getDevicePixelRatio();
if (ratio == 2) { // iphone 4. screen size on iphone does not change
// despite the dp ratio.
Document.get().getDocumentElement().setClassName("HVGA");
} else if (ratio == 1.5) {
Document.get().getDocumentElement().setClassName("WVGA");
} else if (ratio == 0.75) {
Document.get().getDocumentElement().setClassName("QVGA");
} else {
Document.get().getDocumentElement().setClassName("HVGA");
}
}
public static native double getDevicePixelRatio() /*-{
return $wnd.devicePixelRatio;
}-*/;
}