Introduced PagerFactory to allow easy swap of pagers for CellBrowser.

Review at http://gwt-code-reviews.appspot.com/1659803

Review by: jlabanca@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10905 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
index b5bbfe8..b6dd0292 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
@@ -57,6 +57,7 @@
 import com.google.gwt.user.client.ui.SplitLayoutPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.view.client.HasData;
+import com.google.gwt.view.client.HasRows;
 import com.google.gwt.view.client.ProvidesKey;
 import com.google.gwt.view.client.SelectionModel;
 import com.google.gwt.view.client.TreeViewModel;
@@ -780,6 +781,24 @@
   }
 
   /**
+   * Pager factory used to create pagers for each {@link CellList} of the
+   * {@link CellBrowser}.
+   */
+  public static interface PagerFactory {
+    AbstractPager create(HasRows display);
+  }
+
+  /**
+   * Default pager.
+   */
+  private static class PageSizePagerFactory implements PagerFactory {
+    @Override
+    public AbstractPager create(HasRows display) {
+      return new PageSizePager(display.getVisibleRange().getLength());
+    }
+  }
+
+  /**
    * Builder object to create CellBrowser.
    *
    * @param <T> the type of data in the root node
@@ -788,6 +807,8 @@
     private final TreeViewModel viewModel;
     private final T rootValue;
     private Widget loadingIndicator;
+    private PagerFactory pagerFactory = new PageSizePagerFactory();
+    private Integer pageSize;
     private Resources resources;
 
     /**
@@ -822,6 +843,32 @@
     }
 
     /**
+     * Set the pager factory used to create pagers for each {@link CellList}.
+     * Defaults to {@link PageSizePagerFactory} if not set.
+     *
+     * Can be set to null if no pager should be used. You should also set pageSize
+     * big enough to hold all your data then.
+     *
+     * @param factory the pager factory
+     * @return this
+     */
+    public Builder<T> pagerFactory(PagerFactory factory) {
+      this.pagerFactory = factory;
+      return this;
+    }
+
+    /**
+     * Set the pager size for each {@link CellList}.
+     *
+     * @param pageSize the page size
+     * @return this
+     */
+    public Builder<T> pageSize(int pageSize) {
+      this.pageSize = pageSize;
+      return this;
+    }
+
+    /**
      * Set resources used for images.
      *
      * @param resources the {@link Resources} used for images
@@ -908,6 +955,16 @@
   private final SafeHtml openImageHtml;
 
   /**
+   * Factory used to create pagers for CellLists.
+   */
+  private final PagerFactory pagerFactory;
+
+  /**
+   * Page size for CellLists.
+   */
+  private final Integer pageSize;
+
+  /**
    * The element used to maintain the scrollbar when columns are removed.
    */
   private Element scrollLock;
@@ -954,6 +1011,8 @@
     this.style.ensureInjected();
     this.cellListResources = new CellListResourcesImpl(resources);
     this.loadingIndicator = builder.loadingIndicator;
+    this.pagerFactory = builder.pagerFactory;
+    this.pageSize = builder.pageSize;
     initWidget(new SplitLayoutPanel());
     getElement().getStyle().setOverflow(Overflow.AUTO);
     setStyleName(this.style.cellBrowserWidget());
@@ -1067,7 +1126,10 @@
    * @return the pager
    */
   protected <C> Widget createPager(HasData<C> display) {
-    PageSizePager pager = new PageSizePager(display.getVisibleRange().getLength());
+    if (pagerFactory == null) {
+      return null;
+    }
+    AbstractPager pager = pagerFactory.create(display);
     pager.setDisplay(display);
     return pager;
   }
@@ -1155,6 +1217,9 @@
     if (loadingIndicator != null) {
       display.setLoadingIndicator(loadingIndicator);
     }
+    if (pageSize != null) {
+      display.setPageSize(pageSize);
+    }
     display.setValueUpdater(nodeInfo.getValueUpdater());
 
     /*