1 33 48 49 package com.icesoft.faces.component.datapaginator; 50 51 import com.icesoft.faces.component.ext.HtmlCommandLink; 52 import com.icesoft.faces.component.util.CustomComponentUtils; 53 import com.icesoft.faces.context.DOMContext; 54 import com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer; 55 import com.icesoft.faces.renderkit.dom_html_basic.HTML; 56 import com.icesoft.faces.renderkit.dom_html_basic.PassThruAttributeRenderer; 57 import org.w3c.dom.Element ; 58 59 import javax.faces.FacesException; 60 import javax.faces.application.Application; 61 import javax.faces.component.UIComponent; 62 import javax.faces.component.UIParameter; 63 import javax.faces.context.FacesContext; 64 import java.io.IOException ; 65 import java.util.List ; 66 import java.util.Map ; 67 68 public class DataPaginatorRenderer extends DomBasicRenderer { 69 public static final String RENDERER_TYPE = "com.icesoft.faces.DataScroller"; 70 71 protected static final String PAGE_NAVIGATION = "idx".intern(); 72 73 public boolean getRendersChildren() { 74 return true; 75 } 76 77 public void decode(FacesContext context, UIComponent component) { 78 validateParameters(context, component, DataPaginator.class); 79 Map parameter = context.getExternalContext().getRequestParameterMap(); 80 String param = (String ) parameter.get(component.getClientId(context)); 81 if (param != null && param.length() >= PAGE_NAVIGATION.length()) { 82 if (param.startsWith(PAGE_NAVIGATION)) { 83 component.queueEvent(new PaginatorActionEvent(component, 86 Integer.parseInt( 87 param 88 .substring( 89 PAGE_NAVIGATION.length(), 90 param.length())))); 91 } else { 92 component 95 .queueEvent(new PaginatorActionEvent(component, param)); 96 } 97 } 98 } 99 100 protected void setVariables(FacesContext facescontext, 101 DataPaginator scroller) throws IOException { 102 Map requestMap = facescontext.getExternalContext().getRequestMap(); 103 104 String pageCountVar = scroller.getPageCountVar(); 105 if (pageCountVar != null) { 106 int pageCount = scroller.getPageCount(); 107 requestMap.put(pageCountVar, new Integer (pageCount)); 108 } 109 String pageIndexVar = scroller.getPageIndexVar(); 110 if (pageIndexVar != null) { 111 int pageIndex = scroller.getPageIndex(); 112 if (pageIndex > scroller.getPageCount()) { 113 pageIndex = scroller.getPageCount(); 114 } 115 requestMap.put(pageIndexVar, new Integer (pageIndex)); 116 } 117 String rowsCountVar = scroller.getRowsCountVar(); 118 if (rowsCountVar != null) { 119 int rowsCount = scroller.getRowCount(); 120 requestMap.put(rowsCountVar, new Integer (rowsCount)); 121 } 122 String displayedRowsCountVar = scroller.getDisplayedRowsCountVar(); 123 if (displayedRowsCountVar != null) { 124 int displayedRowsCount = scroller.getRows(); 125 int max = scroller.getRowCount() - scroller.getFirstRow(); 126 if (displayedRowsCount > max) { 127 displayedRowsCount = max; 128 } 129 requestMap.put(displayedRowsCountVar, 130 new Integer (displayedRowsCount)); 131 } 132 String firstRowIndexVar = scroller.getFirstRowIndexVar(); 133 if (firstRowIndexVar != null) { 134 int firstRowIndex = scroller.getFirstRow(); 135 if (scroller.getRowCount() > 0) { 136 firstRowIndex += 1; 137 } 138 requestMap.put(firstRowIndexVar, new Integer (firstRowIndex)); 139 } 140 String lastRowIndexVar = scroller.getLastRowIndexVar(); 141 if (lastRowIndexVar != null) { 142 int lastRowIndex = scroller.getFirstRow() + scroller.getRows(); 143 int count = scroller.getRowCount(); 144 if (lastRowIndex > count) { 145 lastRowIndex = count; 146 } 147 requestMap.put(lastRowIndexVar, new Integer (lastRowIndex)); 148 } 149 } 150 151 public void removeVariables(FacesContext facescontext, 152 UIComponent uiComponent) throws IOException { 153 DataPaginator scroller = (DataPaginator) uiComponent; 154 Map requestMap = facescontext.getExternalContext().getRequestMap(); 155 156 String pageCountVar = scroller.getPageCountVar(); 157 if (pageCountVar != null) { 158 requestMap.remove(pageCountVar); 159 } 160 String pageIndexVar = scroller.getPageIndexVar(); 161 if (pageIndexVar != null) { 162 requestMap.remove(pageIndexVar); 163 } 164 String rowsCountVar = scroller.getRowsCountVar(); 165 if (rowsCountVar != null) { 166 requestMap.remove(rowsCountVar); 167 } 168 String displayedRowsCountVar = scroller.getDisplayedRowsCountVar(); 169 if (displayedRowsCountVar != null) { 170 requestMap.remove(displayedRowsCountVar); 171 } 172 String firstRowIndexVar = scroller.getFirstRowIndexVar(); 173 if (firstRowIndexVar != null) { 174 requestMap.remove(firstRowIndexVar); 175 } 176 String lastRowIndexVar = scroller.getLastRowIndexVar(); 177 if (lastRowIndexVar != null) { 178 requestMap.remove(lastRowIndexVar); 179 } 180 } 181 182 public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) 183 throws IOException { 184 validateParameters(facesContext, uiComponent, DataPaginator.class); 185 DataPaginator scroller = (DataPaginator) uiComponent; 186 if (!scroller.isModelResultSet()) { 187 super.encodeBegin(facesContext, uiComponent); 188 189 List kids = scroller.getChildren(); 191 for (int i = 0; i < kids.size(); i++) { 192 UIComponent kid = (UIComponent) kids.get(i); 193 if (!kid.getFamily().equalsIgnoreCase("javax.faces.Output")) { 195 scroller.getChildren().remove(kids.get(i)); 196 } 197 } 198 scroller.getUIData().setValue(null); 200 scroller.getUIData().setRowIndex(-1); 201 setVariables(facesContext, scroller); 202 } 203 } 204 205 public void encodeChildren(FacesContext facescontext, 206 UIComponent uicomponent) throws IOException { 207 validateParameters(facescontext, uicomponent, DataPaginator.class); 208 DataPaginator scroller = (DataPaginator) uicomponent; 209 if (!scroller.isModelResultSet()) { 210 boolean singlePageScroller = scroller.getPageCount() <= 1 && 211 scroller.getRowsCountVar() == null && 212 scroller.getDisplayedRowsCountVar() == 213 null; 214 if (!singlePageScroller) { 215 CustomComponentUtils.renderChildren(facescontext, uicomponent); 216 } 217 } 218 } 219 220 public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) 221 throws IOException { 222 validateParameters(facesContext, uiComponent, DataPaginator.class); 223 DataPaginator scroller = (DataPaginator) uiComponent; 224 if (scroller.getUIData() == null) { 225 return; 226 } 227 renderScroller(facesContext, uiComponent); 228 if (!scroller.isModelResultSet()) { 229 removeVariables(facesContext, uiComponent); 230 } 231 } 232 233 234 protected void renderScroller(FacesContext facesContext, 235 UIComponent uiComponent) throws IOException { 236 DataPaginator scroller = (DataPaginator) uiComponent; 237 if (!scroller.isModelResultSet()) { 238 if (!scroller.isRenderFacetsIfSinglePage() && 239 scroller.getPageCount() <= 1) { 240 return; 241 } 242 } 243 if (scroller.getFacets().size() <= 0) { 244 return; 245 } 246 247 DOMContext domContext = 248 DOMContext.attachDOMContext(facesContext, scroller); 249 if (!domContext.isInitialized()) { 250 Element table = domContext.createRootElement(HTML.TABLE_ELEM); 251 setRootElementId(facesContext, table, scroller); 252 if (PassThruAttributeRenderer.passThruAttributeExists(scroller)) { 253 PassThruAttributeRenderer 254 .renderAttributes(facesContext, scroller, null); 255 } 256 } 257 Element table = (Element ) domContext.getRootNode(); 258 DOMContext.removeChildren(table); 259 260 Element tr = domContext.createElement(HTML.TR_ELEM); 261 table.appendChild(tr); 262 Element td; 263 264 String styleClass = scroller.getStyleClass(); 265 table.setAttribute(HTML.CLASS_ATTR, styleClass); 266 267 String style = scroller.getStyle(); 268 if(style != null && style.length() > 0) 269 table.setAttribute(HTML.STYLE_ATTR, style); 270 else 271 table.removeAttribute(HTML.STYLE_ATTR); 272 String scrollButtonCellClass = scroller.getscrollButtonCellClass(); 273 274 UIComponent facetComp = scroller.getFirst(); 275 if (facetComp != null) { 276 td = domContext.createElement(HTML.TD_ELEM); 277 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 278 tr.appendChild(td); 279 domContext.setCursorParent(td); 280 domContext.streamWrite(facesContext, uiComponent, 281 domContext.getRootNode(), td); 282 renderFacet(facesContext, scroller, facetComp, 283 DataPaginator.FACET_FIRST); 284 } 285 286 facetComp = scroller.getFastRewind(); 287 if (facetComp != null) { 288 if (scroller.isVertical()) { 289 tr = domContext.createElement(HTML.TR_ELEM); 290 table.appendChild(tr); 291 } 292 td = domContext.createElement(HTML.TD_ELEM); 293 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 294 tr.appendChild(td); 295 domContext.setCursorParent(td); 296 domContext.streamWrite(facesContext, uiComponent, 297 domContext.getRootNode(), td); 298 renderFacet(facesContext, scroller, facetComp, 299 DataPaginator.FACET_FAST_REWIND); 300 } 301 302 facetComp = scroller.getPrevious(); 303 if (facetComp != null) { 304 if (scroller.isVertical()) { 305 tr = domContext.createElement(HTML.TR_ELEM); 306 table.appendChild(tr); 307 } 308 td = domContext.createElement(HTML.TD_ELEM); 309 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 310 tr.appendChild(td); 311 domContext.setCursorParent(td); 312 domContext.streamWrite(facesContext, uiComponent, 313 domContext.getRootNode(), td); 314 renderFacet(facesContext, scroller, facetComp, 315 DataPaginator.FACET_PREVIOUS); 316 } 317 if (!scroller.isModelResultSet() && scroller.isPaginator()) { 318 if (scroller.isVertical()) { 319 tr = domContext.createElement(HTML.TR_ELEM); 320 table.appendChild(tr); 321 } 322 td = domContext.createElement(HTML.TD_ELEM); 323 tr.appendChild(td); 324 Element paginatorTable = domContext.createElement(HTML.TABLE_ELEM); 325 td.appendChild(paginatorTable); 326 renderPaginator(facesContext, uiComponent, paginatorTable, 327 domContext); 328 } 329 facetComp = scroller.getNext(); 330 if (facetComp != null) { 331 if (scroller.isVertical()) { 332 tr = domContext.createElement(HTML.TR_ELEM); 333 table.appendChild(tr); 334 } 335 td = domContext.createElement(HTML.TD_ELEM); 336 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 337 tr.appendChild(td); 338 domContext.setCursorParent(td); 339 domContext.streamWrite(facesContext, uiComponent, 340 domContext.getRootNode(), td); 341 renderFacet(facesContext, scroller, facetComp, 342 DataPaginator.FACET_NEXT); 343 } 344 345 facetComp = scroller.getFastForward(); 346 if (facetComp != null) { 347 if (scroller.isVertical()) { 348 tr = domContext.createElement(HTML.TR_ELEM); 349 table.appendChild(tr); 350 } 351 td = domContext.createElement(HTML.TD_ELEM); 352 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 353 tr.appendChild(td); 354 domContext.setCursorParent(td); 355 domContext.streamWrite(facesContext, uiComponent, 356 domContext.getRootNode(), td); 357 renderFacet(facesContext, scroller, facetComp, 358 DataPaginator.FACET_FAST_FORWARD); 359 } 360 361 facetComp = scroller.getLast(); 362 if (facetComp != null) { 363 if (scroller.isVertical()) { 364 tr = domContext.createElement(HTML.TR_ELEM); 365 table.appendChild(tr); 366 } 367 td = domContext.createElement(HTML.TD_ELEM); 368 td.setAttribute(HTML.CLASS_ATTR, scrollButtonCellClass); 369 tr.appendChild(td); 370 domContext.setCursorParent(td); 371 domContext.streamWrite(facesContext, uiComponent, 372 domContext.getRootNode(), td); 373 renderFacet(facesContext, scroller, facetComp, 374 DataPaginator.FACET_LAST); 375 } 376 domContext.stepOver(); 377 domContext.streamWrite(facesContext, uiComponent); 378 } 379 380 protected void renderFacet(FacesContext facesContext, 381 DataPaginator scroller, 382 UIComponent facetComp, String facetName) 383 throws IOException { 384 HtmlCommandLink link = 385 (HtmlCommandLink) getLink(facesContext, scroller, facetName); 386 387 if (scroller.isDisabled() || 388 (!scroller.isModelResultSet() && scroller.getPageCount() <= 1)) { 389 link.setDisabled(true); 390 } else { 391 link.setDisabled(false); 392 } 393 394 link.encodeBegin(facesContext); 395 facetComp.encodeBegin(facesContext); 396 if (facetComp.getRendersChildren()) { 397 facetComp.encodeChildren(facesContext); 398 } 399 facetComp.encodeEnd(facesContext); 400 link.encodeEnd(facesContext); 401 } 402 403 protected void renderPaginator(FacesContext facesContext, 404 UIComponent uiComponent, 405 Element paginatorTable, 406 DOMContext domContext) throws IOException { 407 DataPaginator scroller = (DataPaginator) uiComponent; 408 int maxPages = scroller.getPaginatorMaxPages(); 409 if (maxPages <= 1) { 410 maxPages = 2; 411 } 412 int pageCount = scroller.getPageCount(); 413 if (pageCount <= 1) { 414 return; 415 } 416 int pageIndex = scroller.getPageIndex(); 417 if (pageIndex > pageCount) { 418 pageIndex = pageCount; 419 } 420 int delta = maxPages / 2; 421 int pages; 422 int start; 423 if (pageCount > maxPages && pageIndex > delta) { 424 pages = maxPages; 425 start = pageIndex - pages / 2 - 1; 426 if (start + pages > pageCount) { 427 start = pageCount - pages; 428 } 429 } else { 430 pages = pageCount < maxPages ? pageCount : maxPages; 431 start = 0; 432 } 433 String styleClass = scroller.getPaginatorTableClass(); 434 paginatorTable.setAttribute(HTML.CLASS_ATTR, styleClass); 435 436 Element tr = null; 437 if (!scroller.isVertical()) { 438 tr = domContext.createElement(HTML.TR_ELEM); 439 paginatorTable.appendChild(tr); 440 } 441 Element td; 442 UIComponent form = findForm(scroller); 443 String formId = null; 444 if (form == null) { 445 throw new FacesException("Form tag is missing"); 446 } else { 447 formId = form.getClientId(facesContext); 448 } 449 for (int i = start, size = start + pages; i < size; i++) { 450 int idx = i + 1; 451 if (scroller.isVertical()) { 452 tr = domContext.createElement(HTML.TR_ELEM); 453 paginatorTable.appendChild(tr); 454 } 455 td = domContext.createElement(HTML.TD_ELEM); 456 tr.appendChild(td); 457 domContext.setCursorParent(td); 458 String cStyleClass; 459 460 if (idx == pageIndex) { 461 cStyleClass = scroller.getPaginatorActiveColumnClass(); 462 463 } else { 464 cStyleClass = scroller.getPaginatorColumnClass(); 465 466 } 467 if (cStyleClass != null) { 468 td.setAttribute(HTML.CLASS_ATTR, cStyleClass); 469 } 470 471 Element link = getLink(facesContext, domContext, scroller, 472 Integer.toString(idx), idx, formId); 473 td.appendChild(link); 474 } 475 } 476 477 protected Element getLink(FacesContext facesContext, DOMContext domContext, 478 DataPaginator scroller, 479 String text, int pageIndex, String formId) { 480 481 Element link = domContext.createElement(HTML.ANCHOR_ELEM); 482 if (text != null) { 483 link.appendChild(domContext.createTextNode(text)); 484 } 485 String linkid = scroller.getClientId(facesContext) + 486 DataPaginatorRenderer.PAGE_NAVIGATION + 487 Integer.toString(pageIndex); 488 String onClick = "document.forms['" + formId + "']['" + 490 scroller.getClientId(facesContext) + "'].value='" + 491 DataPaginatorRenderer.PAGE_NAVIGATION + text + "'" + 492 ";iceSubmit(" + " document.forms['" + formId + "']," + 493 " this,event); " + "return false;"; 494 link.setAttribute(HTML.ID_ATTR, linkid); 495 if (scroller.isDisabled()) { 496 link.removeAttribute(HTML.ONCLICK_ATTR); 497 } else { 498 link.setAttribute(HTML.ONCLICK_ATTR, onClick); 499 } 500 link.setAttribute(HTML.HREF_ATTR, "#"); 501 PassThruAttributeRenderer.renderOnFocus(scroller, link); 502 PassThruAttributeRenderer.renderOnBlur(link); 503 return link; 504 } 505 506 protected HtmlCommandLink getLink(FacesContext facesContext, 507 DataPaginator scroller, 508 String facetName) { 509 Application application = facesContext.getApplication(); 510 511 HtmlCommandLink link = (HtmlCommandLink) application 512 .createComponent(HtmlCommandLink.COMPONENT_TYPE); 513 link.setId(scroller.getId() + facetName); 514 link.setTransient(true); 515 UIParameter parameter = (UIParameter) application 516 .createComponent(UIParameter.COMPONENT_TYPE); 517 parameter.setId(scroller.getId() + facetName + "_param"); 518 parameter.setTransient(true); 519 parameter.setName(scroller.getClientId(facesContext)); 520 parameter.setValue(facetName); 521 List children = link.getChildren(); 522 children.add(parameter); 523 scroller.getChildren().add(link); 524 return link; 525 } 526 } 527 | Popular Tags |