@Override
    protected void onRangeOrRowCountChanged() {
        final NumberFormat formatter = NumberFormat.getFormat("#,###");
        final HasRows display = getDisplay();
        final Range range = display.getVisibleRange();
        final int pageStart = range.getStart() + 1;
        final int pageSize = range.getLength();
        final int dataSize = display.getRowCount();
        int endIndex = Math.min(dataSize, pageStart + pageSize - 1);
        endIndex = Math.max(pageStart, endIndex);

        final boolean isRowCountExact = display.isRowCountExact();
        final boolean hasPreviousPage = hasPreviousPage();
        final boolean hasNextPage = hasNextPage();

        // If we aren't currently editing from or to values then turn editing off.
        if (focussed.size() == 0) {
            setEditing(false);
        }

        lblFrom.setText(formatter.format(pageStart));
        lblTo.setText(formatter.format(endIndex));
        if (isRowCountExact) {
            lblOf.setText(formatter.format(dataSize));
        } else {
            lblOf.setText("?");
        }

        // Update the buttons.
        first.setEnabled(hasPreviousPage);
        prev.setEnabled(hasPreviousPage);
        next.setEnabled(hasNextPage);
        last.setEnabled(hasNextPage && isRowCountExact);

        refresh.setEnabled(true);
    }
Let the page know that the table is loading. Call this method to clear
all data from the table and hide the current range when new data is being
loaded into the table.
stroom-core-client-widget/src/main/java/stroom/data/pager/client/Pager.java