| /* |
| * 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(); |
| } |
| } |