/*
* Copyright 2009 Google Inc.
*
* 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.google.appengine.demos.taskengine.client;
import com.google.gwt.animation.client.Animation;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import java.util.ArrayList;
import java.util.List;
/**
* Widget that handles transitioning between UI pages.
*/
public class PageTransitionPanel extends Widget {
/**
* Simple Animation class for doing those fancy page slide transitions.
*/
private class TransitionAnimation extends Animation {
private int newPageIndex;
private int oldScrollLeft;
private int oldScrollTop;
private int scrollLeftDelta;
private int scrollTopDelta;
public void start(int newPageIndex) {
this.newPageIndex = newPageIndex;
int windowWidth = DomUtils.getWindow().getWidth();
oldScrollLeft = getElement().getPropertyInt("scrollLeft");
oldScrollTop = Document.get().getBody().getPropertyInt("scrollTop");
scrollLeftDelta = (windowWidth * newPageIndex) - oldScrollLeft;
scrollTopDelta = 0 - oldScrollTop;
run(300);
}
@Override
protected void onComplete() {
currentPageIndex = newPageIndex;
onUpdate(1);
}
@Override
protected void onUpdate(double progress) {
getElement().setPropertyInt("scrollLeft",
oldScrollLeft + (int) (progress * scrollLeftDelta));
Document.get().getBody().setPropertyInt("scrollTop",
oldScrollTop + (int) (progress * scrollTopDelta));
}
}
List<Page> pages = new ArrayList<Page>();
private DivElement contentWrapper;
private int currentPageIndex = 0;
private final TransitionAnimation transitionAnimation;
public PageTransitionPanel(Element parentElement) {
super(parentElement);
transitionAnimation = new TransitionAnimation();
// This element is the main container, and the 'viewport' into
// our inner UI components.
getElement().getStyle().setProperty("overflowX", "hidden");
// We have a large inner DIV that we use to contain the content that is
// scrolled in the x axis
contentWrapper = Document.get().createDivElement();
contentWrapper.getStyle().setPropertyPx("width", 4096);
getElement().appendChild(contentWrapper);
// Handle resize events
hookResizeListener();
}
public void addPage(Page page) {
page.setPageIndex(pages.size());
pages.add(page);
}
/**
* Transitions between pages.
*
* @param newPageIndex the new page index we want to transition to
*/
public void doPageTransition(int newPageIndex) {
transitionAnimation.start(newPageIndex);
}
/**
* Handles when we transition between portrait and landscape modes.
*/
public void doResize() {
int windowWidth = DomUtils.getWindow().getWidth();
// adjust the scroll position
Element elem = getElement();
elem.getStyle().setPropertyPx("width", windowWidth);
// resize inner pages
for (int i = 0, n = pages.size(); i < n; i++) {
pages.get(i).setWidth(windowWidth);
}
getElement().setPropertyInt("scrollLeft", windowWidth * currentPageIndex);
}
/**
* Getter for the element that our Pages to attach to.
*
* @return the {@link Element} that we want {@link Page}s to attach to.
*/
public Element getContainerElement() {
return contentWrapper;
}
/**
* Attaches an EventListener to the resize event on the Window.
*/
private void hookResizeListener() {
DomUtils.getWindow().addResizeListener(new EventListener() {
public void onBrowserEvent(Event event) {
doResize();
}
});
}
}