Changes CustomizedShell to use the new Table widget. Review at http://gwt-code-reviews.appspot.com/318801 Review by: rjrjr@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7896 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java b/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java index d8c359d..310467d 100644 --- a/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java +++ b/bikeshed/src/com/google/gwt/bikeshed/cells/client/DateCell.java
@@ -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; }
diff --git a/bikeshed/src/com/google/gwt/bikeshed/cells/client/EditTextCell.java b/bikeshed/src/com/google/gwt/bikeshed/cells/client/EditTextCell.java new file mode 100644 index 0000000..d19822a --- /dev/null +++ b/bikeshed/src/com/google/gwt/bikeshed/cells/client/EditTextCell.java
@@ -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; + } +}
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java index 1fa5b9e..17cfaca 100644 --- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java +++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/Customized.java
@@ -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(); }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java index 2e059f4..50026c1 100644 --- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java +++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.java
@@ -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); } }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml index 4c36cc6..af0a02a 100644 --- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml +++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/customized/CustomizedShell.ui.xml
@@ -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 (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>