Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Implementation of PaginatedList backed by an ArrayList

/*  *  Copyright 2004 Clinton Begin  *  *  Licensed under the Apache License, Version 2.0 (the "License");  *  you may not use this file except in compliance with the License.  *  You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  *  Unless required by applicable law or agreed to in writing, software  *  distributed under the License is distributed on an "AS IS" BASIS,  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  *  See the License for the specific language governing permissions and  *  limitations under the License.  */ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; /**  * Implementation of PaginatedList backed by an ArrayList  *   */ public class PaginatedArrayList implements PaginatedList {   private static final ArrayList EMPTY_LIST = new ArrayList(0);   private List list;   private List page;   private int pageSize;   private int index;   /**    * @param pageSize    */   public PaginatedArrayList(int pageSize) {     this.pageSize = pageSize;     this.index = 0;     this.list = new ArrayList();     repaginate();   }   /**    * Constructor to set the initial size and the page size    *     * @param initialCapacity -    *          the initial size    * @param pageSize -    *          the page size    */   public PaginatedArrayList(int initialCapacity, int pageSize) {     this.pageSize = pageSize;     this.index = 0;     this.list = new ArrayList(initialCapacity);     repaginate();   }   /**    * Constructor to create an instance using an existing collection    *     * @param c -    *          the collection to build the instance with    * @param pageSize -    *          the page size    */   public PaginatedArrayList(Collection c, int pageSize) {     this.pageSize = pageSize;     this.index = 0;     this.list = new ArrayList(c);     repaginate();   }   private void repaginate() {     if (list.isEmpty()) {       page = EMPTY_LIST;     } else {       int start = index * pageSize;       int end = start + pageSize - 1;       if (end >= list.size()) {         end = list.size() - 1;       }       if (start >= list.size()) {         index = 0;         repaginate();       } else if (start < 0) {         index = list.size() / pageSize;         if (list.size() % pageSize == 0) {           index--;         }         repaginate();       } else {         page = list.subList(start, end + 1);       }     }   }   /* List accessors (uses page) */   public int size() {     return page.size();   }   public boolean isEmpty() {     return page.isEmpty();   }   public boolean contains(Object o) {     return page.contains(o);   }   public Iterator iterator() {     return page.iterator();   }   public Object[] toArray() {     return page.toArray();   }   public Object[] toArray(Object a[]) {     return page.toArray(a);   }   public boolean containsAll(Collection c) {     return page.containsAll(c);   }   public Object get(int index) {     return page.get(index);   }   public int indexOf(Object o) {     return page.indexOf(o);   }   public int lastIndexOf(Object o) {     return page.lastIndexOf(o);   }   public ListIterator listIterator() {     return page.listIterator();   }   public ListIterator listIterator(int index) {     return page.listIterator(index);   }   public List subList(int fromIndex, int toIndex) {     return page.subList(fromIndex, toIndex);   }   /* List mutators (uses master list) */   public boolean add(Object o) {     boolean b = list.add(o);     repaginate();     return b;   }   public boolean remove(Object o) {     boolean b = list.remove(o);     repaginate();     return b;   }   public boolean addAll(Collection c) {     boolean b = list.addAll(c);     repaginate();     return b;   }   public boolean addAll(int index, Collection c) {     boolean b = list.addAll(index, c);     repaginate();     return b;   }   public boolean removeAll(Collection c) {     boolean b = list.removeAll(c);     repaginate();     return b;   }   public boolean retainAll(Collection c) {     boolean b = list.retainAll(c);     repaginate();     return b;   }   public void clear() {     list.clear();     repaginate();   }   public Object set(int index, Object element) {     Object o = list.set(index, element);     repaginate();     return o;   }   public void add(int index, Object element) {     list.add(index, element);     repaginate();   }   public Object remove(int index) {     Object o = list.remove(index);     repaginate();     return o;   }   /* Paginated List methods */   public int getPageSize() {     return pageSize;   }   public boolean isFirstPage() {     return index == 0;   }   public boolean isMiddlePage() {     return !(isFirstPage() || isLastPage());   }   public boolean isLastPage() {     return list.size() - ((index + 1) * pageSize) < 1;   }   public boolean isNextPageAvailable() {     return !isLastPage();   }   public boolean isPreviousPageAvailable() {     return !isFirstPage();   }   public boolean nextPage() {     if (isNextPageAvailable()) {       index++;       repaginate();       return true;     } else {       return false;     }   }   public boolean previousPage() {     if (isPreviousPageAvailable()) {       index--;       repaginate();       return true;     } else {       return false;     }   }   public void gotoPage(int pageNumber) {     index = pageNumber;     repaginate();   }   public int getPageIndex() {     return index;   } } /*  * Copyright 2004 Clinton Begin  *   * Licensed under the Apache License, Version 2.0 (the "License"); you may not  * use this file except in compliance with the License. You may obtain a copy of  * the License at  *   * http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the  * License for the specific language governing permissions and limitations under  * the License.  */ /**  * Interface for lists that support paging  *   */ interface PaginatedList extends List {   /**    * Returns the maximum number of items per page    *     * @return The maximum number of items per page.    */   public int getPageSize();   /**    * Is the current page the first page?    *     * @return True if the current page is the first page or if only a single page    *         exists.    */   public boolean isFirstPage();   /**    * Is the current page a middle page (ie not first or last)?    *     * @return True if the current page is not the first or last page, and more    *         than one page exists (always returns false if only a single page    *         exists).    */   public boolean isMiddlePage();   /**    * Is the current page the last page?    *     * @return True if the current page is the last page or if only a single page    *         exists.    */   public boolean isLastPage();   /**    * Is a page available after the current page?    *     * @return True if the next page is available    */   public boolean isNextPageAvailable();   /**    * Is a page available before the current page?    *     * @return True if the previous page is available    */   public boolean isPreviousPageAvailable();   /**    * Moves to the next page after the current page. If the current page is the    * last page, wrap to the first page.    *     * @return True if the page changed    */   public boolean nextPage();   /**    * Moves to the page before the current page. If the current page is the first    * page, wrap to the last page.    *     * @return True if the page changed    */   public boolean previousPage();   /**    * Moves to a specified page. If the specified page is beyond the last page,    * wrap to the first page. If the specified page is before the first page,    * wrap to the last page.    *     * @param pageNumber    *          The page to go to    */   public void gotoPage(int pageNumber);   /**    * Returns the current page index, which is a zero based integer. All    * paginated list implementations should know what index they are on, even if    * they don't know the ultimate boundaries (min/max).    *     * @return The current page    */   public int getPageIndex(); }