Revision: 10165
Author:   [email protected]
Date:     Mon May  9 09:40:33 2011
Log:      Introduces read only task view with an edit button.  Gets around
problems when we try to edit a TaskProxyImpl, which is unpossible.

http://code.google.com/p/google-web-toolkit/source/detail?r=10165

Added:
/trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskReadView.java /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/tablet/TabletTaskReadView.java /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/tablet/TabletTaskReadView.ui.xml
Modified:
/trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java

=======================================
--- /dev/null
+++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskReadView.java Mon May 9 09:40:33 2011
@@ -0,0 +1,46 @@
+/*
+ * 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.client.activity;
+
+import com.google.gwt.editor.client.Editor;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
+import com.google.gwt.user.client.ui.IsWidget;
+
+public interface TaskReadView extends IsWidget, Editor<TaskProxy> {
+
+  /**
+   * The presenter for this view.
+   */
+  public static interface Presenter {
+    /**
+     * Switch to an edit view of this task.
+     */
+    void editTask();
+  }
+
+  /**
+   * Get the driver used to edit tasks in the view.
+   */
+  SimpleBeanEditorDriver<TaskProxy, ?> getEditorDriver();
+
+  /**
+   * Set the {@link Presenter} for this view.
+   *
+   * @param presenter the presenter
+   */
+  void setPresenter(Presenter presenter);
+}
=======================================
--- /dev/null
+++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/tablet/TabletTaskReadView.java Mon May 9 09:40:33 2011
@@ -0,0 +1,99 @@
+/*
+ * 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.client.tablet;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.sample.mobilewebapp.client.activity.TaskEditView;
+import com.google.gwt.sample.mobilewebapp.client.activity.TaskReadView;
+import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.DateLabel;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * View used to edit a task.
+ */
+public class TabletTaskReadView extends Composite implements TaskReadView {
+
+  /**
+   * Editor driver for this view.
+   */
+ interface Driver extends SimpleBeanEditorDriver<TaskProxy, TabletTaskReadView> {
+  }
+
+  /**
+   * The UiBinder interface.
+   */
+ interface TabletTaskReadViewUiBinder extends UiBinder<Widget, TabletTaskReadView> {
+  }
+
+  /**
+   * The UiBinder used to generate the view.
+   */
+ private static TabletTaskReadViewUiBinder uiBinder = GWT.create(TabletTaskReadViewUiBinder.class);
+
+  @UiField
+  DateLabel dueDateEditor;
+  @UiField
+  Label nameEditor;
+  @UiField
+  Label notesEditor;
+
+  /**
+   * The text box used to save changes or create a new task.
+   */
+  @UiField
+  Button editButton;
+
+  private final Driver driver = GWT.create(Driver.class);
+
+  /**
+   * The {@link TaskEditView.Presenter} for this view.
+   */
+  private Presenter presenter;
+
+  /**
+   * Construct a new {@link TabletTaskReadView}.
+   */
+  public TabletTaskReadView() {
+    initWidget(uiBinder.createAndBindUi(this));
+    driver.initialize(this);
+
+    // Create a new task or modify the current task when done is pressed.
+    editButton.addClickHandler(new ClickHandler() {
+      public void onClick(ClickEvent event) {
+        if (presenter != null) {
+          presenter.editTask();
+        }
+      }
+    });
+  }
+
+  public SimpleBeanEditorDriver<TaskProxy, ?> getEditorDriver() {
+    return driver;
+  }
+
+  public void setPresenter(Presenter presenter) {
+    this.presenter = presenter;
+  }
+}
=======================================
--- /dev/null
+++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/tablet/TabletTaskReadView.ui.xml Mon May 9 09:40:33 2011
@@ -0,0 +1,147 @@
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder
+  xmlns:ui="urn:ui:com.google.gwt.uibinder"
+  xmlns:g="urn:import:com.google.gwt.user.client.ui"
+  xmlns:app="urn:import:com.google.gwt.sample.mobilewebapp.client.ui">
+
+  <ui:style>
+    .outer {
+      background: #eee;
+    }
+
+    .title {
+      background: #393939;
+      color: white;
+      padding: 4px 10px;
+      font-size: 20pt;
+    }
+
+    .editForm {
+      padding: 10px;
+      background: white;
+    }
+
+    .label {
+      color: #666;
+      font-size: 20pt;
+      padding-bottom: 3px;
+    }
+
+    .field {
+      width: 100%;
+      margin-bottom: 12px;
+      font-size: 20pt;
+    }
+
+    .textBoxWrapper {
+      margin-right: 10px;
+    }
+
+    .nameBox {
+      height: 2em;
+    }
+
+    .notesBox {
+      height: 4em;
+    }
+
+    .violation {
+      color: red;
+      font-size: 18pt;
+    }
+
+    .button {
+      padding-top: 8px;
+      padding-bottom: 8px;
+      color: #3f3f3f;
+      font-size: 20pt;
+    }
+
+    .dateButton {
+      text-align: left;
+    }
+
+    .buttonPanel {
+      width: 100%;
+      padding: 10px;
+      margin-top: 15px;
+    }
+
+    .saveButton {
+      width: 100%;
+    }
+
+  </ui:style>
+
+  <g:DockLayoutPanel
+    unit="PT">
+    <!-- Title. -->
+    <g:north
+      size="28">
+      <g:Label
+        addStyleNames="{style.title}">DETAILS</g:Label>
+    </g:north>
+
+    <g:center>
+      <g:ScrollPanel
+        addStyleNames="{style.outer}">
+        <g:HTMLPanel>
+
+          <!-- Edit Form. -->
+          <div
+            class="{style.editForm}">
+            <!-- Task name. -->
+            <div
+              class="{style.label}">What</div>
+            <div
+              class="{style.textBoxWrapper}">
+              <g:Label
+                addStyleNames="{style.field} {style.nameBox}"
+                ui:field="nameEditor" />
+            </div>
+
+            <!-- Task notes. -->
+            <div
+              class="{style.label}">Notes</div>
+            <div
+              class="{style.textBoxWrapper}">
+              <g:Label
+                addStyleNames="{style.field} {style.notesBox}"
+                ui:field="notesEditor" />
+            </div>
+
+            <!-- Task due date. -->
+            <div
+              class="{style.label}">Due date</div>
+            <g:DateLabel
+ addStyleNames="{style.field} {style.button} {style.dateButton}"
+              ui:field="dueDateEditor" />
+          </div>
+
+          <!-- Button panel. -->
+          <table
+            class="{style.buttonPanel}"
+            cellspacing="0"
+            cellpadding="0">
+            <tr>
+              <td
+                align="center"
+                style="width:50%;padding-right:5px;">
+                <g:Button
+                  ui:field="editButton"
+ addStyleNames="{style.button} {style.saveButton}">Edit</g:Button>
+              </td>
+              <td
+                align="center"
+                style="width:50%;padding-left:5px;">
+                &nbsp;
+              </td>
+            </tr>
+          </table>
+
+        </g:HTMLPanel>
+      </g:ScrollPanel>
+    </g:center>
+  </g:DockLayoutPanel>
+
+</ui:UiBinder>
=======================================
--- /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java Mon May 9 08:12:52 2011 +++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactory.java Mon May 9 09:40:33 2011
@@ -17,9 +17,10 @@

 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.place.shared.PlaceController;
-import com.google.gwt.storage.client.Storage;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskEditView;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskListView;
+import com.google.gwt.sample.mobilewebapp.client.activity.TaskReadView;
+import com.google.gwt.storage.client.Storage;

 /**
  * The factory responsible for instantiating everything interesting in this
@@ -83,6 +84,11 @@
    */
   TaskListView getTaskListView();

+  /**
+   * Get an implementation of {@link TaskEditView}.
+   */
+  TaskReadView getTaskReadView();
+
   /**
    * Must be called before any get methods.
    */
=======================================
--- /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java Mon May 9 08:12:52 2011 +++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/ClientFactoryImpl.java Mon May 9 09:40:33 2011
@@ -22,16 +22,18 @@
 import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.place.shared.PlaceController;
 import com.google.gwt.place.shared.PlaceHistoryHandler;
-import com.google.gwt.sample.mobilewebapp.client.activity.AppActivityMapper;
 import com.google.gwt.sample.gaerequest.client.GaeAuthRequestTransport;
import com.google.gwt.sample.gaerequest.client.ReloadOnAuthenticationFailure; +import com.google.gwt.sample.mobilewebapp.client.activity.AppActivityMapper;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskEditView;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskListActivity;
 import com.google.gwt.sample.mobilewebapp.client.activity.TaskListView;
+import com.google.gwt.sample.mobilewebapp.client.activity.TaskReadView;
import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskEditView; import com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskListView; import com.google.gwt.sample.mobilewebapp.client.desktop.MobileWebAppShellDesktop; import com.google.gwt.sample.mobilewebapp.client.place.AppPlaceHistoryMapper;
+import com.google.gwt.sample.mobilewebapp.client.tablet.TabletTaskReadView;
 import com.google.gwt.storage.client.Storage;
 import com.google.gwt.user.client.Window;
 import com.google.web.bindery.requestfactory.shared.RequestTransport;
@@ -63,6 +65,8 @@
    */
private final PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);

+  private TaskReadView taskReadView;
+
   public ClientFactoryImpl() {
RequestTransport requestTransport = new GaeAuthRequestTransport(eventBus);
     requestFactory = GWT.create(MobileWebAppRequestFactory.class);
@@ -89,12 +93,7 @@
      */
     activityManager = new ActivityManager(activityMapper, eventBus);
   }
-
-  public void init() {
-    activityManager.setDisplay(getShell());
-  }
-
-  @Override
+
   public App getApp() {
return new App(getLocalStorageIfSupported(), getEventBus(), getPlaceController(), historyMapper, historyHandler, new ReloadOnAuthenticationFailure(), getShell());
@@ -136,6 +135,17 @@
     }
     return taskListView;
   }
+
+  public TaskReadView getTaskReadView() {
+    if (taskReadView == null) {
+      taskReadView = createTaskReadView();
+    }
+    return taskReadView;
+  }
+
+  public void init() {
+    activityManager.setDisplay(getShell());
+  }

   /**
    * Create the application UI shell.
@@ -193,4 +203,8 @@
       }
     };
   }
-}
+
+  private TaskReadView createTaskReadView() {
+    return new TabletTaskReadView();
+  }
+}
=======================================
--- /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java Mon May 9 08:12:52 2011 +++ /trunk/samples/mobilewebapp/src/main/com/google/gwt/sample/mobilewebapp/client/activity/TaskEditActivity.java Mon May 9 09:40:33 2011
@@ -37,7 +37,8 @@
 /**
  * Activity that presents a task to be edited.
  */
-public class TaskEditActivity extends AbstractActivity implements TaskEditView.Presenter { +public class TaskEditActivity extends AbstractActivity implements TaskEditView.Presenter,
+    TaskReadView.Presenter {

private static final Logger log = Logger.getLogger(TaskEditActivity.class.getName());
   private final ClientFactory clientFactory;
@@ -56,9 +57,14 @@
   private boolean isEditing;

   /**
-   * The current task being edited.
+   * The current task being displayed, might not be possible to edit it.
    */
-  private TaskProxy task;
+  private TaskProxy readOnlyTask;
+
+  /**
+   * The current task being edited, provided by RequestFactory.
+   */
+  private TaskProxy editTask;

   /**
    * The ID of the current task being edited.
@@ -69,15 +75,17 @@
    * The request used to persist the modified task.
    */
   private Request<Void> taskPersistRequest;
+  private AcceptsOneWidget container;

   /**
    * Construct a new {@link TaskEditActivity}.
+   *
    * @param clientFactory the {@link ClientFactory} of shared resources
    * @param place configuration for this activity
    */
public TaskEditActivity(ClientFactory clientFactory, TaskEditPlace place) {
     this.taskId = place.getTaskId();
-    this.task = place.getTask();
+    this.readOnlyTask = place.getTask();
     this.clientFactory = clientFactory;
   }

@@ -112,7 +120,7 @@
      * request already exists, reuse it.
      */
     if (taskPersistRequest == null) {
-      taskPersistRequest = context.persist().using(task);
+      taskPersistRequest = context.persist().using(editTask);
     }

     // Fire the request.
@@ -141,32 +149,31 @@
   }

   public void start(AcceptsOneWidget container, EventBus eventBus) {
+    this.container = container;
     // Prefetch the sounds used in this activity.
     SoundEffects.get().prefetchError();

     // Hide the 'add' button in the shell.
     clientFactory.getShell().setAddButtonHandler(null);

-    // Set the presenter on the view.
-    final TaskEditView view = clientFactory.getTaskEditView();
-    view.setPresenter(this);
-    view.setNameViolation(null);
+    // Set the presenter on the views.
+    final TaskEditView editView = clientFactory.getTaskEditView();
+    editView.setPresenter(this);
+    editView.setNameViolation(null);
+
+    final TaskReadView readView = clientFactory.getTaskReadView();
+    readView.setPresenter(this);

     if (taskId == null) {
-      // Create a new task.
-      isEditing = false;
-      view.setEditing(false);
- TaskRequest request = clientFactory.getRequestFactory().taskRequest();
-      task = request.create(TaskProxy.class);
-      view.getEditorDriver().edit(task, request);
+      editTask();
+      return;
     } else {
       // Lock the display until the task is loaded.
       isEditing = true;
-      view.setEditing(true);
-
-      if (task == null) {
+      editView.setEditing(true);
+
+      if (readOnlyTask == null) {
         // Load the existing task.
-        view.setLocked(true);
clientFactory.getRequestFactory().taskRequest().findTask(this.taskId).fire(
             new Receiver<TaskProxy>() {
               @Override
@@ -192,20 +199,18 @@
                 }

                 // Show the task.
-                task = response;
-                view.getEditorDriver().edit(response,
-                    clientFactory.getRequestFactory().taskRequest());
-                view.setLocked(false);
+                readOnlyTask = response;
+                readView.getEditorDriver().edit(response);
               }
             });
       } else {
         // Use the task that was passed with the place.
- view.getEditorDriver().edit(task, clientFactory.getRequestFactory().taskRequest());
+        readView.getEditorDriver().edit(readOnlyTask);
       }
     }

     // Display the view.
-    container.setWidget(view.asWidget());
+    container.setWidget(readView);
   }

   /**
@@ -219,12 +224,12 @@
    * Delete the current task.
    */
   private void doDeleteTask() {
-    if (task == null) {
+    if (editTask == null) {
       return;
     }

     // Delete the task in the data store.
-    final TaskProxy toDelete = this.task;
+    final TaskProxy toDelete = this.editTask;
clientFactory.getRequestFactory().taskRequest().remove().using(toDelete).fire(
         new Receiver<Void>() {
           @Override
@@ -271,4 +276,52 @@
     // Return to the task list.
     clientFactory.getPlaceController().goTo(new TaskListPlace(true));
   }
-}
+
+  @Override
+  public void editTask() {
+    // Load the existing task.
+    final TaskEditView editView = clientFactory.getTaskEditView();
+
+    if (taskId == null) {
+      isEditing = false;
+      editView.setEditing(false);
+ TaskRequest request = clientFactory.getRequestFactory().taskRequest();
+      editTask = request.create(TaskProxy.class);
+      editView.getEditorDriver().edit(editTask, request);
+    } else {
+      editView.setLocked(true);
+ clientFactory.getRequestFactory().taskRequest().findTask(this.taskId).fire(
+          new Receiver<TaskProxy>() {
+            @Override
+            public void onFailure(ServerFailure error) {
+ Window.alert("An error occurred on the server while loading this task."
+                  + " Please select a different task from the task list.");
+              doCancelTask();
+            }
+
+            @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.");
+                doCancelTask();
+                return;
+              }
+
+              // Show the task.
+              editTask = response;
+              editView.getEditorDriver().edit(response,
+                  clientFactory.getRequestFactory().taskRequest());
+              editView.setLocked(false);
+            }
+          });
+    }
+    container.setWidget(editView);
+  }
+}

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to