1 18 package org.apache.beehive.netui.tags.tree; 19 20 import org.apache.beehive.netui.util.internal.InternalStringBuilder; 21 22 import org.apache.beehive.netui.pageflow.requeststate.INameable; 23 import org.apache.beehive.netui.pageflow.requeststate.NameService; 24 import org.apache.beehive.netui.script.ExpressionUpdateException; 25 import org.apache.beehive.netui.script.IllegalExpressionException; 26 import org.apache.beehive.netui.tags.*; 27 import org.apache.beehive.netui.tags.html.HtmlConstants; 28 import org.apache.beehive.netui.tags.javascript.CoreScriptFeature; 29 import org.apache.beehive.netui.tags.javascript.IScriptReporter; 30 import org.apache.beehive.netui.tags.javascript.ScriptRequestState; 31 import org.apache.beehive.netui.tags.rendering.AbstractHtmlState; 32 import org.apache.beehive.netui.tags.rendering.DivTag; 33 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender; 34 import org.apache.beehive.netui.tags.rendering.TagRenderingBase; 35 import org.apache.beehive.netui.util.Bundle; 36 37 import javax.servlet.http.HttpServletRequest ; 38 import javax.servlet.http.HttpServletResponse ; 39 import javax.servlet.jsp.JspException ; 40 import javax.servlet.jsp.PageContext ; 41 import java.io.IOException ; 42 43 44 106 public class Tree extends AbstractSimpleTag implements HtmlConstants, 107 IAttributeConsumer, IErrorCollector 108 { 109 113 private TreeElement _rootNode = null; 114 115 private TreeRenderState _trs; 116 117 private String _treeStyle; private String _treeStyleClass; 121 private InternalStringBuilder _errorText; 123 private String _dataSource = null; private boolean _renderTagIdLookup = false; 126 private InheritableState _iState = new InheritableState(); 127 private String _rootNodeCollapsedImage; 128 private String _rootNodeExpandedImage; 129 130 private DivTag.State _divState = new DivTag.State(); 133 134 private ExpressionHandling _expr; 135 136 public Tree() 137 { 138 _trs = new TreeRenderState(); 139 _iState.initalizeTreeState(); 140 } 141 142 145 public String getTagName() 146 { 147 return "Tree"; 148 } 149 150 160 public void setExpansionAction(String action) 161 throws JspException  162 { 163 _iState.setExpansionAction(setRequiredValueAttribute(action, "expansionAction")); 164 } 165 166 176 public void setSelectionAction(String action) 177 throws JspException  178 { 179 _iState.setSelectionAction(setRequiredValueAttribute(action, "selectionAction")); 180 } 181 182 187 public String getSelectionAction() 188 { 189 return _iState.getSelectionAction(); 190 } 191 192 202 public void setSelectionTarget(String target) 203 { 204 _iState.setSelectionTarget(setNonEmptyValueAttribute(target)); 205 } 206 207 208 219 public void setTagId(String tagId) 220 throws JspException  221 { 222 _trs.tagId = setRequiredValueAttribute(tagId, "tagId"); 223 } 224 225 236 public void setLastNodeExpandedImage(String lastNodeExpandedImage) 237 { 238 String val = setNonEmptyValueAttribute(lastNodeExpandedImage); 239 if (val != null) 240 _iState.setLastNodeExpandedImage(setNonEmptyValueAttribute(val)); 241 } 242 243 255 public void setNodeExpandedImage(String nodeExpandedImage) 256 { 257 String val = setNonEmptyValueAttribute(nodeExpandedImage); 258 if (val != null) 259 _iState.setNodeExpandedImage(setNonEmptyValueAttribute(val)); 260 } 261 262 274 public void setLastNodeCollapsedImage(String lastNodeCollapsedImage) 275 { 276 String val = setNonEmptyValueAttribute(lastNodeCollapsedImage); 277 if (val != null) 278 _iState.setLastNodeCollapsedImage(setNonEmptyValueAttribute(val)); 279 } 280 281 293 public void setNodeCollapsedImage(String nodeCollapsedImage) 294 { 295 String val = setNonEmptyValueAttribute(nodeCollapsedImage); 296 if (val != null) 297 _iState.setNodeCollapsedImage(setNonEmptyValueAttribute(val)); 298 } 299 300 311 public void setLastLineJoinImage(String lastLineJoinImage) 312 { 313 String val = setNonEmptyValueAttribute(lastLineJoinImage); 314 if (val != null) 315 _iState.setLastLineJoinImage(setNonEmptyValueAttribute(val)); 316 } 317 318 329 public void setItemIcon(String itemIcon) 330 { 331 String val = setNonEmptyValueAttribute(itemIcon); 332 if (val != null) 333 _iState.setItemIcon(setNonEmptyValueAttribute(val)); 334 } 335 336 347 public void setLineJoinImage(String lineJoinImage) 348 { 349 String val = setNonEmptyValueAttribute(lineJoinImage); 350 if (val != null) 351 _iState.setLineJoinImage(setNonEmptyValueAttribute(val)); 352 } 353 354 365 public void setVerticalLineImage(String verticalLineImage) 366 { 367 String val = setNonEmptyValueAttribute(verticalLineImage); 368 if (val != null) 369 _iState.setVerticalLineImage(setNonEmptyValueAttribute(val)); 370 } 371 372 385 public void setImageRoot(String imageRoot) 386 { 387 _iState.setImageRoot(setNonEmptyValueAttribute(imageRoot)); 388 } 389 390 402 public void setIconRoot(String iconRoot) 403 { 404 _iState.setIconRoot(iconRoot); 405 } 406 407 418 public void setRootNodeCollapsedImage(String rootNodeCollapsedImage) 419 { 420 _rootNodeCollapsedImage = setNonEmptyValueAttribute(rootNodeCollapsedImage); 421 } 422 423 434 public void setRootNodeExpandedImage(String rootNodeExpandedImage) 435 { 436 _rootNodeExpandedImage = setNonEmptyValueAttribute(rootNodeExpandedImage); 437 } 438 439 453 public void setRunAtClient(boolean runAtClient) 454 { 455 _trs.runAtClient = runAtClient; 456 } 457 458 468 public void setEscapeForHtml(boolean htmlEscape) 469 { 470 _trs.escapeContent = htmlEscape; 471 } 472 473 484 public void setRenderTagIdLookup(boolean renderTagIdLookup) 485 { 486 _renderTagIdLookup = renderTagIdLookup; 487 } 488 489 493 public void setRootNode(TreeElement rootNode) 494 { 495 _rootNode = rootNode; 496 if (rootNode.getName() == null) { 497 rootNode.setName("0"); 498 } 499 } 500 501 505 public TreeElement getRootNode() 506 { 507 return _rootNode; 508 } 509 510 522 public void setSelectedStyle(String selectedStyle) 523 { 524 _trs.selectedStyle = setNonEmptyValueAttribute(selectedStyle); 525 } 526 527 539 540 public void setDisabledStyleClass(String disableStyleClass) 541 { 542 _trs.disabledStyleClass = setNonEmptyValueAttribute(disableStyleClass); 543 } 544 545 557 public void setDisabledStyle(String disabledStyle) 558 { 559 _trs.disabledStyle = setNonEmptyValueAttribute(disabledStyle); 560 } 561 562 574 public void setSelectedStyleClass(String selectedStyleClass) 575 { 576 _trs.selectedStyleClass = setNonEmptyValueAttribute(selectedStyleClass); 577 } 578 579 591 public void setUnselectedStyle(String unselectedStyle) 592 { 593 _trs.unselectedStyle = setNonEmptyValueAttribute(unselectedStyle); 594 } 595 596 608 public void setUnselectedStyleClass(String unselectedStyleClass) 609 { 610 _trs.unselectedStyleClass = setNonEmptyValueAttribute(unselectedStyleClass); 611 } 612 613 622 public void setTreeStyle(String treeStyle) 623 { 624 _treeStyle = setNonEmptyValueAttribute(treeStyle); 625 } 626 627 637 public void setTreeStyleClass(String treeStyleClass) 638 { 639 _treeStyleClass = setNonEmptyValueAttribute(treeStyleClass); 640 } 641 642 658 public void setDataSource(String dataSource) 659 { 660 _dataSource = dataSource; 661 } 662 663 674 public void setAttribute(String name, String value, String facet) 675 throws JspException  676 { 677 if (name == null || name.length() <= 0) { 679 String s = Bundle.getString("Tags_AttributeNameNotSet"); 680 registerTagError(s, null); 681 return; 682 } 683 if (name != null && (name.equals("netui:treeName"))) { 685 String s = Bundle.getString("Tags_AttributeMayNotBeSet", new Object []{name}); 686 registerTagError(s, null); 687 return; 688 } 689 690 _divState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, name, value); 691 } 692 693 697 public void doTag() 698 throws JspException , IOException  699 { 700 if (hasErrors()) { 701 reportErrors(); 702 return; 703 } 704 705 _expr = new ExpressionHandling(this); 707 TreeElement root = null; 708 try { 709 root = getTreeRoot(_expr); 710 } 711 catch (IllegalExpressionException iee) { 712 String s = Bundle.getString("TreeRootError", new Object []{_dataSource, iee.getMessage()}); 713 registerTagError(s, null); 714 return; 715 } 716 if (hasErrors()) { 717 reportErrors(); 718 return; 719 } 720 721 if (root == null) { 724 getBufferBody(false); 725 726 if (_errorText != null) { 729 write(_errorText.toString()); 730 if (hasErrors()) 731 reportErrors(); 732 } 733 } 734 735 PageContext pageContext = getPageContext(); 737 if (_iState.getImageRoot() == null) 738 _iState.setImageRoot(((HttpServletRequest ) pageContext.getRequest()).getContextPath() + "/" + 739 TagConfig.getTreeImageLocation()); 740 741 TreeElement treeRoot = getTreeRoot(_expr); 743 744 if (treeRoot == null) { 747 if (_rootNode != null) { 748 try { 749 String datasource = "{" + _dataSource + "}"; 750 _expr.updateExpression(datasource, _rootNode, pageContext); 751 } 752 catch (ExpressionUpdateException e) { 753 String s = Bundle.getString("Tags_UnableToWriteTree", new Object []{_dataSource, e.getMessage()}); 754 registerTagError(s, null); 755 reportErrors(); 756 return; 757 } 758 treeRoot = _rootNode; 759 } 760 761 if (treeRoot == null) { 763 String s = Bundle.getString("Tags_TreeNoAttribute", _dataSource); 764 registerTagError(s, null); 765 reportErrors(); 766 return; 767 } 768 769 } 770 771 if (treeRoot instanceof ITreeRootElement) { 773 ITreeRootElement tre = (ITreeRootElement) treeRoot; 774 if (tre.getRootNodeExpandedImage() == null) { 775 tre.setRootNodeExpandedImage((_rootNodeExpandedImage != null) ? 776 _rootNodeExpandedImage : InheritableState.IMAGE_ROOT_EXPANDED); 777 } 778 if (tre.getRootNodeCollapsedImage() == null) { 779 tre.setRootNodeCollapsedImage((_rootNodeCollapsedImage != null) ? 780 _rootNodeCollapsedImage : InheritableState.IMAGE_ROOT_COLLAPSED); 781 } 782 } 783 784 if (_trs.runAtClient) { 787 if (!(treeRoot instanceof INameable)) { 790 String s = Bundle.getString("Tags_TreeRunAtClientRoot", null); 791 registerTagError(s, null); 792 reportErrors(); 793 return; 794 } 795 796 INameable in = (INameable) treeRoot; 798 String o = in.getObjectName(); 799 if (o == null) { 800 NameService ns = NameService.instance(pageContext.getSession()); 801 ns.nameObject("Tree", in); 802 ns.put(in); 803 } 804 } 805 806 807 HttpServletRequest request = (HttpServletRequest ) pageContext.getRequest(); 809 HttpServletResponse response = (HttpServletResponse ) pageContext.getResponse(); 810 InternalStringBuilder sb = new InternalStringBuilder(1024); 811 StringBuilderRenderAppender writer = new StringBuilderRenderAppender(sb); 812 813 assert(_trs.tagId != null); 817 _trs.tagId = getIdForTagId(_trs.tagId); 818 819 String treeId = request.getParameter(TreeElement.TREE_ID); 820 if (treeId != null && _trs.tagId.equals(treeId)) { 821 TreeHelpers.processTreeRequest(treeId, treeRoot, request, response); 822 } 823 824 if (_trs.runAtClient) { 827 IScriptReporter sr = getScriptReporter(); 828 if (sr == null) { 829 String s = Bundle.getString("Tags_TreeRunAtClientSC", null); 830 registerTagError(s, null); 831 reportErrors(); 832 return; 833 } 834 835 ScriptRequestState srs = ScriptRequestState.getScriptRequestState(request); 836 if (!srs.isFeatureWritten(CoreScriptFeature.DYNAMIC_INIT)) { 837 String s = Bundle.getString("Tags_TreeHtmlRunAtClient", null); 838 registerTagError(s, null); 839 reportErrors(); 840 return; 841 } 842 843 assert(treeRoot instanceof ITreeRootElement); 844 ITreeRootElement tre = (ITreeRootElement) treeRoot; 845 846 Object [] args = new Object [8]; 847 args[0] = _iState.getImageRoot() + "/"; 848 args[1] = tre.getObjectName(); 849 args[2] = _iState.getNodeCollapsedImage(); 850 args[3] = _iState.getNodeExpandedImage(); 851 args[4] = _iState.getLastNodeCollapsedImage(); 852 args[5] = _iState.getLastNodeExpandedImage(); 853 args[6] = Bundle.getString("Tags_TreeAltTextExpand", null); 854 args[7] = Bundle.getString("Tags_TreeAltTextCollapse", null); 855 srs.writeFeature(sr, writer, CoreScriptFeature.TREE_INIT, false, false, args); 856 857 tre.setTreeRenderState(_trs); 858 tre.setInheritableState(_iState); 859 } 860 861 _divState.styleClass = _treeStyleClass; 863 _divState.style = _treeStyle; 864 String divId = null; 865 if (_renderTagIdLookup) { 866 _divState.id = _trs.tagId; 867 divId = _divState.id; 868 } 869 870 if (_trs.runAtClient) { 872 _divState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, "netui:treeName", 873 ((INameable) treeRoot).getObjectName()); 874 } 875 876 TagRenderingBase divRenderer = TagRenderingBase.Factory.getRendering(TagRenderingBase.DIV_TAG, request); 877 divRenderer.doStartTag(writer, _divState); 878 sb.append("\n"); 879 880 AttributeRenderer extraAttrs = new AttributeRenderer(); 882 TagTreeRenderer ttr = new TagTreeRenderer(this, _trs, request, response, pageContext.getServletContext()); 883 ttr.render(sb, treeRoot, 0, extraAttrs, _iState); 884 if (hasErrors()) { 885 reportErrors(); 886 return; 887 } 888 889 divRenderer.doEndTag(writer); 891 sb.append("\n"); 892 write(sb.toString()); 893 894 if (!(treeRoot instanceof ITreeRootElement)) { 895 boolean error = false; 896 if (_rootNodeExpandedImage != null) { 897 String s = Bundle.getString("Tags_TreeRootImageError", null); 898 registerTagError(s, null); 899 error = true; 900 } 901 if (_rootNodeCollapsedImage != null) { 902 String s = Bundle.getString("Tags_TreeRootImageError", null); 903 registerTagError(s, null); 904 error = true; 905 } 906 if (error) { 907 reportErrors(); 908 } 909 } 910 911 if (_renderTagIdLookup) { 913 String jsOut = renderDefaultJavaScript(request, divId); 914 if (jsOut != null) 915 write(jsOut); 916 } 917 } 918 919 924 protected TreeElement getTreeRoot(ExpressionHandling expr) 925 throws JspException  926 { 927 String datasource = "{" + _dataSource + "}"; 928 Object treeNode = expr.evaluateExpression(datasource, "dataSource", getPageContext()); 929 if (treeNode == null || hasErrors()) { 930 return null; 931 } 932 933 if (!(treeNode instanceof TreeElement)) { 934 String s = Bundle.getString("Tags_TreeInvalidAttribute", _dataSource); 935 registerTagError(s, null); 936 return null; 937 } 938 return (TreeElement) treeNode; 939 } 940 941 948 protected String replace(String template, String placeholder, String value) 949 { 950 if (template == null) 951 return null; 952 if ((placeholder == null) || (value == null)) 953 return template; 954 955 while (true) { 956 int index = template.indexOf(placeholder); 957 if (index < 0) 958 break; 959 InternalStringBuilder temp = new InternalStringBuilder(template.substring(0, index)); 960 temp.append(value); 961 temp.append(template.substring(index + placeholder.length())); 962 template = temp.toString(); 963 } 964 return template; 965 } 966 967 976 protected final String renderTagId(HttpServletRequest request, String tagId, AbstractHtmlState state) 977 { 978 assert(_trs.tagId != null); 979 state.id = getIdForTagId(tagId); 980 String script = renderDefaultJavaScript(request, state.id); 981 return script; 982 } 983 984 988 public void collectChildError(String error) 989 { 990 if (_errorText == null) { 991 _errorText = new InternalStringBuilder(32); 992 } 993 _errorText.append(error); 994 } 995 996 1001 private String renderDefaultJavaScript(HttpServletRequest request, String realId) 1002 { 1003 String idScript = null; 1004 1005 if (TagConfig.isDefaultJavaScript()) { 1007 ScriptRequestState srs = ScriptRequestState.getScriptRequestState(request); 1008 idScript = srs.mapTagId(getScriptReporter(), _trs.tagId, realId, null); 1009 } 1010 return idScript; 1011 } 1012} 1013 | Popular Tags |