package ddth.dasp.framework.model;
import java.util.ArrayList;
import java.util.List;
/**
* Model for paginating.
*
* Explanation of {@link #urlTemplate}": {@link #urlTemplate} holds the template
* to generate the URL. It is a string with a placeholder <code>${page}</code>
* which will be replaced with the page's number. Other acceptable variances:
* <code>${pageNum}, ${pageNumber}, ${PAGE_NUM}, ${PAGE_NUMBER}</code>.
*
* @author NBThanh <btnguyen2k@gmail.com>
* @version 0.1.0
*/
public class PaginatorModel {
public final static int DEFAULT_NUM_VISIBLE_PAGES = 11;
public final static int DEFAULT_PAGE_SIZE = 10;
private int numVisiblePages = DEFAULT_NUM_VISIBLE_PAGES;
private int numEntries, pageSize = DEFAULT_PAGE_SIZE, currentPage = 1;
private String urlTemplate;
public PaginatorModel(String urlTemplate, int numEntries) {
setUrlTemplate(urlTemplate);
setNumEntries(numEntries);
}
public PaginatorModel(String urlTemplate, int numEntries, int pageSize, int currentPage,
int numVisiblePages) {
setUrlTemplate(urlTemplate);
setNumEntries(numEntries);
setPageSize(pageSize);
setCurrentPage(currentPage);
setNumVisiblePages(numVisiblePages);
}
public int getNumPages() {
int numPages = numEntries / pageSize;
return numPages * pageSize == numEntries ? numPages : numPages + 1;
}
public String getUrlForPage(int pageNum) {
String url = urlTemplate;
String sPageNum = String.valueOf(pageNum);
return url.replace("${page}", sPageNum).replace("${pageNum}", sPageNum)
.replace("${pageNumber}", sPageNum).replace("${PAGE_NUM}", sPageNum)
.replace("${PAGE_MUMBER}", sPageNum);
}
public Integer[] getVisiblePages() {
List<Integer> result = new ArrayList<Integer>();
int numPages = getNumPages();
if (numPages > numVisiblePages) {
result.add(currentPage);
// tail
for (int temp = currentPage + 1; temp <= currentPage + 2; temp++) {
if (temp <= numPages) {
result.add(temp);
}
}
if (currentPage + 2 < numPages) {
if (currentPage + 4 < numPages) {
result.add(0);
}
if (currentPage + 3 < numPages) {
result.add(numPages - 1);
}
result.add(numPages);
}
// head
for (int temp = currentPage - 1; temp >= currentPage - 2; temp--) {
if (temp >= 1) {
result.add(0, temp);
}
}
if (currentPage - 2 > 1) {
if (currentPage - 4 > 1) {
result.add(0, 0);
}
if (currentPage - 3 > 1) {
result.add(0, 2);
}
result.add(0, 1);
}
} else {
for (int i = 1; i <= numPages; i++) {
result.add(i);
}
}
return result.toArray(new Integer[0]);
}
public int getNumVisiblePages() {
return numVisiblePages;
}
public void setNumVisiblePages(int numVisiblePages) {
this.numVisiblePages = numVisiblePages;
}
public int getNumEntries() {
return numEntries;
}
public void setNumEntries(int numEntries) {
this.numEntries = numEntries;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public String getUrlTemplate() {
return urlTemplate;
}
public void setUrlTemplate(String urlTemplate) {
this.urlTemplate = urlTemplate;
}
}