001: package org.displaytag.pagination;
002:
003: import java.text.MessageFormat;
004: import java.util.ArrayList;
005: import java.util.Iterator;
006: import java.util.List;
007:
008: import org.apache.commons.lang.builder.ToStringBuilder;
009: import org.apache.commons.logging.Log;
010: import org.apache.commons.logging.LogFactory;
011: import org.displaytag.util.Href;
012: import org.displaytag.util.ShortToStringStyle;
013:
014: /**
015: * Created by IntelliJ IDEA.
016: * User: sg897500
017: * Date: Mar 24, 2005
018: * Time: 3:31:32 PM
019: * Taken from:
020: * Helper class for generation of paging banners.
021: * @author Fabrizio Giustina
022: * @version $Revision: 421 $ ($Author: sg0897500 $)
023: */
024: public class Pagination {
025:
026: /**
027: * logger.
028: */
029: private static Log log = LogFactory.getLog(Pagination.class);
030:
031: /**
032: * Base href for urls.
033: */
034: private Href href;
035:
036: /**
037: * page parameter name.
038: */
039: private String pageParam;
040:
041: /**
042: * first page.
043: */
044: private Integer firstPage;
045:
046: /**
047: * last page.
048: */
049: private Integer lastPage;
050:
051: /**
052: * previous page.
053: */
054: private Integer previousPage;
055:
056: /**
057: * next page.
058: */
059: private Integer nextPage;
060:
061: /**
062: * current page.
063: */
064: private Integer currentPage;
065:
066: /**
067: * List containg NumberedPage objects.
068: * @see org.displaytag.pagination.NumberedPage
069: */
070: private List pages = new ArrayList();
071:
072: /**
073: * Constructor for Pagination.
074: * @param baseHref Href used for links
075: * @param pageParameter name for the page parameter
076: */
077: public Pagination(Href baseHref, String pageParameter) {
078: this .href = baseHref;
079: this .pageParam = pageParameter;
080: }
081:
082: /**
083: * Adds a page.
084: * @param number int page number
085: * @param isSelected is the page selected?
086: */
087: public void addPage(int number, boolean isSelected) {
088: if (log.isDebugEnabled()) {
089: log.debug("adding page " + number);
090: }
091: this .pages.add(new NumberedPage(number, isSelected));
092: }
093:
094: /**
095: * first page selected?
096: * @return boolean
097: */
098: public boolean isFirst() {
099: return this .firstPage == null;
100: }
101:
102: /**
103: * last page selected?
104: * @return boolean
105: */
106: public boolean isLast() {
107: return this .lastPage == null;
108: }
109:
110: /**
111: * only one page?
112: * @return boolean
113: */
114: public boolean isOnePage() {
115: return (this .pages == null) || this .pages.size() <= 1;
116: }
117:
118: /**
119: * Gets the number of the first page.
120: * @return Integer number of the first page
121: */
122: public Integer getFirst() {
123: return this .firstPage;
124: }
125:
126: /**
127: * Sets the number of the first page.
128: * @param first Integer number of the first page
129: */
130: public void setFirst(Integer first) {
131: this .firstPage = first;
132: }
133:
134: /**
135: * Gets the number of the last page.
136: * @return Integer number of the last page
137: */
138: public Integer getLast() {
139: return this .lastPage;
140: }
141:
142: /**
143: * Sets the number of the last page.
144: * @param last Integer number of the last page
145: */
146: public void setLast(Integer last) {
147: this .lastPage = last;
148: }
149:
150: /**
151: * Gets the number of the previous page.
152: * @return Integer number of the previous page
153: */
154: public Integer getPrevious() {
155: return this .previousPage;
156: }
157:
158: /**
159: * Sets the number of the previous page.
160: * @param previous Integer number of the previous page
161: */
162: public void setPrevious(Integer previous) {
163: this .previousPage = previous;
164: }
165:
166: /**
167: * Gets the number of the next page.
168: * @return Integer number of the next page
169: */
170: public Integer getNext() {
171: return this .nextPage;
172: }
173:
174: /**
175: * Sets the number of the next page.
176: * @param next Integer number of the next page
177: */
178: public void setNext(Integer next) {
179: this .nextPage = next;
180: }
181:
182: /**
183: * Sets the number of the current page.
184: * @param current number of the current page
185: */
186: public void setCurrent(Integer current) {
187: this .currentPage = current;
188: }
189:
190: /**
191: * Returns the appropriate banner for the pagination.
192: * @param numberedPageFormat String to be used for a not selected page
193: * @param numberedPageSelectedFormat String to be used for a selected page
194: * @param numberedPageSeparator separator beetween pages
195: * @param fullBanner String basic banner
196: * @return String formatted banner whith pages
197: */
198: public String getFormattedBanner(String numberedPageFormat,
199: String numberedPageSelectedFormat,
200: String numberedPageSeparator, String fullBanner) {
201: StringBuffer buffer = new StringBuffer(100);
202:
203: // numbered page list
204: Iterator pageIterator = this .pages.iterator();
205:
206: while (pageIterator.hasNext()) {
207:
208: // get NumberedPage from iterator
209: NumberedPage page = (NumberedPage) pageIterator.next();
210:
211: Integer pageNumber = new Integer(page.getNumber());
212:
213: String urlString = ((Href) this .href.clone()).addParameter(
214: this .pageParam, pageNumber).toString();
215:
216: // needed for MessageFormat : page number/url
217: Object[] pageObjects = { pageNumber, urlString };
218:
219: // selected page need a different formatter
220: if (page.getSelected()) {
221: buffer.append(MessageFormat.format(
222: numberedPageSelectedFormat, pageObjects));
223: } else {
224: buffer.append(MessageFormat.format(numberedPageFormat,
225: pageObjects));
226: }
227:
228: // next? add page separator
229: if (pageIterator.hasNext()) {
230: buffer.append(numberedPageSeparator);
231: }
232: }
233:
234: // String for numbered pages
235: String numberedPageString = buffer.toString();
236:
237: // Object array
238: // {0} full String for numbered pages
239: // {1} first page url
240: // {2} previous page url
241: // {3} next page url
242: // {4} last page url
243: // {5} current page
244: // {6} total pages
245: // {7} all pages
246: Object[] pageObjects = {
247: numberedPageString,
248: ((Href) this .href.clone()).addParameter(this .pageParam,
249: getFirst()),
250: ((Href) this .href.clone()).addParameter(this .pageParam,
251: getPrevious()),
252: ((Href) this .href.clone()).addParameter(this .pageParam,
253: getNext()),
254: ((Href) this .href.clone()).addParameter(this .pageParam,
255: getLast()),
256: this .currentPage,
257: new Integer(pages.size()),
258: ((Href) this .href.clone()).addParameter(this .pageParam,
259: new Integer(-1)) };
260:
261: // return the full banner
262: return MessageFormat.format(fullBanner, pageObjects);
263: }
264:
265: /**
266: * @see java.lang.Object#toString()
267: */
268: public String toString() {
269: return new ToStringBuilder(this , ShortToStringStyle.SHORT_STYLE) //
270: .append("firstPage", this .firstPage) //$NON-NLS-1$
271: .append("lastPage", this .lastPage) //$NON-NLS-1$
272: .append("currentPage", this .currentPage) //$NON-NLS-1$
273: .append("nextPage", this .nextPage) //$NON-NLS-1$
274: .append("previousPage", this .previousPage) //$NON-NLS-1$
275: .append("pages", this .pages) //$NON-NLS-1$
276: .append("href", this .href) //$NON-NLS-1$
277: .append("pageParam", this .pageParam) //$NON-NLS-1$
278: .toString();
279: }
280: }
|