Revision: 7896
Author: [email protected]
Date: Thu Apr  8 10:06:07 2010
Log: Changes CustomizedShell to use the new Table widget.

Review at http://gwt-code-reviews.appspot.com/318801

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=7896

Added:
 /trunk/bikeshed/src/com/google/gwt/bikeshed/cells/client/EditTextCell.java
Modified:
 /trunk/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml

=======================================
--- /dev/null
+++ /trunk/bikeshed/src/com/google/gwt/bikeshed/cells/client/EditTextCell.java Thu Apr 8 10:06:07 2010
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2010 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.bikeshed.cells.client;
+
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.InputElement;
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.event.dom.client.KeyCodes;
+
+/**
+ * An editable text cell. Click to edit, escape to cancel, return to commit.
+ */
+public class EditTextCell extends Cell<String, String> {
+
+  @Override
+ public String onBrowserEvent(Element parent, String value, String viewData,
+      NativeEvent event, ValueUpdater<String, String> valueUpdater) {
+    if (viewData != null) {
+      return editEvent(parent, value, viewData, event, valueUpdater);
+    }
+    return nonEditEvent(parent, value, viewData, event, valueUpdater);
+  }
+
+  @Override
+  public void render(String value, String viewData, StringBuilder sb) {
+    if (viewData != null) {
+      sb.append("<input type='text' value='" + viewData + "'></input>");
+    } else {
+      sb.append(value);
+    }
+  }
+
+  protected String edit(Element parent, String value) {
+    setValue(parent, value, value);
+    InputElement input = (InputElement) parent.getFirstChild();
+    input.focus();
+    input.select();
+    return value;
+  }
+
+  private String cancel(Element parent, String value) {
+    setValue(parent, value, null);
+    return null;
+  }
+
+  private String commit(Element parent,
+      ValueUpdater<String, String> valueUpdater) {
+    String value;
+    InputElement input = (InputElement) parent.getFirstChild();
+    value = input.getValue();
+    valueUpdater.update(value, null);
+    return cancel(parent, value);
+  }
+
+  private String editEvent(Element parent, String value, String viewData,
+      NativeEvent event, ValueUpdater<String, String> valueUpdater) {
+    if ("keydown".equals(event.getType())) {
+      if (event.getKeyCode() == KeyCodes.KEY_ENTER) {
+        return commit(parent, valueUpdater);
+      }
+      if (event.getKeyCode() == KeyCodes.KEY_ESCAPE) {
+        return cancel(parent, value);
+      }
+    }
+    return viewData;
+  }
+
+ private String nonEditEvent(Element parent, String value, String viewData,
+      NativeEvent event, ValueUpdater<String, String> valueUpdater) {
+    if ("click".equals(event.getType())) {
+      return edit(parent, value);
+    }
+    return viewData;
+  }
+}
=======================================
--- /trunk/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java Fri Apr 2 20:13:37 2010 +++ /trunk/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java Thu Apr 8 10:06:07 2010
@@ -25,7 +25,11 @@
 public class DateCell extends Cell<Date, Void> {

   private final DateTimeFormat format;
-
+
+  public DateCell() {
+    this(DateTimeFormat.getFullDateFormat());
+  }
+
   public DateCell(DateTimeFormat format) {
     this.format = format;
   }
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java Sat Apr 3 11:30:35 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java Thu Apr 8 10:06:07 2010
@@ -55,9 +55,8 @@
     root.add(shell);

     shell.setListener(new CustomizedShell.Listener() {
-      public void setFirstPurpose(String purpose) {
+      public void setPurpose(Values<ReportKey> report, String purpose) {
DeltaValueStore deltaValueStore = requestFactory.getValueStore().spawnDeltaView();
-        Values<ReportKey> report = shell.getValues().get(0);
         deltaValueStore.set(report.getKey().getPurpose(), report, purpose);
         requestFactory.syncRequest(deltaValueStore).fire();
       }
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java Sat Apr 3 11:30:35 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java Thu Apr 8 10:06:07 2010
@@ -15,30 +15,25 @@
  */
 package com.google.gwt.sample.expenses.gwt.customized;

+import com.google.gwt.bikeshed.cells.client.DateCell;
+import com.google.gwt.bikeshed.cells.client.EditTextCell;
+import com.google.gwt.bikeshed.cells.client.FieldUpdater;
+import com.google.gwt.bikeshed.cells.client.TextCell;
+import com.google.gwt.bikeshed.list.client.Column;
+import com.google.gwt.bikeshed.list.client.PagingTableListView;
+import com.google.gwt.bikeshed.list.shared.ListListModel;
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.NodeList;
-import com.google.gwt.dom.client.TableCellElement;
-import com.google.gwt.dom.client.TableElement;
-import com.google.gwt.dom.client.TableRowElement;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.sample.expenses.gwt.request.ReportChanged;
 import com.google.gwt.sample.expenses.gwt.request.ReportKey;
 import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiFactory;
 import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.uibinder.client.UiHandler;
-import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.TakesValueList;
-import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Values;
-import com.google.gwt.valuestore.shared.ValuesKey;

 import java.util.Date;
 import java.util.List;
@@ -49,53 +44,72 @@
  */
public class CustomizedShell extends Composite implements TakesValueList<Values<ReportKey>>, ReportChanged.Handler {
   interface Listener {
-    void setFirstPurpose(String purpose);
-  }
-
+    void setPurpose(Values<ReportKey> report, String purpose);
+  }
+
   interface ShellUiBinder extends UiBinder<Widget, CustomizedShell> {
   }

   private static ShellUiBinder uiBinder = GWT.create(ShellUiBinder.class);

   private Listener listener;
-
-  @UiField
-  Element error;
-  @UiField
-  TableElement table;
-  @UiField
-  TableRowElement header;
-  @UiField
-  ListBox users;
-  @UiField
-  TextBox purpose;
-  @UiField
-  Button save;
   private List<Values<ReportKey>> values;
+  private final ListListModel<Values<ReportKey>> model;
+
+  @UiField Element error;
+  @UiField ListBox users;
+  @UiField PagingTableListView<Values<ReportKey>> listView;
+
+ private Column<Values<ReportKey>, Date, Void> createdCol = new Column<Values<ReportKey>, Date, Void>(
+      new DateCell()) {
+    @Override
+    public Date getValue(Values<ReportKey> object) {
+      return object.get(ReportKey.get().getCreated());
+    }
+  };
+
+ private Column<Values<ReportKey>, String, Void> statusCol = new Column<Values<ReportKey>, String, Void>(
+      TextCell.getInstance()) {
+    @Override
+    public String getValue(Values<ReportKey> object) {
+      return "...";
+    }
+  };
+
+ private Column<Values<ReportKey>, String, String> purposeCol = new Column<Values<ReportKey>, String, String>(
+      new EditTextCell()) {
+    @Override
+    public String getValue(Values<ReportKey> object) {
+      return object.get(ReportKey.get().getPurpose());
+    }
+  };

   public CustomizedShell() {
+    model = new ListListModel<Values<ReportKey>>();
     initWidget(uiBinder.createAndBindUi(this));
+
+    listView.addColumn(createdCol, "Created");
+    listView.addColumn(statusCol, "Status (tbd)");
+    listView.addColumn(purposeCol, "Purpose");
+
+ purposeCol.setFieldUpdater(new FieldUpdater<Values<ReportKey>, String, String>() {
+      @Override
+      public void update(int index, Values<ReportKey> object, String value,
+          String viewData) {
+        model.getList().set(index, object);
+        listener.setPurpose(object, value);
+      }
+    });
   }

   public List<Values<ReportKey>> getValues() {
     return values;
   }
-
-  @UiHandler("purpose")
-  public void onPurposeChange(ValueChangeEvent<String> e) {
-    listener.setFirstPurpose(e.getValue());
-  }
-
+
   public void onReportChanged(ReportChanged event) {
     refresh();
   }
-
-  @UiHandler("save")
-  @SuppressWarnings("unused")
-  public void onSaveClick(ClickEvent e) {
-    listener.setFirstPurpose(purpose.getValue());
-  }
-
+
   public void setListener(Listener listener) {
     this.listener = listener;
   }
@@ -106,59 +120,11 @@
   }

   private void refresh() {
-    int r = 1; // skip header
-    NodeList<TableRowElement> tableRows = table.getRows();
-    purpose.setText("");
-    boolean enabled = values.size() > 0;
-    purpose.setEnabled(enabled);
-    save.setEnabled(enabled);
-    for (int i = 0; i < values.size(); i++) {
-      Values<ReportKey> valueRow = values.get(i);
-
-      if (i == 0) {
-        purpose.setText(valueRow.get(ReportKey.get().getPurpose()));
-      }
-      if (r < tableRows.getLength()) {
-        reuseRow(r, tableRows, valueRow);
-      } else {
-        TableRowElement tableRow = Document.get().createTRElement();
-
-        TableCellElement tableCell = Document.get().createTDElement();
- tableCell.setInnerText(renderDate(valueRow, ReportKey.get().getCreated()));
-        tableRow.appendChild(tableCell);
-
-        tableCell = Document.get().createTDElement();
-        /* status goes here */
-        tableRow.appendChild(tableCell);
-
-        tableCell = Document.get().createTDElement();
-        tableCell.setInnerText(valueRow.get(ReportKey.get().getPurpose()));
-        tableRow.appendChild(tableCell);
-
-        table.appendChild(tableRow);
-      }
-      r++;
-    }
-    while (r < tableRows.getLength()) {
-      table.removeChild(tableRows.getItem(r));
-    }
+    model.setList(values);
   }

- private <K extends ValuesKey<K>> String renderDate(Values<K> values, Property<K, Date> property) { - return DateTimeFormat.getShortDateFormat().format(values.get(property));
-  }
-
-  /**
-   * @param r
-   * @param tableRows
-   * @param valueRow
-   */
-  private void reuseRow(int r, NodeList<TableRowElement> tableRows,
-      Values<ReportKey> valueRow) {
-    TableRowElement tableRow = tableRows.getItem(r);
-    NodeList<TableCellElement> tableCells = tableRow.getCells();
-
- // tableCells.getItem(0).setInnerText(valueRow.get(Report.instance().CREATED).toString()); - tableCells.getItem(2).setInnerText(valueRow.get(ReportKey.get().getPurpose()));
+  @UiFactory
+  PagingTableListView<Values<ReportKey>> createListView() {
+    return new PagingTableListView<Values<ReportKey>>(model, 10);
   }
 }
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml Sat Apr 3 11:30:35 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml Thu Apr 8 10:06:07 2010
@@ -1,6 +1,7 @@
 <!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:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:l='urn:import:com.google.gwt.bikeshed.list.client'>

   <ui:style>
     .disabled {
@@ -34,6 +35,7 @@
<g:ListBox addStyleNames='{style.users}' ui:field='users'></g:ListBox>
       </g:HTMLPanel>
     </g:north>
+
     <g:west size='15'>
       <g:HTML styleName='{style.disabled}'>
         <div>New expense report</div>
@@ -46,21 +48,7 @@
     <g:center>
       <g:HTMLPanel width='100%' height='100%'>
         <h1>Expenses</h1>
-        <table ui:field='table' class='{style.reports}' width='100%'>
-          <col width='0%' span='2'></col>
-          <col width='100%'></col>
-          <tr ui:field='header'>
-            <th>Created</th>
-            <th>Status&nbsp;(tbd)</th>
-            <th align='left'>Purpose</th>
-          </tr>
-        </table>
-
-        <div>
-          Edit purpose of first report:
-          <g:TextBox ui:field='purpose' enabled='false'/>
-          <g:Button ui:field='save' enabled='false'>Save</g:Button>
-        </div>
+        <l:PagingTableListView ui:field='listView'/>
       </g:HTMLPanel>
     </g:center>
   </g:DockLayoutPanel>

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

Reply via email to