blob: f2d320612a510cc240b2822d465b6c739a5d87a7 [file] [log] [blame]
/*
* 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);
}
}