/***************************************************************************** * * * This file is part of the tna framework distribution. * * Documentation and updates may be get from biaoping.yin the author of * * this framework * * * * Sun Public License Notice: * * * * The contents of this file are subject to the Sun Public License Version * * 1.0 (the "License"); you may not use this file except in compliance with * * the License. A copy of the License is available at http://www.sun.com * * * * The Original Code is tag. The Initial Developer of the Original * * Code is biaoping yin. Portions created by biaoping yin are Copyright * * (C) 2000. All Rights Reserved. * * * * GNU Public License Notice: * * * * Alternatively, the contents of this file may be used under the terms of * * the GNU Lesser General Public License (the "LGPL"), in which case the * * provisions of LGPL are applicable instead of those above. If you wish to * * allow use of your version of this file only under the terms of the LGPL * * and not to allow others to use your version of this file under the SPL, * * indicate your decision by deleting the provisions above and replace * * them with the notice and other provisions required by the LGPL. If you * * do not delete the provisions above, a recipient may use your version of * * this file under either the SPL or the LGPL. * * * * biaoping.yin (yin-bp@163.com) * * Author of Learning Java * * * *****************************************************************************/ package com.frameworkset.common.tag.tree.impl; // import javax.servlet.jsp.JspException; import java.io.Serializable; import java.io.StringWriter; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import bboss.org.apache.velocity.Template; import bboss.org.apache.velocity.VelocityContext; import bboss.org.apache.velocity.exception.MethodInvocationException; import bboss.org.apache.velocity.exception.ParseErrorException; import bboss.org.apache.velocity.exception.ResourceNotFoundException; import com.frameworkset.common.tag.tree.itf.ITree; import com.frameworkset.common.tag.tree.itf.ITreeIteratorElement; import com.frameworkset.common.tag.tree.itf.ITreeNode; import com.frameworkset.util.StringUtil; import com.frameworkset.util.VelocityUtil; /** * 该类辅助TreeTag生成各种树的html代码, 可以通过ecs/velocity/StringBuilder几种方式来生成 * * @作者 biaoping.yin * @日期 2004-3-19 16:28:13 * @版本 v1.0 */ public class NodeHelper implements Serializable { private static final Logger log = Logger.getLogger(NodeHelper.class); /** * 包含显示的节点信息 */ private ITreeIteratorElement element = null; // private /** * 待显示的节点action */ private String action = null; /** * 该节点是否为展开节点 */ boolean expanded = false; /** * 节点是否有字节点 */ boolean hasChildren = true; /** * 是否是最后孩子节点 */ boolean isLastChild = false; /** * 是否是第一个孩子节点 */ boolean isFirstChild = false; /** * 节点是否选中 */ boolean selected = false; /** * 控制树的折叠功能: false:不折叠 true:折叠 缺省值:true */ private boolean isCollapse = true; /** * 节点href扩展串 */ String extendString = ""; /** * 节点类型 */ String type = ""; /** * 页面请求对象 */ HttpServletRequest request; /** * 动静结合时需要记录当前节点的ident,以便生成节点的儿子节点的indent 儿子节点的indent = 父的indent + 儿子的indent */ StringBuilder indent; boolean dynamic = true; /** * 页面请求范围 session,request,pageContext,缺省值为session */ String scope = "session"; /** * 指定节点的修饰图片的目录 */ String imageFolder = "/images/"; /** * checkbox名称 */ String checkBox = null; /** * radio名称 */ String radio = null; /** * checkbox默认选中值,以‘,’分隔的字符串 */ private String[] checkBoxDefaultValue = null; /** * checkbox 的值 */ private String checkboxValue; /** * radio的默认选中值 */ private String radioDefaultValue = null; /** * checkbox扩展串 */ private String checkBoxExtention; /** * radio按钮扩展串 */ private String radioExtention; /** * radio按钮值 */ private String radioValue; /** * 节点href目标 */ String target = ""; /** * 节点标识 */ String nodeId; /** * 页面参数 */ String params; /** * 双事件控制变量,点击节点时是否展开节点的下一级目录,前提条件是节点要有下一级目录 false:为不展开,true为展开,缺省为false */ private boolean doubleEvent = false; private String nodeClickLink = null; private String nodeEventLink = null; private String sonids; private boolean parentlastcollapase; public NodeHelper(ITreeIteratorElement element,boolean parentlastcollapase, HttpServletRequest request,String sonids) { this.element = element; this.expanded = element.isExpanded(); this.hasChildren = element.getNode().hasChildren(); this.radioValue = element.getNode().getRadioValue(); this.checkboxValue = element.getNode().getCheckboxValue(); this.isLastChild = element.isLastChild(); this.isFirstChild = element.isFirstChild(); this.selected = element.isSelected(); this.type = element.getNode().getType(); this.request = request; this.nodeId = element.getNode().getId(); this.nodeClickLink = null; this.nodeEventLink = null; this.sonids = sonids; this.parentlastcollapase = parentlastcollapase; } public void setCollapse(boolean isCollapse) { this.isCollapse = isCollapse; } public void setImageFolder(String imageFolder) { this.imageFolder = imageFolder; } public void setCheckBox(String checkBox) { this.checkBox = checkBox; } public void setRadio(String radio) { this.radio = radio; } /** * 获取事件名称 * * @return */ private String getEvent() { if (!expanded && hasChildren && !isLastChild) return "expand"; if (expanded && hasChildren && !isLastChild) return "collapse"; if (!expanded && hasChildren && isLastChild) return "expand"; if (expanded && hasChildren && isLastChild) return "collapse"; return null; } private String getEventLabel() { if(itree.isDynamic()) { if (!expanded && hasChildren && !isLastChild) return "展开"; if (expanded && hasChildren && !isLastChild) return "折叠"; if (!expanded && hasChildren && isLastChild) return "展开"; if (expanded && hasChildren && isLastChild) return "折叠"; } else { if (!expanded && hasChildren && !isLastChild) return "展开/折叠"; if (expanded && hasChildren && !isLastChild) return "展开/折叠"; if (!expanded && hasChildren && isLastChild) return "展开/折叠"; if (expanded && hasChildren && isLastChild) return "展开/折叠"; } return null; } public void getImageContent(StringBuilder buffer) { // StringBuilder buffer = new StringBuilder(); // System.out.println(element.getName() + ":expanded=" + expanded + // ",hasChildren=" + hasChildren + ",isLastChild=" + isLastChild); if (!expanded && hasChildren && !isLastChild) // buffer.append( // getImageContent( // "expand", // getCollapsedMidNodeImage(), // getClosedFolderImage())); getImageContent(buffer, "expand", getCollapsedMidNodeImage(), getClosedFolderImage()); /** * 1,2 completed selected */ if (!expanded && hasChildren && isLastChild) getImageContent(buffer, "expand", getCollapsedLastNodeImage(), getClosedFolderImage()); if (expanded && hasChildren && !isLastChild) getImageContent(buffer, "collapse", getExpandedMidNodeImage(), getOpenFolderImage()); if (expanded && hasChildren && isLastChild) getImageContent(buffer, "collapse", getExpandedLastNodeImage(), getOpenFolderImage()); // <td><a href="classtree.jsp?expand=<tree:nodeId // node="example.node"/>"><img src="images/collapsedLastNode.gif" // border="0"></a><img src="images/closedFolder.gif"></td> // <td><a href="classtree.jsp?collapse=<tree:nodeId // node="example.node"/>"><img src="images/expandedLastNode.gif" // border="0"></a><img src="images/openFolder.gif"></td> if (!expanded && !hasChildren && !isLastChild) getImageContent(buffer, "null", getNoChildrenMidNodeImage(), getNonFolderImage()); // <td><img src="images/noChildrenMidNode.gif"><img // src="images/nonFolder.gif"></td> if ((!expanded && !hasChildren && isLastChild) || (expanded && !hasChildren && isLastChild)) getImageContent(buffer, "null", getNoChildrenLastNodeImage(), getNonFolderImage()); // <td><img src="images/noChildrenLastNode.gif"><img // src="images/nonFolder.gif"></td> // return buffer.toString(); } private String getPreImageForstatic(boolean expanded) { if (!expanded && !isLastChild) return getCollapsedMidNodeImage(); /** * 1,2 completed selected */ if (!expanded && isLastChild) return getCollapsedLastNodeImage(); if (expanded && !isLastChild) return getExpandedMidNodeImage(); if (expanded && isLastChild) return getExpandedLastNodeImage(); return ""; } private String getFolderImageForstatic(boolean expanded) { if (!expanded) return getClosedFolderImage(); else return getOpenFolderImage(); } public void getNodeContent(StringBuilder buffer) { // return getNodeContent(buffer,"selected", selected); getNodeContent(buffer, "selected", selected); } private String getCustomParams(Map attributes) { StringBuilder buffer = new StringBuilder(); boolean flag = false; if (attributes != null) { Iterator keys = attributes.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); /** * 判断key是否是系统中缺省保留的参数 */ if(this.isInnerVariable(key)) { continue; } if (!flag) { String value = (String) attributes.get(key); buffer.append(key).append("=").append(value); flag = true; } else { String value = (String) attributes.get(key); buffer.append("&").append(key).append("=").append(value); } } } return buffer.toString(); } private boolean isInnerVariable(String key) { boolean isInnerVariable = false; /** * 判断key是否是系统中缺省保留的参数 */ if (key.equals("nodeLink"))//节点链接参数名称 isInnerVariable = true; else if (key.equals("node_recursive"))//复选框是否递归选择参数名称为boolean类型 isInnerVariable = true; else if (key.equals("node_linktarget"))//节点链接地址key { isInnerVariable = true; } else if (key.equals("node_checkboxname"))//节点复选框名称key { isInnerVariable = true; } else if (key.equals("node_radioname"))//节点单选框名称key { isInnerVariable = true; } else if(key.equals("node_uprecursive"))//节点复选框是否有递归选择上级的功能 { isInnerVariable = true; } else if(key.equals("node_partuprecursive"))//节点复选框是否有递归选择上级的功能 { isInnerVariable = true; } else if(key.equals("node_checkboxchecked")) //标识复选框是否被选中 isInnerVariable = true; else if(key.equals("node_checkboxdisabled")) //标识复选框是否被禁用 isInnerVariable = true; else if(key.equals("node_radiochecked")) //标识单选按钮是否被选冲 isInnerVariable = true; else if(key.equals("node_radiodisabled")) //标识单选按钮是否被禁用 isInnerVariable = true; return isInnerVariable; } /** * 获取节点点击链接 * * @return */ private String getNodeClickLink(String event) { if (nodeClickLink != null) return this.nodeClickLink; nodeClickLink = ""; String nodeLink = null; Map attributes = element.getNode().getParams(); // 如果需要设置href,则获取链接地址,否则 if (this.element.getNode().getShowHref()) { if (attributes != null) nodeLink = (String) attributes.get("nodeLink"); if (nodeLink == null) nodeLink = this.getAction(); } if(!StringUtil.isJavascript(nodeLink)) { String selectedNode = request.getParameter("selectedNode"); StringBuilder buffer = new StringBuilder(); boolean flag = nodeLink != null && nodeLink.trim().length() > 0; String nodeEvent = getEvent(); String eventLink = getEventLink(nodeEvent).toString(); if (flag) { buffer.append("doClickTreeNode('").append( StringUtil.getRealPath(request, nodeLink)).append( nodeLink.indexOf("?") == -1 ? "?" : "&").append(event) .append("=").append(element.getId()); if (element.getNode().getType() != null) buffer.append("&classType=") .append(element.getNode().getType()); if (element.getNode().getMemo() != null) buffer.append("&nodeMemo=").append(element.getNode().getMemo()); if (element.getNode().getPath() != null) buffer.append("&nodePath=").append( StringUtil.encode(element.getNode().getPath(), null)); String target = getTarget(); if (attributes != null) { String temp = (String) attributes.get("node_linktarget"); if(temp != null && !temp.equals("")) target = temp; Iterator keys = attributes.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); /** * 判断key是否是系统中缺省保留的参数 */ if(this.isInnerVariable(key)) { continue; } String value = (String) attributes.get(key); buffer.append("&").append(key).append("=").append(value); } } buffer.append("','" + element.getNode().getId() + "',").append("'") .append(target).append("','").append(selectedNode); if (!eventLink.equals("") && doubleEvent) { if(itree.isDynamic()) buffer.append("','").append(eventLink).append("')\" "); else buffer.append("','").append(eventLink).append("','").append(this.element.getId()).append("')\" "); } else buffer.append("')"); } else if (!eventLink.equals("")) { if(itree.isDynamic()) //纯动态的树模式 { buffer.append("doClickImageIcon('").append( eventLink).append("')"); } else //动静结合的模式 { buffer.append("doClickImageIcon('").append( eventLink).append("','") .append(this.element.getId()) .append("','") .append(StringUtil.encode(this.element.getName())) .append("','") .append(this.element.getNode().getType()) .append("','") .append(this.element.getNode().getPath()) .append("','") .append(this.element.isFirstChild()) .append("','") .append(this.element.isLastChild()) .append("')"); } } return nodeClickLink = buffer.toString(); } else { return nodeClickLink = nodeLink; } } /** * 生成节点的html文本,节点是否带链接以及带什么样的链接有以下几种情况: * 不需要设置点击链接,但是节点包含字节点,那么需要设置展开该节点下一级的链接 需要设置点击链接,但节点不包含子节点而不需要设置展开节点的下一级链接 * 需要设置点击链接,节点包含字节点,也需要设置展开该节点下一级的链接 * * @param buffer * @param event * @param selected */ private void getNodeContent(StringBuilder buffer, String event, boolean selected) { // 定义从点击图标处传递过来的参数,然后判断默认选中的结点 String selectedNode = request.getParameter("selectedNode"); // StringBuilder buffer = new StringBuilder(); if (nowrap) buffer.append("<td nowrap title=\"").append(element.getNode().getName()).append("\">"); else buffer.append("<td title=\"").append(element.getNode().getName()).append("\">"); buffer.append(getCheckBox()); buffer.append(getRadio()); String nodeClickEvent = this.getNodeClickLink(event); if (!nodeClickEvent.equals("")) { if (this.enablecontextmenu) { String id = ""; if (this.element.getNode().isEnablecontextmenu()) // 如果节点本身制定了右键菜单,则设置本身的右键菜单项 id = "_node_" + this.element.getNode().getId(); else // 否则如果根据直接使用节点类型对应的右键菜单 id = "_type_" + this.element.getNode().getType(); String params = this.getCustomParams(this.element.getNode() .getParams()); String expandLabel = this.getEventLabel(); buffer .append("<a ") .append( expandLabel == null ? "" : "expandLabel=\"" + expandLabel + "\"") .append(" openNode=\"") .append(this.element.getNode().getId()) .append("\"") .append( expandLabel == null ? " " : " expandNode=\"icon_" + this.element.getNode() .getId() + "\"") .append(" id=\"") .append(id) .append("\" params=\"") .append(params) .append( // "\" oncotextmenu='InitializedDocEvent();' name=\"") "\" name=\"") .append(this.element.getNode().getId()).append( "\" onclick=\"").append(nodeClickEvent).append( "\" style=\"cursor:hand;\""); } else { buffer.append("<a name=\"").append( this.element.getNode().getId()).append("\" onclick=\"") .append(nodeClickEvent).append( "\" style=\"cursor:hand;\""); } if (selectedNode != null && selectedNode.equals(this.element.getNode().getId())) buffer.append(" class=\"selectedTextAnchor\""); buffer.append(">"); } else { if (this.enablecontextmenu) { String id = ""; if (this.element.getNode().isEnablecontextmenu()) // 如果节点本身制定了右键菜单,则设置本身的右键菜单项 id = "_node_" + this.element.getNode().getId(); else // 否则如果根据直接使用节点类型对应的右键菜单 id = "_type_" + this.element.getNode().getType(); String params = this.getCustomParams(this.element.getNode() .getParams()); String expandLabel = this.getEventLabel(); buffer .append("<a ") .append( expandLabel == null ? "" : "expandLabel=\"" + expandLabel + "\"") .append(" openNode=\"") .append(this.element.getNode().getId()) .append("\"") .append( expandLabel == null ? " " : " expandNode=\"icon_" + this.element.getNode() .getId() + "\"") .append(" id=\"") .append(id) .append("\" params=\"") .append(params) .append( // "\" oncotextmenu='InitializedDocEvent();' name=\"") "\" name=\"") .append(this.element.getNode().getId()).append( "\">"); } else { //do nothing } } // if (selected) // buffer.append("<b>"); String t_temp = element.getName(); t_temp = StringUtil.replaceAll(t_temp,"'","\\'"); buffer.append(t_temp); // if (selected) // buffer.append("</b>"); // buffer.append("</span>"); if (!nodeClickEvent.equals("")) { buffer.append("</a>"); getCatchScript(buffer, request, element.getId()); } else { if (this.enablecontextmenu) buffer.append("</a>"); else { //do nothing. } } buffer.append("</td>"); } private String localAction; /** * 控制树节点是否换行 */ private boolean nowrap = true; private boolean enablecontextmenu; /** * 向下递归所有节点 */ private boolean recursive = false; /** * 向上递归到所有父节点 */ private boolean uprecursive = false; /** * 向上递归到所有需要递归父节点 */ private boolean partrecursive = false; private String checkboxOnchange; private ITree itree; /** * 获取本地连接,并且将页面参数追加到连接后面 * * @return String */ public String getLocalAction() { String temp = localAction; if (getParams() == null || getParams().trim().length() == 0) return temp; int index = temp.indexOf('?'); if (index == -1) { temp += "?" + this.getParams(); } else temp += "&" + this.getParams(); return temp; } public String getLocalAction(int index, String attach) { return new StringBuilder(localAction).insert(index, attach).toString(); } /** * 获取事件链接 * * @param event * @return */ private String getEventLink(String event) { if (this.nodeEventLink != null) return nodeEventLink; if (event == null) return nodeEventLink = ""; String location = getLocalAction(); int index = location.indexOf('?'); // 如果允许树进行折叠,那么设置图标的链接,否则不设置 StringBuilder temp_b = new StringBuilder(); if (index == -1) temp_b.append(location) .append("?"); else temp_b.append(location).append("&"); // buffer.append("anchor=") // .append(anchor) // .append("&"); temp_b.append(event).append("=").append(element.getId()); temp_b.append("&request_scope=").append(getScope()); // .append("')"); return nodeEventLink = temp_b.toString(); } private String getParent_indent() { String parent_indent = request.getParameter("node_parent_indent"); return parent_indent; } private String getType() { if(type == null) return ""; else { if(type.equals("1")) return "root"; else return type; } } private boolean isFirsted() { return this.element.isExpanded() || this.itree.isStatic(); } private void getImageContent(StringBuilder buffer, String event, String nodeImage, String typeImage) { String nodeClickEvent = this.getNodeClickLink("selected"); // StringBuilder buffer = new StringBuilder(); if (!event.equals("null") && isCollapse()) { buffer.append("<td nowrap>"); StringBuilder temp_b = new StringBuilder();// getEventLink(event); if(itree.isDynamic() || !this.hasChildren) { temp_b.append("<a id=\"icon_").append(element.getId()).append( "\" onclick=\"doClickImageIcon('").append( getEventLink(event)).append( "')\" style=\"cursor:hand;\">"); } else { temp_b.append("<a firsted=\"").append(isFirsted()).append("\" id=\"icon_").append(element.getId()).append( "\" onclick=\"doClickImageIcon('").append( getEventLink(event)) .append("','").append( this.element.getId()) .append("','") .append(StringUtil.encode(this.element.getName())) .append("','") .append(this.element.getNode().getType()) // .append("','") // .append(this.element.getNode().getShowHref()) // .append("','") // .append(this.element.getNode().hasChildren()) .append("','") .append(this.element.getNode().getPath()) .append("','") .append(this.element.isFirstChild()) .append("','") .append(this.element.isLastChild()) .append("')\" style=\"cursor:hand;\" indent=\"") .append(this.indent).append("\"") .append(" collapsedimg=\"").append(this.getPreImageForstatic(false)).append("\"") .append(" expandedimg=\"").append(this.getPreImageForstatic(true)).append("\"") .append(" closedimg=\"").append(this.getFolderImageForstatic(false)).append("\"") .append(" openedimg=\"").append(this.getFolderImageForstatic(true)).append("\"") .append(">"); } if (this.enablecontextmenu && !nodeClickEvent.equals("")) { String id = ""; if (this.element.getNode().isEnablecontextmenu()) // 如果节点本身制定了右键菜单,则设置本身的右键菜单项 id = "_node_" + this.element.getNode().getId(); else // 否则如果根据直接使用节点类型对应的右键菜单 id = "_type_" + this.element.getNode().getType(); String params = this.getCustomParams(this.element.getNode() .getParams()); String expandLabel = this.getEventLabel(); buffer .append(temp_b.toString()) .append("<img ") .append( expandLabel == null ? "" : "expandLabel=\"" + expandLabel + "\"") .append(" openNode=\"") .append(this.element.getNode().getId()) .append("\"") .append( expandLabel == null ? " " : " expandNode=\"icon_" + this.element.getNode() .getId() + "\"") .append(" id=\"") .append(id) .append("\" params=\"") .append(params) .append( // "\" oncotextmenu='InitializedDocEvent();' name=\"icon0_").append(this.element.getId()) "\" name=\"icon0_").append(this.element.getId()) .append("\" src=\"") .append(nodeImage).append("\" border=\"0\">"); } else buffer.append(temp_b.toString()).append("<img name=\"icon0_").append(this.element.getId()) .append("\" src=\"").append( nodeImage).append("\" border=\"0\">"); buffer.append("</a>"); // buffer.append(temp_b.toString()) buffer.append("<a onclick=\"javascript:doclickevt(document.getElementById('icon_").append( element.getId()).append( "'));\" style=\"cursor:hand;\">"); if (this.enablecontextmenu && !nodeClickEvent.equals("")) { String id = ""; if (this.element.getNode().isEnablecontextmenu()) // 如果节点本身制定了右键菜单,则设置本身的右键菜单项 id = "_node_" + this.element.getNode().getId(); else // 否则如果根据直接使用节点类型对应的右键菜单 id = "_type_" + this.element.getNode().getType(); String params = this.getCustomParams(this.element.getNode() .getParams()); String expandLabel = this.getEventLabel(); buffer .append("<img ") .append( expandLabel == null ? "" : "expandLabel=\"" + expandLabel + "\"") .append(" openNode=\"") .append(this.element.getNode().getId()) .append("\"") .append( expandLabel == null ? " " : " expandNode=\"icon_" + this.element.getNode() .getId() + "\"") .append(" id=\"") .append(id) .append("\" params=\"") .append(params) .append( // "\" oncotextmenu=\"InitializedDocEvent();\" src=\""); "\" src=\""); } else buffer.append("<img src=\""); buffer.append(typeImage).append("\" name=\"icon1_").append(this.element.getId()) .append("\"></a></td>"); } else { if (this.element.getNode().getShowHref() && this.enablecontextmenu && !nodeClickEvent.equals("")) { String id = ""; if (this.element.getNode().isEnablecontextmenu()) // 如果节点本身制定了右键菜单,则设置本身的右键菜单项 id = "_node_" + this.element.getNode().getId(); else // 否则如果根据直接使用节点类型对应的右键菜单 id = "_type_" + this.element.getNode().getType(); String params = this.getCustomParams(this.element.getNode() .getParams()); buffer.append("<td nowrap>").append("<img src=\"").append(nodeImage) .append("\">"); buffer .append("<img openNode=\"") .append(this.element.getNode().getId()) .append("\" id=\"") .append(id) .append("\" params=\"") .append(params) .append( // "\" oncotextmenu=\"InitializedDocEvent();\" src=\"") "\" src=\"") .append(typeImage).append("\"></td>"); } else buffer.append("<td nowrap>").append("<img src=\"").append(nodeImage) .append("\">").append("<img src=\"").append(typeImage) .append("\"></td>"); } // return buffer.toString(); } /** * 获取树头部分 */ public void getUpper(StringBuilder buffer) { if (itree.isDynamic()) buffer .append("<tr><td>") .append( "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">") .append("<tr>"); else if(itree.isStaticDynamic()) { // 动静态结合的树节点 String parent_indent = request.getParameter("node_parent_indent"); if(element.isFirstChild()) //\\调整 { if(parent_indent != null) buffer.append("<div sonids=\"").append(sonids).append("\" style=\"display:none;\" id=\"div_parent_") .append(element.getNode().getParent().getId()).append("\">"); else { buffer.append("<div id=\"div_parent_") .append(element.getNode().getParent() != null ?element.getNode().getParent().getId() : "").append("\">"); } } buffer .append("<div style=\"height:16px;margin:0;padding:0;\" id=\"div_") .append(this.element.getId()) .append("\">") .append( "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">") .append("<tr>"); } else if(itree.isStatic()) { // if(element.isFirstChild()) //\\调整 { { if(element.getNode().getParent() == null ) { buffer.append("<div id=\"div_parent_\">"); } else { if(itree.isExpanded(element.getNode().getParent().getId())) { buffer.append("<div id=\"div_parent_") .append(element.getNode().getParent().getId() ).append("\">"); } else { buffer.append("<div style=\"display:none;\" id=\"div_parent_") .append(element.getNode().getParent().getId() ).append("\">"); } } } } buffer .append("<div style=\"height:16px;margin:0;padding:0;\" id=\"div_") .append(this.element.getId()) .append("\">") .append( "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">") .append("<tr>"); } } /** * 获取树根 * * @return String */ public void getBoot(StringBuilder buffer) { // StringBuilder buffer = new StringBuilder(); if (itree.isDynamic()) buffer.append("</tr>").append("</table></td></tr>"); else { buffer.append("</tr>").append("</table></div>"); String parent_indent = request.getParameter("node_parent_indent"); if(this.element.isLastChild()) { //如果是静态点击展开节点,则直接添加</div>父层关闭标记 if(parent_indent != null) { buffer.append("</div>"); } else /** * modifiye * 判断当前自动展开的节点是否有儿子: * 没有儿子则直接添加</div>父层关闭标记,并且递归判断当前节点的所有祖先是否是最后的孩子如果是则补充</div> * 有儿子则需要进行特殊处理,但是孩子没有加载则直接添加父的</div>标记 */ { if(!element.getNode().hasChildren()) { buffer.append("</div>"); setParentLastChildBoot(element.getNode().getParent(),buffer); } else if(element.getNode().childrenSize() == 0) // { buffer.append("</div>"); } } } } } private void setParentLastChildBoot(ITreeNode parent,StringBuilder buffer) { if(parent == null) return ; if(isLastChild(parent)) { if(parent.isRoot() ) { if( this.includeRootNode) { buffer.append("</div>"); setParentLastChildBoot(parent.getParent(),buffer); } } else { buffer.append("</div>"); setParentLastChildBoot(parent.getParent(),buffer); } } } private boolean isLastChild(ITreeNode node) { return node.getRightNode() == null; } /** * 获取节点的缩排格式 */ public void getIndent(StringBuilder indent) { Iterator indentationProfileIterator = element.getIndendationProfile() .iterator(); // StringBuilder indent = new StringBuilder(); indent.append("<td nowrap>"); if (!itree.isDynamic() && this.element.getNode().hasChildren()) this.indent = new StringBuilder(); // boolean preisVerticalLineIndentationType = true; // int i = 0; while (indentationProfileIterator.hasNext()) { boolean isVerticalLineIndentationType = !((Boolean) indentationProfileIterator .next()).booleanValue(); if (this.indent != null) this.indent.append(!isVerticalLineIndentationType ? "1" : "0"); if (isVerticalLineIndentationType) { // :log imgsrc必须动态获取 indent.append("<img src=\"").append(getVerticalLine()).append( "\">"); } else { // indent.append("<img src=\"").append(getBlankSpace()).append( // "\">"); // if(!preisVerticalLineIndentationType) indent.append("  "); // else // { // indent.append("  "); // } } // if(i > 0) // preisVerticalLineIndentationType = isVerticalLineIndentationType; // i ++; } // if( parentlastcollapase) // indent.append("    "); indent.append("</td>"); // return indent.toString(); /** * this.indentationProfileIterator = * getElement().getIndendationProfile().iterator(); * * if(this.indentationProfileIterator.hasNext()){ * pageContext.getRequest().setAttribute(getIndentationType(), * this.indentationProfileIterator.next()); return EVAL_BODY_INCLUDE; } * return SKIP_BODY; * */ } private String getVerticalLine() { return this.getImageFolder() + "verticalLine.gif"; // "<img src=\"images/verticalLine.gif\">"; } private String getBlankSpace() { return this.getImageFolder() + "blankSpace.gif"; // "<img src=\"images/blankSpace.gif\">"; } private String getCollapsedMidNodeImage() { return this.getImageFolder() + "collapsedMidNode.gif"; } private String getExpandedMidNodeImage() { return this.getImageFolder() + "expandedMidNode.gif"; } /** * 获取相应类型关闭目录前的图标 * * @return String */ private String getClosedFolderImage() { if (this.element.getNode().isRoot()) return this.getImageFolder() + "close_root.gif"; else { String type = this.element.getNode().getType(); if (type == null || type.equals("")) { return this.getImageFolder() + "closedFolder.gif"; } else { return this.getImageFolder() + type + "_closedFolder.gif"; } } } private String getOpenFolderImage() { if (this.element.getNode().isRoot()) return this.getImageFolder() + "open_root.gif"; else { // return this.getImageFolder() + "openFolder.gif"; String type = this.element.getNode().getType(); if (type == null || type.equals("")) { return this.getImageFolder() + "openFolder.gif"; } else { return this.getImageFolder() + type + "_openFolder.gif"; } } } private String getCollapsedLastNodeImage() { return this.getImageFolder() + "collapsedLastNode.gif"; } private String getExpandedLastNodeImage() { return this.getImageFolder() + "expandedLastNode.gif"; } private String getNoChildrenMidNodeImage() { return this.getImageFolder() + "noChildrenMidNode.gif"; } private String getNonFolderImage() { // return this.getImageFolder() + "nonFolder.gif"; if (this.element.getNode().isRoot()) return this.getImageFolder() + "close_root.gif"; String type = this.element.getNode().getType(); if (type == null || type.equals("")) { return this.getImageFolder() + "nonFolder.gif"; } else { return this.getImageFolder() + type + "_nonFolder.gif"; } } private String getNoChildrenLastNodeImage() { return this.getImageFolder() + "noChildrenLastNode.gif"; } public void setAction(String action) { this.action = action; } public String getAction() { return StringUtil.getRealPath(request, action); // return this.action; } /** * 获取复选框代码 * * @return String */ public String getCheckBox() { // 如果没有设置单选框的名称,或者单选框的值为null时,不生成相应的复选框 String value = this.getCheckboxValue(); // System.out.println("check box value:" + value); if (checkBox == null || checkBox.trim().equals("") || value == null) return ""; String checked = ""; String[] values = getCheckBoxDefaultValues(); StringBuilder ret = new StringBuilder(); String checkBox = this.checkBox; boolean recursive = itree.isRecursive(); boolean uprecursive = itree.isUprecursive(); boolean partuprecursive = itree.isPartuprecursive(); //node_recursive,node_checkboxname Map params = this.element.getNode().getParams(); boolean disabled = false; boolean bchecked = false; if(params != null) { Boolean btemp = (Boolean)params.get("node_recursive"); if(btemp != null) recursive = btemp.booleanValue(); String temp = (String)params.get("node_checkboxname"); btemp = (Boolean)params.get("node_uprecursive"); if(btemp != null) uprecursive = btemp.booleanValue(); btemp = (Boolean)params.get("node_partuprecursive"); if(btemp != null) partuprecursive = btemp.booleanValue(); btemp = (Boolean)params.get("node_checkboxdisabled"); if(btemp != null) disabled = btemp.booleanValue(); btemp = (Boolean)params.get("node_checkboxchecked"); if(btemp != null) bchecked = btemp.booleanValue(); if(temp != null) checkBox = temp; } ret.append("<input type='checkbox' id='").append(checkBox).append( "' name='").append(checkBox).append( "' value='"); if (value == null) ret.append(nodeId); else ret.append(value); if(bchecked ) { checked = "checked"; } else if (values != null && StringUtil.containKey(values, value)) { checked = "checked"; } ret.append("' ").append(checked).append(" ").append(" id='checkbox_") .append(nodeId).append("'").append(" sonids='") .append(element.getNode().getSonids()).append("'").append(" ") .append(getCheckBoxExtention()); if(this.checkboxOnchange != null) ret.append(" onClick='") .append(this.checkboxOnchange) .append("'"); else ret.append(" onClick='treeNodeCheckboxChange(null,event)'"); if(recursive) { ret.append(" recursive='true'"); } else { ret.append(" recursive='false'"); } if(uprecursive) { ret.append(" uprecursive='true'"); } else { ret.append(" uprecursive='false'"); } if(disabled) { ret.append(" disabled"); } ret.append(" partuprecursive='") .append(partuprecursive + "") .append("'"); ret.append(">"); return ret.toString(); } // /** // * 获取当前节点的所有子节点的id,组成一个串,以“##”作为分隔符 // * // * @return 返回生成的串 // */ // public static String getSonIDs(ITreeNode node) // { // List list = node.getChildren(); // StringBuilder ret = new StringBuilder(); // if (list != null) // { // boolean first = true; // for (int i = 0; i < list.size(); i++) // { // if (first) // { // ret.append("").append( // ((ITreeNode) list.get(i)).getId()); // first = false; // } // else // ret.append("##").append("").append( // ((ITreeNode) list.get(i)).getId()); // // } // } // return ret.toString(); // } /** * @return String */ public String getImageFolder() { return StringUtil.getRealPath(request, getPath(imageFolder)); } private String getPath(String path) { if (path == null) return path; path = StringUtil.replaceAll(path, "\\\\", "/"); if (path.endsWith("/")) return path; return path.concat("/"); } /** * 获取单选框的代码 * * @return String */ public String getRadio() { String value = this.getRadioValue(); // System.out.println("value:"+value); // System.out.println("radio:"+radio); // 如果没有设置单选框的名称,或者单选框的值为null时,不生成相应的单选框 if (radio == null || radio.trim().equals("") || value == null) return ""; String checked = ""; Map params = this.element.getNode().getParams(); boolean disabled = false; boolean bchecked = false; if(params != null) { Boolean btemp = (Boolean)params.get("node_radiodisabled"); if(btemp != null) disabled = btemp.booleanValue(); btemp = (Boolean)params.get("node_radiochecked"); if(btemp != null) bchecked = btemp.booleanValue(); String node_radioname = (String)params.get("node_radioname"); if(node_radioname != null && !node_radioname.equals("")) { radio = node_radioname; } } if(bchecked) { checked = "checked"; } else if (getRadioDefaultValue() != null && getRadioDefaultValue().equals(value)) checked = "checked"; StringBuilder ret = new StringBuilder(); ret.append("<input type='radio' id='").append(radio).append( "' name='").append(radio).append( "' value='"); if (value == null) ret.append(nodeId); else ret.append(value); ret.append("' "); if(disabled) { ret.append(" disabled "); } ret.append(checked).append(" ").append( this.getRadioExtention()).append(">"); return ret.toString(); // return radio == null // ? "" // : new Input() // .setType("radio") // .setName(radio) // .setValue(nodeId) // .setChecked(this.getRadioDefaultValue().equals(nodeId)) // .toString(); } /** * @return target */ public String getTarget() { return target; } /** * @param string */ public void setTarget(String string) { target = string; } /** * @param string */ public void setLocalAction(String string) { localAction = string; } public void setExtendString(String string) { extendString = string; } /** * @return String */ public String getExtendString() { return extendString == null ? "" : extendString; } /** * 复选框的缺省值,以"$$"分隔 * * @return String[] */ public String[] getCheckBoxDefaultValues() { // String value = getCheckBoxDefaultValue(); // if (value == null) // return null; // // System.out.println("check box default values:" + value); // String[] ret = StringUtil.split(value, "\\$\\$"); // // for(int i = 0; i < ret.length; i ++) // // System.out.println("ret[" + i + "]:" + ret[i]); return this.checkBoxDefaultValue; } /** * @return String */ public String[] getCheckBoxDefaultValue() { return checkBoxDefaultValue; } /** * @return String */ public String getRadioDefaultValue() { return radioDefaultValue; } /** * @param string */ public void setCheckBoxDefaultValue(String[] string) { checkBoxDefaultValue = string; } /** * @param string */ public void setRadioDefaultValue(String string) { radioDefaultValue = string; } /** * 获取复选框的扩展代码 * * @return String[] */ public String getCheckBoxExtention() { return checkBoxExtention == null ? "" : checkBoxExtention; } /** * @param string */ public void setCheckBoxExtention(String string) { checkBoxExtention = string; } /** * @return String */ public String getRadioExtention() { return radioExtention == null ? "" : radioExtention; } /** * @param string */ public void setRadioExtention(String string) { radioExtention = string; } /** * @return String */ public String getCheckboxValue() { return checkboxValue; } /** * @return String */ public String getRadioValue() { return radioValue; } /** * @param string */ public void setCheckboxValue(String string) { checkboxValue = string; } /** * @param string */ public void setRadioValue(String string) { radioValue = string; } /** * 锁定到当前页面的焦点节点 Description: * * @return String */ public static void getCatchScript(StringBuilder ret, HttpServletRequest request, String curNodeId) { String anchor = request.getParameter("collapse"); if (anchor == null) { // return ""; anchor = request.getParameter("expand"); } if (anchor == null) return; // StringBuilder ret = new StringBuilder(); // ret.append("<tr><td><a id='anchor_id' // href='#").append(anchor).append("></a>"); // ret.append("<tr><td><A id=\"anchor_id\" // HREF=\"#icon_").append(anchor).append("\"></A>"); // ret.append("<script language='javascript'><!--\r\n") // .append("anchor_id.click();") // .append("\r\n//--></script></td></tr>"); if (curNodeId.equals(anchor)) { ret.append("<A id=\"anchor_id\" HREF=\"#icon_").append(anchor) .append("\"></A>"); ret.append("<script language='javascript'><!--\r\n").append( "anchor_id.click();").append("\r\n//--></script>"); } // return ret.toString(); } public static void getSelectedScript(StringBuilder buffer,ITree tree,String treeid) { Template tpl = VelocityUtil.getTemplate("tree.vm"); VelocityContext context = new VelocityContext(); context.put("isStaticDynamic",new Boolean(tree.isStaticDynamic())); context.put("isStatic",new Boolean(tree.isStatic())); context.put("tree", treeid); context.put("rootid", tree.getRoot().getId()); try { StringWriter out = new StringWriter(); tpl.merge(context,out); out.flush(); String temp = out.toString(); buffer.append(temp); out.close(); } catch (ResourceNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseErrorException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MethodInvocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void getInitScript(StringBuilder ret, String selectedNode,String contextpath) { // StringBuilder ret = new StringBuilder(); ret.append("<script language=\"javascript\">"); ret.append(" var selectNode;"); if (selectedNode != null) { ret.append("selectNode = \"").append(selectedNode).append("\";"); } ret.append("</script >"); } public static void main(String args[]) { // String[] temp = StringUtil.split("aaa$$www","\\$\\$"); // System.out.println(temp.length); // System.out.println(temp[0]); // System.out.println(temp[1]); System.out.println("堃"); System.out.println(System.getProperties()); } public void setScope(String scope) { this.scope = scope; } /** * Description: * * @return String */ public String getScope() { return scope; } /** * @return Returns the isCollapse. */ public boolean isCollapse() { return isCollapse; } /** * @return Returns the params. */ public String getParams() { return params; } public boolean isDoubleEvent() { return doubleEvent; } /** * @param params * The params to set. */ public void setParams(String params) { this.params = params; } /** * @param b */ public void setNowrap(boolean nowrap) { this.nowrap = nowrap; } public void setDoubleEvent(boolean doubleEvent) { this.doubleEvent = doubleEvent; } public void setEnablecontextmenu(boolean b) { enablecontextmenu = b; } public boolean isEnablecontextmenu() { return enablecontextmenu; } // public boolean isDynamic() // { // return dynamic; // } private boolean includeRootNode = true; public void setTree(ITree itree) { this.itree = itree; } // public void setDynamic(boolean dynamic) // { // this.dynamic = dynamic; // } public void setRecursive(boolean recursive) { this.recursive = recursive; } public void setCheckboxOnchange(String onchange) { this.checkboxOnchange = onchange; } public String getCheckboxOnchange() { return checkboxOnchange; } public boolean isRecursive() { return recursive; } public boolean isUprecursive() { return uprecursive; } public void setUprecursive(boolean uprecursive) { this.uprecursive = uprecursive; } public boolean isIncludeRootNode() { return includeRootNode; } public void setIncludeRootNode(boolean includeRootNode) { this.includeRootNode = includeRootNode; } }