com.google.gwt.sample.showcase.client.content.cell.AsyncContactProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.sample.showcase.client.content.cell.AsyncContactProvider.java

Source

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);
    }
}