/** * Licensed under the Artistic License; you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://displaytag.sourceforge.net/license.html * * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package org.displaytag.pagination; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.displaytag.util.Href; /** * Helper class for generation of paging banners. * @author Fabrizio Giustina * @version $Revision: 922 $ ($Author: fgiust $) */ public class Pagination { /** * logger. */ private static Log log = LogFactory.getLog(Pagination.class); /** * Base href for urls. */ private Href href; /** * page parameter name. */ private String pageParam; /** * first page. */ private Integer firstPage; /** * last page. */ private Integer lastPage; /** * previous page. */ private Integer previousPage; /** * next page. */ private Integer nextPage; /** * current page. */ private Integer currentPage; /** * List containg NumberedPage objects. * @see org.displaytag.pagination.NumberedPage */ private List pages = new ArrayList(); /** * Constructor for Pagination. * @param baseHref Href used for links * @param pageParameter name for the page parameter */ public Pagination(Href baseHref, String pageParameter) { this.href = baseHref; this.pageParam = pageParameter; } /** * Adds a page. * @param number int page number * @param isSelected is the page selected? */ public void addPage(int number, boolean isSelected) { if (log.isDebugEnabled()) { log.debug("adding page " + number); } this.pages.add(new NumberedPage(number, isSelected)); } /** * first page selected? * @return boolean */ public boolean isFirst() { return this.firstPage == null; } /** * last page selected? * @return boolean */ public boolean isLast() { return this.lastPage == null; } /** * only one page? * @return boolean */ public boolean isOnePage() { return (this.pages == null) || this.pages.size() <= 1; } /** * Gets the number of the first page. * @return Integer number of the first page */ public Integer getFirst() { return this.firstPage; } /** * Sets the number of the first page. * @param first Integer number of the first page */ public void setFirst(Integer first) { this.firstPage = first; } /** * Gets the number of the last page. * @return Integer number of the last page */ public Integer getLast() { return this.lastPage; } /** * Sets the number of the last page. * @param last Integer number of the last page */ public void setLast(Integer last) { this.lastPage = last; } /** * Gets the number of the previous page. * @return Integer number of the previous page */ public Integer getPrevious() { return this.previousPage; } /** * Sets the number of the previous page. * @param previous Integer number of the previous page */ public void setPrevious(Integer previous) { this.previousPage = previous; } /** * Gets the number of the next page. * @return Integer number of the next page */ public Integer getNext() { return this.nextPage; } /** * Sets the number of the next page. * @param next Integer number of the next page */ public void setNext(Integer next) { this.nextPage = next; } /** * Sets the number of the current page. * @param current number of the current page */ public void setCurrent(Integer current) { this.currentPage = current; } /** * Returns the appropriate banner for the pagination. * @param numberedPageFormat String to be used for a not selected page * @param numberedPageSelectedFormat String to be used for a selected page * @param numberedPageSeparator separator beetween pages * @param fullBanner String basic banner * @return String formatted banner whith pages */ public String getFormattedBanner(String numberedPageFormat, String numberedPageSelectedFormat, String numberedPageSeparator, String fullBanner) { StringBuffer buffer = new StringBuffer(100); // numbered page list Iterator pageIterator = this.pages.iterator(); while (pageIterator.hasNext()) { // get NumberedPage from iterator NumberedPage page = (NumberedPage) pageIterator.next(); Integer pageNumber = new Integer(page.getNumber()); String urlString = ((Href) this.href.clone()).addParameter(this.pageParam, pageNumber).toString(); // needed for MessageFormat : page number/url Object[] pageObjects = {pageNumber, urlString}; // selected page need a different formatter if (page.getSelected()) { buffer.append(MessageFormat.format(numberedPageSelectedFormat, pageObjects)); } else { buffer.append(MessageFormat.format(numberedPageFormat, pageObjects)); } // next? add page separator if (pageIterator.hasNext()) { buffer.append(numberedPageSeparator); } } // String for numbered pages String numberedPageString = buffer.toString(); // Object array // {0} full String for numbered pages // {1} first page url // {2} previous page url // {3} next page url // {4} last page url // {5} current page // {6} total pages Object[] pageObjects = { numberedPageString, ((Href) this.href.clone()).addParameter(this.pageParam, getFirst()), ((Href) this.href.clone()).addParameter(this.pageParam, getPrevious()), ((Href) this.href.clone()).addParameter(this.pageParam, getNext()), ((Href) this.href.clone()).addParameter(this.pageParam, getLast()), this.currentPage, this.isLast() ? this.currentPage : this.lastPage}; // this.lastPage is null if the last page is displayed // return the full banner return MessageFormat.format(fullBanner, pageObjects); } /** * @see java.lang.Object#toString() */ public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) // .append("firstPage", this.firstPage) //$NON-NLS-1$ .append("lastPage", this.lastPage) //$NON-NLS-1$ .append("currentPage", this.currentPage) //$NON-NLS-1$ .append("nextPage", this.nextPage) //$NON-NLS-1$ .append("previousPage", this.previousPage) //$NON-NLS-1$ .append("pages", this.pages) //$NON-NLS-1$ .append("href", this.href) //$NON-NLS-1$ .append("pageParam", this.pageParam) //$NON-NLS-1$ .toString(); } }