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

Java tutorial

Introduction

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

Source

package com.google.gwt.sample.showcase.client.content.cell;

import java.util.logging.Logger;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.sample.showcase.client.Settings;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.cellview.client.LoadingStateChangeEvent;
import com.google.gwt.user.client.Window;
import com.google.gwt.view.client.Range;

class WindowFiller {

    private static final Logger logger = Logger.getLogger(WindowFiller.class.getName());

    private WindowFiller(CellList<?> cellList) {
        Handler handler = new Handler(cellList);
        Window.addResizeHandler(handler);
        cellList.addLoadingStateChangeHandler(handler);
    }

    static WindowFiller install(CellList<?> cellList) {
        return new WindowFiller(cellList);
    }

    private class Handler implements ResizeHandler, LoadingStateChangeEvent.Handler {

        private CellList<?> cellList;

        public Handler(CellList<?> cellList) {
            this.cellList = cellList;
        }

        @Override
        public void onResize(ResizeEvent event) {
            if (!fillingEnabled()) {
                return;
            }
            maybeExtendAfterDomHasFinishedUpdating();
        }

        @Override
        public void onLoadingStateChanged(LoadingStateChangeEvent event) {
            if (!fillingEnabled()) {
                return;
            }
            if (event.getLoadingState() == LoadingStateChangeEvent.LoadingState.LOADING) {
                logger.info("onLoadingStateChanged: LOADING");
                return;
            }
            if (!theresMoreDataThanVisible()) {
                return;
            }
            logger.info("onLoadingStateChanged: "
                    + (event.getLoadingState() == LoadingStateChangeEvent.LoadingState.LOADED ? "LOADED"
                            : "PARTIALLY_LOADED"));
            maybeExtendAfterDomHasFinishedUpdating();
        }

        private void maybeExtendAfterDomHasFinishedUpdating() {
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                @Override
                public void execute() {
                    maybeExtend();
                }
            });
        }

        private void maybeExtend() {
            logger.info("maybeExtend");
            if (cellList.getOffsetHeight() >= cellList.getParent().getOffsetHeight()) {
                return;
            }
            int visibleItemCount = cellList.getVisibleItemCount();
            double pixelsPerItem = cellList.getOffsetHeight() / (double) visibleItemCount;
            Range newRange = new Range(cellList.getVisibleRange().getStart(),
                    (int) Math.ceil(cellList.getParent().getOffsetHeight() / pixelsPerItem));
            logger.info("maybeExtend: setting visible to " + newRange);
            cellList.setVisibleRange(newRange);
        }

        private boolean theresMoreDataThanVisible() {
            return !cellList.isRowCountExact() || (cellList.getVisibleItemCount() < cellList.getRowCount());
        }
    }

    private boolean fillingEnabled() {
        return Settings.get().getWindowFilling();
    }
}