package com.cfinkel.reports.valuelist; import net.mlw.vlh.web.tag.ConfigurableTag; import net.mlw.vlh.web.tag.ValueListSpaceTag; import net.mlw.vlh.web.tag.DefaultPagingTag; import net.mlw.vlh.web.util.JspUtils; import net.mlw.vlh.ValueListInfo; import javax.servlet.jsp.JspException; import javax.servlet.http.HttpServletRequest; import java.util.Map; import java.util.Locale; import java.util.HashMap; import org.springframework.context.MessageSource; import org.springframework.context.NoSuchMessageException; import com.cfinkel.reports.web.ParameterNames; /** * Generate buttons to navigate through pages of data using i18n * (internationalization). The following keys are required to be define in * message sources. * * <p> * If you like to, you can add your properties file in your locale and add this * lines of code in your language: * </p> * Summary info: * <ol> * <code> * <li>paging.text.totalRow={0} Total </li> * <li>paging.text.pageFromTotal= <b>{0}</b> of {1} page(s) </li> * </code> * </ol> * Paging info: * <ol> * <li>paging.first(off), paging.first(on)</li> * <li>paging.previous(off), paging.previous(on)</li> * <li>paging.forward(off), paging.forward(on)</li> * <li>paging.last(off), paging.last(on)</li> * <li>paging.delim</li> * <li>paging.text.totalRow</li> * <li>paging.text.pageFromTotal</li> * </ol> * Focus info: * <ol> * <li>paging.focus(on), paging.focus(off), paging.focus(disabled), * paging.focus(error)</li> * </ol> * * pictures for paging.focus * @author Matthew L. Wilson, Andrej Zachar * @version $Revision:10429 $ $Date:2006-07-26 18:00:43 -0400 (Wed, 26 Jul 2006) $ */ public class CFPagingTag extends ConfigurableTag { private int pages = 0; private boolean showSummary = false; private int page; private int total; private int qtyOnPage; private int numberOfPages; private int currentPage = 0; private int maxPage = 0; private ValueListSpaceTag _parent; private Map parameters; /** * Creates new GridTag */ public CFPagingTag() { super(); } protected ValueListInfo getValueListInfo() { return _parent.getValueList().getValueListInfo(); } /** */ public int doStartTag() throws JspException { _parent = (ValueListSpaceTag) JspUtils.getParent(this, ValueListSpaceTag.class); Locale local = _parent.getConfig().getLocaleResolver().resolveLocale( (HttpServletRequest) pageContext.getRequest()); MessageSource message = _parent.getConfig().getMessageSource(); ValueListInfo valueListInfo = getValueListInfo(); // Create a map of parameters that are used to generate the links. parameters = new HashMap(_parent.getTableInfo().getParameters()); // todo: set these correctly parameters.put(ParameterNames.sortColumn, valueListInfo.getSortingColumn()); parameters.put(ParameterNames.sortDirection, valueListInfo.getSortingDirection()); StringBuffer sb = new StringBuffer(); page = _parent.getValueList().getValueListInfo().getPagingPage(); total = _parent.getValueList().getValueListInfo() .getTotalNumberOfEntries(); qtyOnPage = _parent.getValueList().getValueListInfo() .getPagingNumberPer(); numberOfPages = _parent.getValueList().getValueListInfo() .getTotalNumberOfPages(); currentPage = (int) (page - (pages / 2)); if (currentPage < 1) { currentPage = 1; } maxPage = (currentPage - 1) + pages; if (maxPage > numberOfPages) { currentPage -= (maxPage - numberOfPages); maxPage = numberOfPages; } if (maxPage < 2) { maxPage = 0; } if (currentPage < 1) { currentPage = 1; } sb.append("\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"" + (getAttributes()==null ? "":(" "+getAttributes())) + ">\n"); sb.append(" <tr>\n"); if (showSummary == true) { sb.append(generateSumary(message, local)); sb.append(" <td align=\"right\">\n"); sb .append("\n <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" >\n"); sb.append(" <tr>\n"); } String value = null; String delim = _parent.getConfig().getDisplayHelper().help(pageContext, message.getMessage("paging.delim", null, "", local)); sb .append(generateFocusControl(_parent.getValueList() .getValueListInfo(), delim, message, local)); if (page > 1) { sb.append(" <td>[<a href=\"").append( _parent.getTableInfo().getUrl()); parameters.put(ValueListInfo.PAGING_PAGE + _parent.getTableInfo().getId(), "1"); sb.append(_parent.getConfig().getLinkEncoder().encode(pageContext, parameters)); sb.append("\">"); sb.append( value = "First") .append("</a>/</td>\n"); if (value.length() > 0 && delim.length() > 0) { sb.append(" <td>").append(delim).append("</td>\n"); } sb.append(" <td><a href=\""); sb.append(_parent.getTableInfo().getUrl()); parameters.put(ValueListInfo.PAGING_PAGE + _parent.getTableInfo().getId(), String.valueOf(page - 1)); sb.append(_parent.getConfig().getLinkEncoder().encode(pageContext, parameters)); sb.append("\">"); sb.append( value = "Previous").append("</a>]</td>\n"); if (value.length() > 0 && delim.length() > 0) { sb.append(" <td>").append(delim).append("</td>\n"); } } else { sb.append(" <td>").append("[First/").append("</td>\n"); sb.append(" <td>").append("Previous]").append("</td>\n"); } JspUtils.write(pageContext, sb.toString()); pageContext.setAttribute("page" + _parent.getTableInfo().getId(), new Integer(currentPage)); return EVAL_BODY_AGAIN; } /** * @throws JspException * @throws NoSuchMessageException */ private StringBuffer generateSumary(MessageSource message, Locale local) throws NoSuchMessageException, JspException { StringBuffer sb = new StringBuffer(); sb.append(" <td nowrap=\"true\" valign=\"top\" align=\"left\">"); sb.append(_parent.getConfig().getDisplayHelper().help(pageContext, message.getMessage("paging.text.totalRow", new Object[] { new Integer(total) }, local))); sb.append(_parent.getConfig().getDisplayHelper().help(pageContext, message.getMessage("paging.text.pageFromTotal", new Object[] { new Integer(page), new Integer(numberOfPages) }, local))); sb.append(" </td>\n"); return sb; } /** * @param local * @param message * @param delim * @throws JspException */ private StringBuffer generateFocusControl(ValueListInfo info, String delim, MessageSource message, Locale local) throws JspException { String value; StringBuffer sb = new StringBuffer(); if (info.isFocusEnabled() == true) { parameters.put(ValueListInfo.FOCUS_PROPERTY + _parent.getTableInfo().getId(), info.getFocusProperty()); if (info.getFocusValue() != null) { parameters.put(ValueListInfo.FOCUS_VALUE + _parent.getTableInfo().getId(), info.getFocusValue()); } // AAA focus error behavier HashMap focusParameters = new HashMap(parameters); if (info.getFocusStatus() != ValueListInfo.FOCUS_TOO_MANY_ITEMS) { sb.append(" <td><a href=\"").append( _parent.getTableInfo().getUrl()); focusParameters.put(ValueListInfo.DO_FOCUS + _parent.getTableInfo().getId(), info.isDoFocusAgain() ? "false" : "true"); sb.append(_parent.getConfig().getLinkEncoder().encode( pageContext, focusParameters)); sb.append("\">"); sb .append( value = _parent .getConfig() .getDisplayHelper() .help( pageContext, message .getMessage( info .isDoFocusAgain() ? "paging.focus(off)" : "paging.focus(on)", null, local))) .append("</a></td>\n"); if (value.length() > 0 && delim.length() > 0) { sb.append(" <td>").append(delim).append("</td>\n"); } } else { if (info.isFocusEnabled() == true) { sb.append(" <td>").append( _parent.getConfig().getDisplayHelper().help( pageContext, message.getMessage("paging.focus(error)", null, local))).append("</td>\n"); } } } else { sb.append(" <td>").append("</td>\n"); } return sb; } /** * @see javax.servlet.jsp.tagext.IterationTag#doAfterBody() */ public int doAfterBody() throws JspException { if (currentPage <= maxPage) { String label = getBodyContent().getString().trim(); StringBuffer sb = getRenderedContent(label); JspUtils.writePrevious(pageContext, sb.toString()); pageContext.setAttribute("page" + _parent.getTableInfo().getId(), new Integer(++currentPage)); getBodyContent().clearBody(); return EVAL_BODY_AGAIN; } else { return SKIP_BODY; } } /** * @param label */ private StringBuffer getRenderedContent(String label) { StringBuffer sb = new StringBuffer(); if (currentPage == page) { sb.append("<th>").append(label).append("</th>\n"); } else { sb.append("<td><a href=\"").append( _parent.getTableInfo().getUrl()); parameters.put(ValueListInfo.PAGING_PAGE + _parent.getTableInfo().getId(), String .valueOf(currentPage)); sb.append(_parent.getConfig().getLinkEncoder().encode( pageContext, parameters)); sb.append("\">").append(label).append("</a></td>\n"); } return sb; } /** */ public int doEndTag() throws JspException { Locale local = _parent.getConfig().getLocaleResolver().resolveLocale( (HttpServletRequest) pageContext.getRequest()); MessageSource message = _parent.getConfig().getMessageSource(); StringBuffer sb = new StringBuffer(); String value = null; String delim = _parent.getConfig().getDisplayHelper().help(pageContext, message.getMessage("paging.delim", null, local)); if (!(getBodyContent() != null && getBodyContent().getString() != null && getBodyContent() .getString().trim().length() > 0)) { while(currentPage <= maxPage) { sb.append(getRenderedContent(String.valueOf(currentPage))); currentPage++; } } if (page < numberOfPages) { sb.append(" <td>[<a href=\"").append( _parent.getTableInfo().getUrl()); parameters.put(ValueListInfo.PAGING_PAGE + _parent.getTableInfo().getId(), String.valueOf(page + 1)); sb.append(_parent.getConfig().getLinkEncoder().encode(pageContext, parameters)); sb.append("\">").append( value = "Next").append("</a>/</td>\n"); if (value.length() > 0 && delim.length() > 0) { sb.append(" <td>").append(delim).append("</td>\n"); } sb.append(" <td><a href=\"").append( _parent.getTableInfo().getUrl()); parameters.put(ValueListInfo.PAGING_PAGE + _parent.getTableInfo().getId(), String .valueOf(numberOfPages)); sb.append(_parent.getConfig().getLinkEncoder().encode(pageContext, parameters)); sb.append("\">"); sb.append("Last"); sb.append("</a>]</td>\n"); } else { sb.append(" <td>").append("[Next/").append("</td>\n"); sb.append(" <td>").append("Last]").append("</td>\n"); } sb.append(" </tr>\n"); sb.append("</table>\n"); if (showSummary == true) { sb.append(" </td>\n"); sb.append("</table>\n"); } JspUtils.write(pageContext, sb.toString()); pages = 0; showSummary = false; resetAttributes(); return SKIP_BODY; } /** * @param pages The pages to set. */ public void setPages(int pages) { this.pages = pages; } /** * @param showSummary The showSummary to set. */ public void setShowSummary(String showSummary) { this.showSummary = ("true".equalsIgnoreCase(showSummary)); } }