/* * 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.dom.client.Style.Display; import com.google.gwt.event.shared.EventBus; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.sample.expenses.shared.ExpenseProxy; import com.google.gwt.sample.expenses.shared.ExpensesRequestFactory; 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.Widget; import com.google.web.bindery.requestfactory.shared.EntityProxyChange; import com.google.web.bindery.requestfactory.shared.EntityProxyId; import com.google.web.bindery.requestfactory.shared.Receiver; /** * TODO: doc. */ public class MobileExpenseDetails extends Composite implements MobilePage { /** * TODO: doc. */ public interface Listener { void onEditExpense(ExpenseProxy expense); } interface Binder extends UiBinder<Widget, MobileExpenseDetails> { } private static Binder BINDER = GWT.create(Binder.class); @UiField Element approvalText, nameText, dateText, categoryText, priceText, reasonRow, reasonText; private ExpenseProxy expense; private final Listener listener; private final ExpensesRequestFactory requestFactory; public MobileExpenseDetails(Listener listener, EventBus eventBus, ExpensesRequestFactory requestFactory) { this.listener = listener; this.requestFactory = requestFactory; EntityProxyChange.registerForProxyType(eventBus, ExpenseProxy.class, new EntityProxyChange.Handler<ExpenseProxy>() { public void onProxyChange(EntityProxyChange<ExpenseProxy> event) { if (expense != null) { EntityProxyId<ExpenseProxy> newRecord = event.getProxyId(); if (newRecord.equals(expense.getId())) { onRefresh(false); } } } }); initWidget(BINDER.createAndBindUi(this)); } public String getPageTitle() { return expense != null ? expense.getDescription() : ""; } public boolean needsAddButton() { return false; } public String needsCustomButton() { return "Edit"; } public boolean needsRefreshButton() { return true; } public void onAdd() { } public void onCustom() { listener.onEditExpense(expense); } public void onRefresh(boolean clear) { requestFactory.expenseRequest().findExpense(expense.getId()).fire( new Receiver<ExpenseProxy>() { @Override public void onSuccess(ExpenseProxy response) { show(response); } }); } public void show(ExpenseProxy expense) { this.expense = expense; @SuppressWarnings("deprecation") DateTimeFormat formatter = DateTimeFormat.getMediumDateFormat(); Approval approval = Approval.from(expense.getApproval()); nameText.setInnerText(expense.getDescription()); dateText.setInnerText(formatter.format(expense.getCreated())); categoryText.setInnerText(expense.getCategory()); priceText.setInnerText(ExpensesMobile.formatCurrency(expense.getAmount())); approvalText.setInnerHTML(Approval.BLANK.equals(approval) ? "Awaiting Review" : approval.getText()); approvalText.getStyle().setColor(approval.getColor()); reasonText.setInnerText(expense.getReasonDenied()); if (Approval.DENIED.equals(approval)) { // Show the reason denied. reasonRow.getStyle().clearDisplay(); } else { // Hide the reason denied. reasonRow.getStyle().setDisplay(Display.NONE); } } }