package cn.newgxu.bbs.common;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @author polly
* @since 4.0.0
* @version $Revision 1.1$
*/
public class Pagination {
private static final Log log = LogFactory.getLog(Pagination.class);
private int offset = 5;
private int page = 1;
private int pageSize = Constants.DEFAULT_PAGE_SIZE;
private int maxPage = 1;
private int recordSize = 0;
private String queryString = null;
private String actionName = null;
private String requestString = null;
private Map<String, String[]> paramMap = new HashMap<String, String[]>();
public Pagination() {
// if (log.isDebugEnabled()) {
// log.debug("Pagination=" + super.toString());
// }
}
public Pagination(int page) {
this();
setPage(page);
}
public Pagination(int page, int pageSize) {
this(page);
setPageSize(pageSize);
}
public Pagination(int page, int pageSize, int recordSize) {
this(page, pageSize);
this.recordSize = recordSize;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public String getActionName() {
if (this.actionName == null) {
this.actionName = "/";
}
return this.actionName;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int size) {
if (size >= 1 && size <= Constants.DEFAULT_MAX_SIZE) {
this.pageSize = size;
}
}
public int getFirst() {
return (page - 1) * pageSize;
}
public int getPage() {
if (this.page > getMaxPage()) {
this.page = getMaxPage();
}
return page;
}
public void setPage(int page) {
if (page < 1) {
page = 1;
}
this.page = page;
}
public int getMaxPage() {
this.maxPage = recordSize / pageSize;
if (recordSize % pageSize > 0) {
this.maxPage++;
}
this.maxPage = this.maxPage < 1 ? 1 : this.maxPage;
return this.maxPage;
}
// public void setMaxPage(int maxPage) {
// this.maxPage = maxPage;
// }
public int getRecordSize() {
return recordSize;
}
public void setRecordSize(int recordSize) {
this.recordSize = recordSize;
}
public Map<String, String[]> getParamMap() {
return paramMap;
}
public void setParamMap(Map<String, String[]> paramMap) {
this.paramMap = paramMap;
}
public void addParam(String paramName, String[] paramValues) {
this.paramMap.put(paramName, paramValues);
}
public void addParam(String paramName, String paramValue) {
addParam(paramName, new String[] { paramValue });
}
public boolean isFirstPage() {
return (this.page == 1);
}
public boolean isLastPage() {
return (this.page >= getMaxPage());
}
public boolean hasNextPage() {
return !isLastPage();
}
public boolean hasPrevPage() {
return !isFirstPage();
}
public boolean hasResult() {
return recordSize > 0;
}
public String getQueryString() {
if (this.queryString == null) {
StringBuffer sb = new StringBuffer("");
if (paramMap != null && paramMap.size() > 0) {
for (Iterator<String> iter = paramMap.keySet().iterator(); iter
.hasNext();) {
String key = iter.next();
String[] values = paramMap.get(key);
for (int i = 0; i < values.length; i++) {
if (!"page".equals(key)) {
try {
sb.append(key).append("=").append(
URLEncoder.encode(values[i], "UTF-8"))
.append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
}
this.queryString = sb.toString();
}
return this.queryString;
}
public String getRequestString() {
if (this.requestString == null) {
StringBuffer sb = new StringBuffer("");
sb.append(getActionName()).append("?").append(getQueryString());
this.requestString = sb.toString();
}
return this.requestString;
}
public String getPageToDisplay() {
// 如果没有结果,则不显示任何东西
if (!hasResult()) {
if (log.isDebugEnabled()) {
log.debug("没有结果。recordsize=" + recordSize);
}
return "";
}
int maxPage = getMaxPage();
StringBuffer sb = new StringBuffer();
if (isFirstPage()) {
sb.append("<span class=\"nextprev\">上一页 </span>");
} else {
sb.append("<a class=\"nextprev\" href='")
.append(getRequestString()).append("page=").append(
this.page - 1).append("'>").append("上一页 ").append(
"</a>");
}
if (page - offset < 2) {
// 1 2 3 4 page
for (int i = 1; i < page; i++) {
sb.append("<a href='").append(getRequestString()).append(
"page=").append(i).append("'>").append(" " + i + " ")
.append("</a>");
}
} else {
// 1...3 4 5 6 page
sb.append("<a href='").append(getRequestString()).append("page=")
.append(1).append("'>").append(" " + 1 + " ").append(
"</a>");
sb.append("...");
for (int i = page - offset; i < page; i++) {
sb.append("<a href='").append(getRequestString()).append(
"page=").append(i).append("'>").append(" " + i + " ")
.append("</a>");
}
}
sb.append("<span class=\"current\">").append(" " + page + " ")
.append("</span>");
if (page + offset + 1 > maxPage) {
// page 7 8 9
for (int i = page + 1; i <= maxPage; i++) {
sb.append("<a href='").append(getRequestString()).append(
"page=").append(i).append("'>").append(" " + i + " ")
.append("</a>");
}
} else {
// page 7 8 9 10 ... 100
for (int i = page + 1; i <= page + offset; i++) {
sb.append("<a href='").append(getRequestString()).append(
"page=").append(i).append("'>").append(" " + i + " ")
.append("</a>");
}
sb.append("<span class=\"break\">...</span>");
sb.append("<a href='").append(getRequestString()).append("page=")
.append(maxPage).append("'>").append(" " + maxPage + " ")
.append("</a>");
}
if (isLastPage()) {
sb.append("<span class=\"nextprev\"> 下一页</span>");
} else {
sb.append("<a class=\"nextprev\" href='")
.append(getRequestString()).append("page=").append(
this.page + 1).append("'>").append(" 下一页").append(
"</a>");
}
return sb.toString();
}
public String toString() {
return this.getPageToDisplay();
}
}