/* * 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.cell.client.AbstractCell; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.sample.expenses.shared.EmployeeProxy; import com.google.gwt.sample.expenses.shared.ExpensesRequestFactory; import com.google.gwt.sample.expenses.shared.ReportProxy; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.AsyncDataProvider; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.NoSelectionModel; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.web.bindery.requestfactory.gwt.ui.client.EntityProxyKeyProvider; import com.google.web.bindery.requestfactory.shared.Receiver; import java.util.List; /** * TODO: doc. */ public class MobileReportList extends Composite implements MobilePage { /** * TODO: doc. */ public interface Listener { void onCreateReport(EmployeeProxy reporter); void onReportSelected(ReportProxy report); } /** * The receiver for the last request. */ private Receiver<List<ReportProxy>> lastReceiver; private final EmployeeProxy employee; private final Listener listener; private final CellList<ReportProxy> reportList; private final AsyncDataProvider<ReportProxy> reportDataProvider; private final NoSelectionModel<ReportProxy> reportSelection; private final ExpensesRequestFactory requestFactory; public MobileReportList(final Listener listener, final ExpensesRequestFactory requestFactory, EmployeeProxy employee) { this.listener = listener; this.requestFactory = requestFactory; this.employee = employee; EntityProxyKeyProvider<ReportProxy> keyProvider = new EntityProxyKeyProvider<ReportProxy>(); reportDataProvider = new AsyncDataProvider<ReportProxy>(keyProvider) { @Override protected void onRangeChanged(HasData<ReportProxy> view) { requestReports(); } }; reportList = new CellList<ReportProxy>(new AbstractCell<ReportProxy>() { @Override public void render(Context context, ReportProxy value, SafeHtmlBuilder sb) { sb.appendHtmlConstant("<div class='item'>"); sb.appendEscaped(value.getPurpose()); sb.appendHtmlConstant("</div>"); } }); reportList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED); reportSelection = new NoSelectionModel<ReportProxy>(keyProvider); reportSelection.addSelectionChangeHandler( new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { listener.onReportSelected(reportSelection.getLastSelectedObject()); } }); reportList.setSelectionModel(reportSelection); reportDataProvider.addDataDisplay(reportList); initWidget(reportList); onRefresh(false); } @Override public Widget asWidget() { return this; } public String getPageTitle() { return "Expense Reports"; } public boolean needsAddButton() { return true; } public String needsCustomButton() { return null; } public boolean needsRefreshButton() { return true; } public void onAdd() { listener.onCreateReport(employee); } public void onCustom() { } public void onRefresh(boolean clear) { if (clear) { reportDataProvider.updateRowCount(0, true); } requestReports(); } private String[] getReportColumns() { return new String[]{"created", "purpose"}; } private void requestReports() { if (requestFactory == null) { return; } lastReceiver = new Receiver<List<ReportProxy>>() { @Override public void onSuccess( List<ReportProxy> newValues) { int size = newValues.size(); reportDataProvider.updateRowCount(size, true); reportDataProvider.updateRowData(0, newValues); } }; requestFactory.reportRequest().findReportEntriesBySearch(employee.getId(), "", "", "created" + " DESC", 0, 25).with( getReportColumns()).fire(lastReceiver); } }