/* Copyright (c) 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.sticky.client;
import com.google.appengine.demos.sticky.client.model.Model;
import com.google.appengine.demos.sticky.client.model.RetryTimer;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
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.Window;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.UIObject;
/**
* The entry point for the Sticky application.
*
* @author knorton@google.com (Kelly Norton)
*/
public class Main extends RetryTimer implements EntryPoint, Model.LoadObserver,
Model.StatusObserver {
/**
* An aggregated image bundle will auto-sprite all the images in the
* application.
*/
public interface Images extends HeaderView.Images {
}
/**
* Provides Ui to notify the user of model based events. These include tasks
* (like loading a surface) and also errors (like lost communication to the
* server).
*/
private static class StatusView extends SimplePanel {
private final DivElement taskStatusElement;
private final DivElement errorStatusElement;
public StatusView() {
final Document document = Document.get();
final Element element = getElement();
taskStatusElement = element.appendChild(document.createDivElement());
errorStatusElement = element.appendChild(document.createDivElement());
errorStatusElement.setInnerText("No response from server");
setStyleName("status-view");
taskStatusElement.setClassName("status-view-task");
errorStatusElement.setClassName("status-view-error");
hideErrorStatus();
hideTaskStatus();
}
/**
* Hides the Ui for server communication lost errors.
*/
public void hideErrorStatus() {
UIObject.setVisible(errorStatusElement, false);
}
/**
* Hides the task status Ui.
*/
public void hideTaskStatus() {
UIObject.setVisible(taskStatusElement, false);
}
/**
* Displays the Ui for server communication lost errors.
*/
public void showErrorStatus() {
UIObject.setVisible(errorStatusElement, true);
}
/**
* Displays the the Ui for a task status.
*
* @param text
* the text to be displayed
*/
public void showTaskStatus(String text) {
taskStatusElement.setInnerText(text);
UIObject.setVisible(taskStatusElement, true);
}
}
private final StatusView status = new StatusView();
public void onModelLoaded(Model model) {
status.hideTaskStatus();
status.hideErrorStatus();
final Images images = GWT.create(Images.class);
// We don't want any top-level scroll bars.
Window.enableScrolling(false);
final RootPanel root = RootPanel.get();
new HeaderView(images, root, model);
root.add(new SurfaceView(model));
}
public void onModelLoadFailed() {
retryLater();
status.showErrorStatus();
}
public void onModuleLoad() {
RootPanel.get().add(status);
status.showTaskStatus("Loading");
Model.load(this, this);
}
public void onServerCameBack() {
status.hideErrorStatus();
}
public void onServerWentAway() {
status.showErrorStatus();
}
public void onTaskFinished() {
status.hideTaskStatus();
}
public void onTaskStarted(String description) {
status.showTaskStatus(description);
}
@Override
protected void retry() {
Model.load(this, this);
}
}