package com.revolsys.ui.html.view;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.revolsys.collection.ResultPager;
import com.revolsys.record.io.format.xml.XmlWriter;
import com.revolsys.util.HtmlAttr;
import com.revolsys.util.HtmlElem;
import com.revolsys.util.HtmlUtil;
import com.revolsys.util.UrlUtil;
/**
* @author Paul Austin
* @version 1.0
*/
public class ResultPagerView extends Element {
/** The base URL. */
private final String baseUrl;
/** The result pager. */
private final ResultPager<?> pager;
/** The parameters to include in the URLs. */
private final Map<String, Object> parameters = new HashMap<>();
/**
* Construct a new ResultPagerView.
*
* @param resultPager The result pager.
* @param newBaseUrl The base URL.
* @param newParameters The parameters to include in the URLs.
*/
public ResultPagerView(final ResultPager<?> resultPager, final String newBaseUrl,
final Map<String, Object> newParameters) {
this.pager = resultPager;
this.baseUrl = newBaseUrl;
this.parameters.putAll(newParameters);
}
/**
* Serialize a link to the specified page number title and contents.
*
* @param out The XML Writer.
* @param pageNumber The page number.
* @param title The title of the link.
* @param contents The contents of the link.
* @throws IOException If there was an exception serializing.
*/
private void pageLink(final XmlWriter out, final int pageNumber, final String title,
final String contents) {
this.parameters.put("page", String.valueOf(pageNumber));
final String url = UrlUtil.getUrl(this.baseUrl, this.parameters);
out.startTag(HtmlElem.A);
out.attribute(HtmlAttr.HREF, url);
out.attribute(HtmlAttr.TITLE, title);
out.text(contents);
out.endTag(HtmlElem.A);
}
/**
* Serialize the view.
*
* @param out The XML Writer.
*/
@Override
public final void serializeElement(final XmlWriter out) {
final int numPages = this.pager.getNumPages();
out.startTag(HtmlElem.DIV);
out.attribute(HtmlAttr.CLASS, "pager");
out.startTag(HtmlElem.TABLE);
out.attribute(HtmlAttr.CELL_SPACING, "0");
out.attribute(HtmlAttr.CELL_PADDING, "0");
out.startTag(HtmlElem.TR);
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "records");
out.text("records ");
out.text(this.pager.getStartIndex());
out.text(" - ");
out.text(this.pager.getEndIndex());
if (this.pager.getNumResults() > this.pager.getEndIndex()) {
out.text(" of ");
out.text(this.pager.getNumResults());
}
out.endTag(HtmlElem.TD);
if (numPages > 1) {
if (this.pager.isFirstPage()) {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "first");
out.entityRef("nbsp");
out.endTag(HtmlElem.TD);
} else {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "first");
pageLink(out, 1, "First Page", "<<");
out.endTag(HtmlElem.TD);
}
if (this.pager.hasPreviousPage()) {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "previous");
pageLink(out, this.pager.getPreviousPageNumber(), "Previous Page", "<");
out.endTag(HtmlElem.TD);
} else {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "previous");
out.entityRef("nbsp");
out.endTag(HtmlElem.TD);
}
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "pages");
if (numPages < 7) {
for (int pageNumber = 1; pageNumber <= numPages; pageNumber++) {
serializePageLink(out, pageNumber);
}
} else {
final int currentPageNumber = this.pager.getPageNumber();
final int fromPage = Math.max(1, Math.min(currentPageNumber - 3, numPages - 6));
final int toPage = Math.min(numPages, fromPage + 6);
if (fromPage > 1) {
HtmlUtil.serializeSpan(out, "pageGap", "...");
}
for (int pageNumber = fromPage; pageNumber <= toPage; pageNumber++) {
serializePageLink(out, pageNumber);
}
if (toPage < numPages) {
HtmlUtil.serializeSpan(out, "pageGap", "...");
}
}
out.endTag(HtmlElem.TD);
if (this.pager.hasNextPage()) {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "next");
pageLink(out, this.pager.getNextPageNumber(), "Next Page", ">");
out.endTag(HtmlElem.TD);
} else {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "next");
out.entityRef("nbsp");
out.endTag(HtmlElem.TD);
}
if (this.pager.isLastPage()) {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "last");
out.entityRef("nbsp");
out.endTag(HtmlElem.TD);
} else {
out.startTag(HtmlElem.TD);
out.attribute(HtmlAttr.CLASS, "last");
pageLink(out, numPages, "Last Page", ">>");
out.endTag(HtmlElem.TD);
}
}
out.endTag(HtmlElem.TR);
out.endTag(HtmlElem.TABLE);
out.endTag(HtmlElem.DIV);
}
/**
* Serialize a link to the specified page number.
*
* @param out The XML Writer.
* @param pageNumber The page number.
* @throws IOException If there was an exception serializing.
*/
private void serializePageLink(final XmlWriter out, final int pageNumber) {
final String contents = String.valueOf(pageNumber);
final String title = "Page " + pageNumber;
if (pageNumber == this.pager.getPageNumber()) {
HtmlUtil.serializeSpan(out, "pageNum selected", contents);
} else {
pageLink(out, pageNumber, title, contents);
}
}
}