Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Paging over a collection

/*  * Copyright (c) 2003-2006, Simon Brown  * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  *   - Redistributions of source code must retain the above copyright  *     notice, this list of conditions and the following disclaimer.  *  *   - Redistributions in binary form must reproduce the above copyright  *     notice, this list of conditions and the following disclaimer in  *     the documentation and/or other materials provided with the  *     distribution.  *  *   - Neither the name of Pebble nor the names of its contributors may  *     be used to endorse or promote products derived from this software  *     without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  */ import java.util.List; /**  * Helper class that implements paging over a collection.  *  * @author    Simon Brown  */ public class Pageable<T> {   /** the default page size */   public static final int DEFAULT_PAGE_SIZE = 10;   private static final int PAGE_WINDOW = 10;   /** the list over which this class is paging */   private List<T> list;   /** the page size */   private int pageSize = DEFAULT_PAGE_SIZE;   /** the current page */   private int page;   /** the starting index */   private int startingIndex;   /** the ending index */   private int endingIndex;   /** the maximum number of pages */   private int maxPages;   /**    * Creates a new instance with the specified list.    *    * @param list    a List    */   public Pageable(List<T> list) {     this.list = list;     this.page = 1;     this.maxPages = 1;     calculatePages();   }   private void calculatePages() {     if (pageSize > 0) {       // calculate how many pages there are       if (list.size() % pageSize == 0) {         maxPages = list.size() / pageSize;       } else {         maxPages = (list.size() / pageSize) + 1;       }     }   }   /**    * Gets the list that this instance is paging over.    *    * @return  a List    */   public List<T> getList() {     return this.list;   }   /**    * Gets the subset of the list for the current page.    *    * @return  a List    */   public List<T> getListForPage() {     return list.subList(startingIndex, endingIndex);   }   /**    * Gets the page size.    *    * @return  the page size as an int    */   public int getPageSize() {     return this.pageSize;   }   /**    * Sets the page size.    *    * @param pageSize   the page size as an int    */   public void setPageSize(int pageSize) {     this.pageSize = pageSize;     calculatePages();   }   /**    * Gets the page.    *    * @return  the page as an int    */   public int getPage() {     return this.page;   }   /**    * Sets the page size.    *    * @param p    the page as an int    */   public void setPage(int p) {     if (p >= maxPages) {       this.page = maxPages;     } else if (p <= 1) {       this.page = 1;     } else {       this.page = p;     }     // now work out where the sub-list should start and end     startingIndex = pageSize * (page-1);     if (startingIndex < 0) {       startingIndex = 0;     }     endingIndex = startingIndex + pageSize;     if (endingIndex > list.size()) {       endingIndex = list.size();     }   }   /**    * Gets the maximum number of pages.    *    * @return  the maximum number of pages as an int    */   public int getMaxPages() {     return this.maxPages;   }   /**    * Determines whether there is a previous page and gets the page number.    *    * @return  the previous page number, or zero    */   public int getPreviousPage() {     if (page > 1) {       return page-1;     } else {       return 0;     }   }   /**    * Determines whether there is a next page and gets the page number.    *    * @return  the next page number, or 0    */   public int getNextPage() {     if (page < maxPages) {       return page+1;     } else {       return 0;     }   }   /**    * Gets the minimum page in the window.    *    * @return  the page number    */   public int getMinPageRange() {     if (getPage() > PAGE_WINDOW) {       return getPage() - PAGE_WINDOW;     } else {       return 1;     }   }   /**    * Gets the maximum page in the window.    *    * @return  the page number    */   public int getMaxPageRange() {     if (getPage() < (getMaxPages() - PAGE_WINDOW)) {       return getPage() + PAGE_WINDOW;     } else {       return getMaxPages();     }   } }