/*****************************************************************************
* *
* 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.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import org.apache.log4j.Logger;
import org.frameworkset.util.I18NUtil;
import com.frameworkset.common.tag.BaseTag;
import com.frameworkset.common.tag.tree.COMTree;
import com.frameworkset.common.tag.tree.TreeFactory;
/**
* 设置获取树的节点数据信息,为构造树节点构造树节点
* @author biaoping.yin
* created on 2005-3-25
* version 1.0
*/
public class TreeData extends BaseTag {
private final static Logger log = Logger.getLogger(TreeData.class);
private boolean enablecontextmenu = false;
/**
* 树根节点checkbox 的值
*/
private String checkboxValue;
/**
* 定义树数据缓冲作用范围:
* request
* session
* pageContext
* 缺省为session
*
*/
private String scope = "request";
/**
* 树根节点radio按钮值
*/
private String radioValue;
/**
* 树根节点id
*/
private String rootid = "-1";
/**
* 树根节点名称
*/
private String rootName = "根节点";
private String rootNameCode;
/**
* 树默认展开层级
*/
private String expandLevel = "1";
/**
* 单选模式,true:单选,false:多选
*/
private String singleSelection = "false";
/**
* 是否实时监控每个节点的信息,包括节点是否存在、节点的名称、有没有儿子等信息
* true:实时
* false:每次只跟踪当前节点的信息
*/
private boolean needObserver = false;
/**
* 本属性控制是否及时刷新触发某个事件的焦点节点信息
*/
protected boolean refreshNode = true;
private String treetype = "1";
/**
* 扩展条件,通过该条件来过滤树的节点
*/
private String extCondition = "";
private String showRootHref = "true";
/**
* 定义根节点备注信息
*/
private String memo = "";
/**
* 指定是否对树节点进行排序,缺省为true
*/
private boolean sortable = false;
/**
* 根路径对应的文件路径
*/
private String path = null;
public int doEndTag() throws JspException
{
// this.checkboxValue = null;
// this.enablecontextmenu = false;
// this.expandLevel = "1";
// this.extCondition = "";
// this.id = null;
// this.memo = "";
// this.needObserver = false;
// this.path = null;
// this.radioValue = null;
// this.refreshNode = true;
// this.rootid = "-1";
// this.scope = "session";
// this.showRootHref = "true" ;
// this.singleSelection = "false";
// this.sortable = false;
// this.treetype = "1";
return super.doEndTag();
}
/**
* 根节点复选框的值
* @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;
}
public TreeData() {
}
private String getExtCondition() {
String extCondition = this.getHttpServletRequest().getParameter("extCondition");
if (extCondition == null)
extCondition = (String) this.getHttpServletRequest().getAttribute("extCondition");
return extCondition;
}
public boolean needloadroot(TreeTag parent)
{
String expandid = request.getParameter(parent.getExpandParam());
return expandid == null || this.getScope().equals("session");
}
public int doStartTag() {
TreeTag parent = (TreeTag) this.getParent();
//设置缓冲数据有效范围
parent.setScope(getScope());
parent.setEnablecontextmenu(this.isEnablecontextmenu());
String key = parent.getTree();
extCondition = getExtCondition();
String request_scope = this.getHttpServletRequest().getParameter("request_scope");
COMTree comTree = null;
HttpSession session = this.getSession();
HttpServletRequest request = this.getHttpServletRequest();
//从session中获取com tree
if(session != null &&getScope().equals("session"))
comTree = (COMTree) session.getAttribute(key);
//从pageContext中获取com tree
else if(getScope().equals("pageContext"))
comTree = (COMTree) pageContext.getAttribute(key);
//从request_session中获取com tree实例
// else if(session != null &&request_scope != null && request_scope.equals("request"))
else if(request_scope != null && request_scope.equals("request"))
{
// comTree = (COMTree) session.getAttribute(key);
comTree = (COMTree) request.getAttribute(key);
}
String parent_indent = request.getParameter("node_parent_indent");
if(comTree != null)
{
comTree.setPageContext(pageContext);
comTree.setNeedObservable(needObserver());
comTree.setRefreshNode(isRefreshNode());
comTree.setExtCondition(extCondition);
comTree.setEnablecontextmenu(this.isEnablecontextmenu());
comTree.setSortable(this.isSortable());
/**
* 如果第一次构建动静结合的右键菜单需要构建所有的类型右键菜单,
* 否则需要清除之前构建的所有节点类型的右键菜单
*/
if( parent_indent == null)
comTree.buildContextMenusWraper();
else
comTree.clearNodeContextmenus();
}
//如果名称为key的树已经在session中存在,则判断条件是否相同,如果不相同,需要重新初始化树
if (comTree != null
&& extCondition != null
&& !extCondition.trim().equals(comTree.getExtCondition())) {
int level = 1;
try
{
level = Integer.parseInt(getExpandLevel().trim());
}
catch(Exception e)
{
e.printStackTrace();
System.out.println("getExpandLevel():" + getExpandLevel());
}
//如果不允许折叠操作,则将树的默认展开层级增加100
if(!parent.isCollapse())
level += 100;
if(parent.getMode() == null)
{
comTree.setDynamic(parent.isDynamic());
}
else
{
comTree.setMode(parent.getMode());
}
comTree.setRecursive(parent.isRecursive());
comTree.setUprecursive(parent.isUprecursive());
comTree.setPartuprecursive(parent.isPartuprecursive());
comTree.loadTree(
getRootid(),
getI18NRootName(),
level,
showRootHref(),
getMemo(),getRadioValue(),getCheckboxValue(),path);
comTree.setSingleSelectionMode(singleSelection());
}
//如果名称为key的树在session中不存在,初始化相应类型的树,并存放到session中,名称为key
if (comTree == null) {
String type = getTreetype();
comTree = (COMTree) TreeFactory.getTreeData(type);
if (comTree == null) {
log.info(
"type " + type + " not found in treedata.properties!!");
return SKIP_BODY;
}
comTree.setPageContext(pageContext);
comTree.setNeedObservable(needObserver());
comTree.setRefreshNode(isRefreshNode());
comTree.setSortable(this.isSortable());
if (extCondition != null)
comTree.setExtCondition(extCondition);
int level = Integer.parseInt(getExpandLevel());
// 如果不允许折叠操作,则将树的默认展开层级增加100
if(!parent.isCollapse())
level += 100;
comTree.setEnablecontextmenu(this.isEnablecontextmenu());
comTree.buildContextMenusWraper();
if(parent.getMode() == null)
{
comTree.setDynamic(parent.isDynamic());
}
else
{
comTree.setMode(parent.getMode());
}
comTree.setRecursive(parent.isRecursive());
comTree.setUprecursive(parent.isUprecursive());
comTree.setPartuprecursive(parent.isPartuprecursive());
if(needloadroot(parent))
{
comTree.loadTree(
getRootid(),
getI18NRootName(),
level,
showRootHref(),
getMemo(),getRadioValue(),getCheckboxValue(),path);
}
else
{
comTree.addExpandListener();
comTree.addCollapseListener();
comTree.addSelectListener();
comTree.level = level;
}
comTree.setSingleSelectionMode(singleSelection());
//缓冲已初始化的com tree到session中
if(session != null && getScope().equals("session"))
session.setAttribute(key, comTree);
//缓冲已初始化的com tree到request_session 中
// else if(session != null && getScope().equals("request"))
// session.setAttribute(key, comTree);
else if( getScope().equals("request"))
request.setAttribute(key, comTree);
else if(getScope().equals("pageContext"))
pageContext.setAttribute(key, comTree);
}
return SKIP_BODY;
}
/**
* Access method for the treetype property.
*
* @return the current value of the treetype property
*/
public String getTreetype() {
return treetype == null ? "1" : treetype;
}
/**
* Sets the value of the treetype property.
*
* @param aTreetype the new value of the treetype property
*/
public void setTreetype(String aTreetype) {
treetype = aTreetype;
}
/**
* @return String
*/
public String getExpandLevel() {
return expandLevel == null ? "1" : expandLevel;
}
/**
* @return boolean
*/
public boolean needObserver() {
return needObserver ;
}
/**
* @return String
*/
public String getRootid() {
return rootid == null ? "-1" : rootid;
}
/**
* @return String
*/
public String getRootName() {
return rootName;
}
/**
* @return String
*/
public String getI18NRootName() {
if(this.getRootNameCode() == null)
{
return this.getRootName();
}
else
{
return I18NUtil.getI18nMessage(this.getRootNameCode(), this.rootName, request);
}
}
/**
* @return boolean
*/
public boolean singleSelection() {
return singleSelection == null
? true
: new Boolean(singleSelection).booleanValue();
}
/**
* @param string
*/
public void setExpandLevel(String string) {
expandLevel = string;
}
/**
* @param string
*/
public void setNeedObserver(boolean string) {
needObserver = string;
}
/**
* @param string
*/
public void setRootid(String string) {
rootid = string;
}
/**
* @param string
*/
public void setRootName(String string) {
rootName = string;
}
/**
* @param string
*/
public void setSingleSelection(String string) {
singleSelection = string;
}
/**
* Description:
* @return
* String
*/
public boolean showRootHref() {
return showRootHref == null
? true
: !showRootHref.equalsIgnoreCase("false");
}
/**
* Description:
* @param string
* void
*/
public void setShowRootHref(String string) {
showRootHref = string;
}
/**
* @return String
*/
public String getMemo() {
return memo;
}
/**
* @param string
*/
public void setMemo(String string) {
memo = string;
}
/**
* Description:
* @return
* boolean
*/
public boolean isRefreshNode() {
return refreshNode;
}
/**
* Description:
* @param b
* void
*/
public void setRefreshNode(boolean b) {
refreshNode = b;
}
/**
* Description:
* @return
* String
*/
public String getScope() {
return scope;
}
public String getPath() {
return path;
}
/**
* Description:
* @param string
* void
*/
public void setScope(String string) {
scope = string;
}
public void setPath(String path) {
this.path = path;
}
public boolean isEnablecontextmenu() {
return enablecontextmenu;
}
public void setEnablecontextmenu(boolean enablecontextmenu) {
this.enablecontextmenu = enablecontextmenu;
}
public boolean isSortable()
{
return sortable;
}
public void setSortable(boolean sortable)
{
this.sortable = sortable;
}
public String getRootNameCode() {
return rootNameCode;
}
public void setRootNameCode(String rootNameCode) {
this.rootNameCode = rootNameCode;
}
@Override
public void doFinally() {
enablecontextmenu = false;
/**
* 树根节点checkbox 的值
*/
checkboxValue = null;
/**
* 定义树数据缓冲作用范围:
* request
* session
* pageContext
* 缺省为session
*
*/
scope = "request";
/**
* 树根节点radio按钮值
*/
radioValue= null;
/**
* 树根节点id
*/
rootid = "-1";
/**
* 树根节点名称
*/
rootName = "根节点";
rootNameCode = null;
/**
* 树默认展开层级
*/
expandLevel = "1";
/**
* 单选模式,true:单选,false:多选
*/
singleSelection = "false";
/**
* 是否实时监控每个节点的信息,包括节点是否存在、节点的名称、有没有儿子等信息
* true:实时
* false:每次只跟踪当前节点的信息
*/
needObserver = false;
/**
* 本属性控制是否及时刷新触发某个事件的焦点节点信息
*/
refreshNode = true;
treetype = "1";
/**
* 扩展条件,通过该条件来过滤树的节点
*/
extCondition = "";
showRootHref = "true";
/**
* 定义根节点备注信息
*/
memo = "";
/**
* 指定是否对树节点进行排序,缺省为true
*/
sortable = false;
/**
* 根路径对应的文件路径
*/
path = null;
super.doFinally();
}
}