/* * 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.sample.expenses.client; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.sample.expenses.shared.ExpenseProxy; import com.google.gwt.sample.expenses.shared.ExpenseRequest; import com.google.gwt.sample.expenses.shared.ExpensesRequestFactory; import com.google.gwt.sample.expenses.shared.ReportProxy; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.requestfactory.shared.Receiver; import java.util.Date; /** * TODO: doc. */ public class MobileExpenseEntry extends Composite implements MobilePage { /** * TODO: doc. */ public interface Listener { void onExpenseUpdated(); } interface Binder extends UiBinder<Widget, MobileExpenseEntry> { } private static Binder BINDER = GWT.create(Binder.class); @UiField TextBox nameText, categoryText, priceText; @UiField ListBox dateYear, dateMonth, dateDay; @UiField Element errorText; private ExpenseProxy expense; private final ExpensesRequestFactory requestFactory; @SuppressWarnings("unused") private final Listener listener; private ExpenseRequest request; public MobileExpenseEntry(Listener listener, ExpensesRequestFactory requestFactory) { this.listener = listener; this.requestFactory = requestFactory; initWidget(BINDER.createAndBindUi(this)); populateList(dateYear, 2000, 2010); populateList(dateMonth, 1, 12); populateList(dateDay, 1, 31); } @Override public Widget asWidget() { return this; } public void create(ReportProxy report) { request = requestFactory.expenseRequest(); expense = request.create(ExpenseProxy.class); expense.setReport(report); request.persist().using(expense); displayExpense(); } public String getPageTitle() { return expense != null ? expense.getDescription() : ""; } public boolean needsAddButton() { return false; } public String needsCustomButton() { return "Done"; } public boolean needsRefreshButton() { return false; } public void onAdd() { } @SuppressWarnings("deprecation") public void onCustom() { request = requestFactory.expenseRequest(); ExpenseProxy editableExpense = request.edit(expense); editableExpense.setDescription(nameText.getText()); editableExpense.setCategory(categoryText.getText()); request.persist().using(editableExpense); // TODO(jgw): validate amount (in dollars -- database is in pennies) String amountText = priceText.getText(); double amount = Double.parseDouble(amountText); editableExpense.setAmount(amount); // TODO(jgw): Use non-deprecated date methods for this. Date date = new Date( dateYear.getSelectedIndex() + 100, dateMonth.getSelectedIndex(), dateDay.getSelectedIndex() + 1 ); editableExpense.setCreated(date); // TODO: wait throbber request.fire(new Receiver<Void>() { @Override public void onSuccess(Void ignore) { } // TODO: use onViolations to check for constraint violations. }); } public void onRefresh(boolean clear) { } public void show(ExpenseProxy expense) { this.expense = expense; displayExpense(); } @SuppressWarnings("deprecation") private void displayExpense() { errorText.setInnerText(""); nameText.setText(expense.getDescription()); categoryText.setText(expense.getCategory()); priceText.setText(ExpensesMobile.formatCurrency(expense.getAmount())); // TODO(jgw): Use non-deprecated date methods for this. Date d = expense.getCreated(); dateYear.setSelectedIndex(d.getYear() - 100); dateMonth.setSelectedIndex(d.getMonth()); dateDay.setSelectedIndex(d.getDate() - 1); } private void populateList(ListBox list, int start, int end) { for (int i = start; i <= end; ++i) { if (i < 10) { list.addItem("0" + i); } else { list.addItem("" + i); } } } }