package com.google.gwt.sample.showcase.client.content.cell; import java.util.ArrayList; import java.util.Collections; import java.util.logging.Logger; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.TextAlign; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.ContactInfo; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.view.client.AbstractDataProvider; import com.google.gwt.view.client.HasData; public class AsyncContactProvider extends AbstractDataProvider<ContactInfo> { private static final Logger logger = Logger.getLogger(AsyncContactProvider.class.getName()); private final ArrayList<ContactInfo> serverContacts = new ArrayList<ContactInfo>(); private final Label loadingStatus = new Label("Loading..."); private int requestCount; public AsyncContactProvider() { installLoadingIndicator(); } private void installLoadingIndicator() { Style style = loadingStatus.getElement().getStyle(); style.setFontSize(2, Unit.EM); style.setFontWeight(FontWeight.BOLD); style.setBackgroundColor("yellow"); style.setTextAlign(TextAlign.CENTER); RootLayoutPanel.get().add(loadingStatus); RootLayoutPanel.get().setWidgetTopHeight(loadingStatus, 0, Unit.PX, 3, Unit.EM); } @Override protected void onRangeChanged(final HasData<ContactInfo> display) { requestCount++; Timer timer = new Timer() { int rc = requestCount; @Override public void run() { int size = serverContacts.size(); if (size > 0) { // Do not push data if the data set is empty. updateRowData( display, 0, serverContacts.subList( 0, display.getVisibleRange().getStart() + display.getVisibleRange().getLength())); updateRowCount(serverContacts.size(), true); } loadingStatus.setVisible(false); logger.info("...RPC " + rc); } }; // Simulate the delay incurred by a remote procedure call. loadingStatus.setVisible(true); loadingStatus.setText("RPC " + requestCount + "..."); logger.info("RPC " + requestCount + "..."); timer.schedule(requestCount == 1 ? 4000 : 2000); } public void refresh() { updateRowData(0, serverContacts); } public void reset() { requestCount = 0; updateRowData(0, Collections.<ContactInfo> emptyList()); } public void add(final ContactInfo contact) { serverContacts.add(contact); } public void remove(ContactInfo contact) { int index = serverContacts.indexOf(contact); if (index == -1) { return; } serverContacts.remove(index); } }