1 13 package com.tonbeller.wcf.sqltable; 14 15 import java.io.IOException ; 16 17 import javax.servlet.http.HttpServletRequest ; 18 import javax.servlet.jsp.JspException ; 19 import javax.servlet.jsp.JspWriter ; 20 import javax.servlet.jsp.jstl.sql.Result; 21 22 import org.apache.log4j.Logger; 23 24 import com.tonbeller.tbutils.res.Resources; 25 import com.tonbeller.wcf.controller.RequestContext; 26 import com.tonbeller.wcf.controller.RequestListener; 27 import com.tonbeller.wcf.expr.ExprUtils; 28 import com.tonbeller.wcf.scroller.Scroller; 29 30 34 public class SqlTablePageNavigationsTag extends SqlTableNestedTag { 35 String resultExpr; 36 private static Logger logger = Logger.getLogger(SqlTablePageNavigationsTag.class); 37 38 static abstract class PageButton implements RequestListener { 39 protected SqlTable table; 40 41 protected abstract int getStartRow(RequestContext context); 42 43 PageButton(SqlTable table) { 44 this.table = table; 45 } 46 47 public void request(RequestContext context) throws Exception { 48 Scroller.enableScroller(context); 49 int maxRows = table.getMaxRows(); 50 if (maxRows < 0) { 51 table.setStartRow(0); 53 return; 54 } 55 int startRow = getStartRow(context); 56 if (startRow < 0) 57 startRow = 0; 58 table.setStartRow(startRow); 59 } 60 } 61 62 static class PrevButton extends PageButton { 63 public PrevButton(SqlTable table) { 64 super(table); 65 } 66 67 protected int getStartRow(RequestContext context) { 68 return table.getStartRow() - table.getMaxRows(); 69 } 70 } 71 72 static class NextButton extends PageButton { 73 public NextButton(SqlTable table) { 74 super(table); 75 } 76 77 protected int getStartRow(RequestContext context) { 78 return table.getStartRow() + table.getMaxRows(); 79 } 80 } 81 82 static class GotoButton extends PageButton { 83 public GotoButton(SqlTable table) { 84 super(table); 85 } 86 87 protected int getStartRow(RequestContext context) { 88 String value = context.getParameter(table.getId() + ".goto.value"); 89 if (value == null) 90 return 0; 91 int page; 92 try { 93 page = Integer.parseInt(value); 94 } catch (NumberFormatException e) { 95 return 0; 96 } 97 return (page - 1) * table.getMaxRows(); 98 } 99 } 100 101 static class PageSizeButton implements RequestListener { 102 private SqlTable table; 103 104 PageSizeButton(SqlTable table) { 105 this.table = table; 106 } 107 108 public void request(RequestContext context) throws Exception { 109 Scroller.enableScroller(context); 110 String value = context.getParameter(table.getId() + ".size.value"); 111 if (value == null) 112 return; 113 int size; 114 try { 115 size = Integer.parseInt(value); 116 } catch (NumberFormatException e) { 117 return; 118 } 119 if (size > 0) { 120 table.setMaxRows(size); 121 table.setStartRow(0); 122 } 123 } 124 125 } 126 127 public int doStartTag() throws JspException { 128 if (!isRenderActions()) 129 return SKIP_BODY; 130 131 SqlTable table = getTable(); 132 int startRow = table.getStartRow(); 133 int maxRows = table.getMaxRows(); 134 if (maxRows <= 0) 135 return SKIP_BODY; 136 137 Resources res = getResources(); 138 String contextPath = ((HttpServletRequest ) pageContext.getRequest()).getContextPath(); 139 String tableId = table.getId(); 140 String curPage = Integer.toString(startRow / maxRows + 1); 141 String pageSize = Integer.toString(maxRows); 142 Object [] args = { contextPath, tableId, curPage, pageSize}; 143 144 boolean havePrevious = false; 145 String prevButton = ""; 146 if (table.getStartRow() > 0) { 147 prevButton = res.getString("sqltable.page.button.prev", args); 148 RequestListener r = new PrevButton(table); 149 table.addRequestListener(table.getId() + ".prev", null, r); 150 havePrevious = true; 151 } 152 153 boolean haveNext = false; 154 String nextButton = ""; 155 Result result = (Result) ExprUtils.getModelReference(pageContext, resultExpr); 156 if (result.isLimitedByMaxRows()) { 157 nextButton = res.getString("sqltable.page.button.next", args); 158 RequestListener r = new NextButton(table); 159 table.addRequestListener(table.getId() + ".next", null, r); 160 haveNext = true; 161 } 162 163 RequestListener r = new GotoButton(table); 164 table.addRequestListener(table.getId() + ".goto.button", null, r); 165 r = new PageSizeButton(table); 166 table.addRequestListener(table.getId() + ".size.button", null, r); 167 168 String show = res.getString("sqltable.page.show", args); 169 String go = res.getString("sqltable.page.goto", args); 170 String size = res.getString("sqltable.page.size", args); 171 try { 172 JspWriter out = pageContext.getOut(); 173 if (havePrevious) { 174 out.print(prevButton); 175 out.print(" "); 176 } 177 if (havePrevious || haveNext) { 178 out.print(show); 179 out.print(" "); 180 } 181 if (haveNext) { 182 out.print(nextButton); 183 out.print(" "); 184 } 185 if (havePrevious || haveNext) { 186 out.print(go); 187 out.print(" "); 188 } 189 pageContext.getOut().print(size); 190 } catch (IOException e) { 191 logger.error(null, e); 192 } 193 return SKIP_BODY; 194 } 195 196 public void setResult(String result) { 197 this.resultExpr = result; 198 } 199 } 200 | Popular Tags |