com.google.gwt.sample.mobilewebapp.presenter.task.TaskReadPresenter.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.sample.mobilewebapp.presenter.task.TaskReadPresenter.java

Source

/*
 * Copyright 2011 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.gwt.sample.mobilewebapp.presenter.task;

import com.google.gwt.sample.mobilewebapp.client.ClientFactory;
import com.google.gwt.sample.mobilewebapp.client.event.ActionEvent;
import com.google.gwt.sample.mobilewebapp.client.event.ActionNames;
import com.google.gwt.sample.mobilewebapp.client.event.TaskEditEvent;
import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.requestfactory.shared.Receiver;

/**
 * Makes a TaskReadView display a task.
 */
public class TaskReadPresenter implements TaskReadView.Presenter {

    private final ClientFactory clientFactory;

    /**
     * A boolean indicating whether or not this activity is still active. The user
     * might move to another activity while this one is loading, in which case we
     * do not want to do any more work.
     */
    private boolean isDead = false;

    /**
     * The current task being displayed, might not be possible to edit it.
     */
    private TaskProxy task;

    /**
     * The ID of the current task being edited.
     */
    private final Long taskId;
    private EventBus eventBus;

    /**
     * Construct a new {@link TaskReadPresenter}.
     * 
     * @param clientFactory the {@link ClientFactory} of shared resources
     * @param place configuration for this activity
     */
    public TaskReadPresenter(ClientFactory clientFactory, TaskPlace place) {
        this.taskId = place.getTaskId();
        this.task = place.getTask();
        this.clientFactory = clientFactory;
        clientFactory.getTaskReadView().setPresenter(this);
    }

    @Override
    public Widget asWidget() {
        return getView().asWidget();
    }

    @Override
    public void editTask() {
        eventBus.fireEvent(new TaskEditEvent(task));
    }

    @Override
    public String mayStop() {
        return null;
    }

    public void start(EventBus newEventBus) {
        this.eventBus = newEventBus;

        // Hide the 'add' button in the shell.
        // TODO(rjrjr) Ick!
        clientFactory.getShell().setAddButtonVisible(false);

        // Try to load the task from local storage.
        if (task == null) {
            task = clientFactory.getTaskProxyLocalStorage().getTask(taskId);
        }

        if (task == null) {
            // Load the existing task.
            clientFactory.getRequestFactory().taskRequest().findTask(this.taskId).fire(new Receiver<TaskProxy>() {
                @Override
                public void onSuccess(TaskProxy response) {
                    // Early exit if this activity has already been cancelled.
                    if (isDead) {
                        return;
                    }

                    // Task not found.
                    if (response == null) {
                        Window.alert("The task with id '" + taskId + "' could not be found."
                                + " Please select a different task from the task list.");
                        ActionEvent.fire(eventBus, ActionNames.EDITING_CANCELED);
                        return;
                    }

                    // Show the task.
                    task = response;
                    getView().getEditorDriver().edit(response);
                }
            });
        } else {
            // Use the task that was passed with the place.
            getView().getEditorDriver().edit(task);
        }
    }

    @Override
    public void stop() {
        eventBus = null;
        // Ignore all incoming responses to the requests from this activity.
        isDead = true;
    }

    private TaskReadView getView() {
        return clientFactory.getTaskReadView();
    }
}