1 18 package org.apache.beehive.netui.tags.databinding.datagrid; 19 20 import java.io.IOException ; 21 import java.io.StringWriter ; 22 import java.util.ArrayList ; 23 import javax.servlet.jsp.JspException ; 24 import javax.servlet.jsp.tagext.JspFragment ; 25 import javax.servlet.http.HttpServletRequest ; 26 27 import org.apache.beehive.netui.tags.IBehaviorConsumer; 28 import org.apache.beehive.netui.tags.IAttributeConsumer; 29 import org.apache.beehive.netui.tags.html.HtmlConstants; 30 import org.apache.beehive.netui.tags.html.IFormattable; 31 import org.apache.beehive.netui.tags.rendering.ThTag; 32 import org.apache.beehive.netui.tags.rendering.AbstractHtmlState; 33 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender; 34 import org.apache.beehive.netui.databinding.datagrid.runtime.model.cell.HeaderCellModel; 35 import org.apache.beehive.netui.databinding.datagrid.api.rendering.DataGridTagModel; 36 import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellDecorator; 37 import org.apache.beehive.netui.databinding.datagrid.api.rendering.CellModel; 38 import org.apache.beehive.netui.databinding.datagrid.runtime.rendering.cell.HeaderCellDecorator; 39 import org.apache.beehive.netui.databinding.datagrid.runtime.rendering.cell.SortedCellDecorator; 40 import org.apache.beehive.netui.databinding.datagrid.runtime.rendering.table.TableRenderer; 41 import org.apache.beehive.netui.databinding.datagrid.runtime.util.JspUtil; 42 import org.apache.beehive.netui.databinding.datagrid.runtime.util.ExtensionUtil; 43 import org.apache.beehive.netui.databinding.datagrid.api.sort.SortModel; 44 import org.apache.beehive.netui.databinding.datagrid.api.filter.FilterModel; 45 import org.apache.beehive.netui.util.Bundle; 46 47 135 public class HeaderCell 136 extends AbstractCell 137 implements IFormattable, IBehaviorConsumer, IAttributeConsumer { 138 139 private static final String TAG_NAME = "HeaderCell"; 140 private static final String ATTRIBUTE_HEADER_NAME = "header"; 141 private static final String BEHAVIOR_RENDERER_NAME = "renderer"; 142 private static final String BEHAVIOR_RENDERER_NAME_DEFAULT = "default"; 143 private static final String BEHAVIOR_RENDERER_NAME_SORT = "sort"; 144 private static final String BEHAVIOR_RENDERER_NAME_EXTENDS = "extends"; 145 146 private static final CellDecorator DECORATOR_HEADER_DEFAULT; 147 private static final CellDecorator DECORATOR_HEADER_SORTED; 148 149 static { 150 DECORATOR_HEADER_DEFAULT = new HeaderCellDecorator(); 151 DECORATOR_HEADER_SORTED = new SortedCellDecorator(DECORATOR_HEADER_DEFAULT); 152 } 153 154 private String _headerText = null; 155 private ThTag.State _cellState = new ThTag.State(); 156 private HeaderCellModel _headerCellModel = new HeaderCellModel(); 157 private CellDecorator _cellDecorator = null; 158 159 163 public String getTagName() { 164 return TAG_NAME; 165 } 166 167 179 public void setHeaderText(String headerText) { 180 _headerText = headerText; 181 } 182 183 193 public void setScopeId(String scopeId) { 194 _headerCellModel.setScopeId(scopeId); 195 } 196 197 208 public void setDisableFilterRendering(boolean disableFilterRendering) { 209 _headerCellModel.setDisableFilterRendering(disableFilterRendering); 210 } 211 212 236 public void setFilterExpression(String filterExpression) { 237 _headerCellModel.setFilterExpression(filterExpression); 238 } 239 240 255 public void setFilterAction(String filterAction) { 256 _headerCellModel.setFilterAction(filterAction); 257 } 258 259 270 public void setFilterHref(String filterHref) { 271 _headerCellModel.setFilterHref(filterHref); 272 } 273 274 285 public void setDisableSortRendering(boolean disableSortRendering) { 286 _headerCellModel.setDisableSortRendering(disableSortRendering); 287 } 288 289 306 public void setSortExpression(String sortExpression) { 307 _headerCellModel.setSortExpression(sortExpression); 308 } 309 310 321 public void setSortAction(String sortAction) { 322 _headerCellModel.setSortAction(sortAction); 323 } 324 325 336 public void setSortHref(String sortHref) { 337 _headerCellModel.setSortHref(sortHref); 338 } 339 340 346 347 355 public void setCellOnClick(String onClick) { 356 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONCLICK, onClick); 357 } 358 359 367 public void setCellOnDblClick(String onDblClick) { 368 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONDBLCLICK, onDblClick); 369 } 370 371 379 public void setCellOnKeyDown(String onKeyDown) { 380 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONKEYDOWN, onKeyDown); 381 } 382 383 391 public void setCellOnKeyUp(String onKeyUp) { 392 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONKEYUP, onKeyUp); 393 } 394 395 403 public void setCellOnKeyPress(String onKeyPress) { 404 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONKEYPRESS, onKeyPress); 405 } 406 407 415 public void setCellOnMouseDown(String onMouseDown) { 416 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONMOUSEDOWN, onMouseDown); 417 } 418 419 427 public void setCellOnMouseUp(String onMouseUp) { 428 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONMOUSEUP, onMouseUp); 429 } 430 431 439 public void setCellOnMouseMove(String onMouseMove) { 440 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONMOUSEMOVE, onMouseMove); 441 } 442 443 451 public void setCellOnMouseOut(String onMouseOut) { 452 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONMOUSEOUT, onMouseOut); 453 } 454 455 463 public void setCellOnMouseOver(String onMouseOver) { 464 _cellState.registerAttribute(AbstractHtmlState.ATTR_JAVASCRIPT, HtmlConstants.ONMOUSEOVER, onMouseOver); 465 } 466 467 475 public void setCellStyle(String style) { 476 if("".equals(style)) return; 477 478 _cellState.style = style; 479 } 480 481 489 public void setCellStyleClass(String styleClass) { 490 if("".equals(styleClass)) return; 491 492 _cellState.styleClass = styleClass; 493 } 494 495 503 public void setCellTitle(String title) { 504 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.TITLE, title); 505 } 506 507 515 public void setCellRowspan(int rowSpan) { 516 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.ROWSPAN, "" + rowSpan); 517 } 518 519 527 public void setCellColspan(int colSpan) { 528 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.COLSPAN, "" + colSpan); 529 } 530 531 540 public void setCellAlign(String align) { 541 542 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.ALIGN, align); 543 } 544 545 554 public void setCellChar(String alignChar) { 555 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.CHAR, alignChar); 556 } 557 558 567 public void setCellCharoff(String alignCharOff) { 568 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.CHAROFF, alignCharOff); 569 } 570 571 580 public void setCellValign(String align) { 581 582 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.VALIGN, align); 583 } 584 585 593 public void setCellLang(String lang) { 594 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.LANG, lang); 595 } 596 597 605 public void setCellDir(String dir) { 606 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.DIR, dir); 607 } 608 609 617 public void setCellAbbr(String abbr) { 618 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.ABBR, abbr); 619 } 620 621 629 public void setCellAxis(String axis) { 630 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.AXIS, axis); 631 } 632 633 641 public void setCellHeaders(String headers) { 642 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.HEADERS, headers); 643 } 644 645 653 public void setCellScope(String scope) { 654 _cellState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, HtmlConstants.SCOPE, scope); 655 } 656 657 666 public void setCellTagId(String tagId) 667 throws JspException { 668 applyTagId(_cellState, tagId); 669 } 670 671 688 public void setAttribute(String name, String value, String facet) throws JspException { 689 if(facet == null || facet.equals(ATTRIBUTE_HEADER_NAME)) { 690 super.addStateAttribute(_cellState, name, value); 691 } 692 else { 693 String s = Bundle.getString("Tags_AttributeFacetNotSupported", new Object []{facet}); 694 throw new JspException (s); 695 } 696 } 697 698 718 public void setBehavior(String name, Object value, String facet) throws JspException { 719 if(facet != null && facet.equals(BEHAVIOR_RENDERER_NAME)) { 720 String className = value != null ? value.toString() : null; 721 722 CellDecorator cellDecorator = (CellDecorator)ExtensionUtil.instantiateClass(className, CellDecorator.class); 723 if(name.equals(BEHAVIOR_RENDERER_NAME_EXTENDS)) { 724 cellDecorator.setNestedDecorator(getCellDecorator()); 725 } 726 else if(name.equals(BEHAVIOR_RENDERER_NAME_SORT)) { 727 cellDecorator.setNestedDecorator(DECORATOR_HEADER_SORTED); 728 } 729 730 else if(name.equals(BEHAVIOR_RENDERER_NAME_DEFAULT)) { 731 732 } 733 734 _cellDecorator = cellDecorator; 735 } 736 else { 737 String s = Bundle.getString("Tags_BehaviorFacetNotSupported", new Object []{facet}); 738 throw new JspException (s); 739 } 740 } 741 742 748 protected CellModel internalGetCellModel() { 749 return _headerCellModel; 750 } 751 752 761 protected void renderCell(AbstractRenderAppender appender) 762 throws IOException , JspException { 763 764 DataGridTagModel dataGridModel = DataGridUtil.getDataGridTagModel(getJspContext()); 765 assert dataGridModel != null; 766 767 TableRenderer tableRenderer = dataGridModel.getTableRenderer(); 768 assert tableRenderer != null; 769 770 ArrayList styleClasses = new ArrayList (); 771 772 773 FilterModel filterModel = dataGridModel.getState().getFilterModel(); 774 if(filterModel.isFiltered(_headerCellModel.getFilterExpression())) 775 styleClasses.add(dataGridModel.getStyleModel().getHeaderCellFilteredClass()); 776 777 SortModel sortModel = dataGridModel.getState().getSortModel(); 778 if(sortModel.isSorted(_headerCellModel.getSortExpression())) 779 styleClasses.add(dataGridModel.getStyleModel().getHeaderCellSortedClass()); 780 781 if(_headerCellModel.isSortable()) 782 styleClasses.add(dataGridModel.getStyleModel().getHeaderCellSortableClass()); 783 784 if(_cellState.styleClass == null) 785 styleClasses.add(dataGridModel.getStyleModel().getHeaderCellClass()); 786 else 787 styleClasses.add(_cellState.styleClass); 788 789 _cellState.styleClass = dataGridModel.getStyleModel().buildStyleClassValue(styleClasses); 790 791 JspFragment fragment = getJspBody(); 792 StringWriter sw = new StringWriter (); 793 String jspFragmentOutput = null; 794 if(fragment != null) { 795 fragment.invoke(sw); 796 jspFragmentOutput = sw.toString(); 797 } 798 799 tableRenderer.openHeaderCell(_cellState, appender); 800 renderHeaderCellContents(appender, jspFragmentOutput); 801 tableRenderer.closeHeaderCell(appender); 802 803 804 if (_cellState.id != null) { 805 HttpServletRequest request = JspUtil.getRequest(getJspContext()); 806 String script = renderNameAndId(request, _cellState, null); 807 808 if(script != null) 809 appender.append(script); 810 } 811 } 812 813 820 protected void renderHeaderCellContents(AbstractRenderAppender appender, String jspFragmentOutput) 821 throws IOException , JspException { 822 823 if(_headerText == null) { 824 appender.append(jspFragmentOutput); 825 } 826 else { 827 _headerCellModel.setDataGridTagModel(DataGridUtil.getDataGridTagModel(getJspContext())); 828 _headerCellModel.setBodyContent(jspFragmentOutput); 829 _headerCellModel.setHeaderText(_headerText); 830 831 getCellDecorator().decorate(getJspContext(), appender, _headerCellModel); 832 } 833 } 834 835 839 protected void applyAttributes() 840 throws JspException { 841 super.applyAttributes(); 842 843 if(_headerCellModel.getFilterHref() != null && _headerCellModel.getFilterAction() != null) 844 throw new JspException (Bundle.getErrorString("HeaderCell_CantSetHrefAndAction")); 845 846 if(_headerCellModel.getSortHref() != null && _headerCellModel.getSortAction() != null) 847 throw new JspException (Bundle.getErrorString("HeaderCell_CantSetSortHrefAndAction")); 848 849 if(_headerCellModel.isSortable()) { 850 if(_headerCellModel.getSortExpression() == null) 851 throw new JspException (Bundle.getErrorString("HeaderCell_CantEnableSorting")); 852 853 854 if(_headerCellModel.getSortHref() == null && _headerCellModel.getSortAction() == null) 855 _headerCellModel.setSortHref(JspUtil.getRequest(getJspContext()).getRequestURI()); 856 } 857 858 if(_headerCellModel.isFilterable()) { 859 if(_headerCellModel.getFilterExpression() == null) 860 throw new JspException (Bundle.getErrorString("HeaderCell_CantEnableFiltering")); 861 862 863 if(_headerCellModel.getFilterHref() == null && _headerCellModel.getFilterAction() == null) 864 _headerCellModel.setFilterHref(JspUtil.getRequest(getJspContext()).getRequestURI()); 865 } 866 } 867 868 872 private CellDecorator getCellDecorator() { 873 if(_cellDecorator != null) 874 return _cellDecorator; 875 else { 876 assert DECORATOR_HEADER_SORTED != null; 877 return DECORATOR_HEADER_SORTED; 878 } 879 } 880 } 881 | Popular Tags |