/*
* 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();
}