/**
* Author: crazy_rain
* Date: 2007-2-7
* Time: 下午01:35:43
* Introduction:树形控件,实现Tree对象和WebFXTree/WebFXTreeItem的转换
*/
public class Tree {
/**
* 该树的父节点
*/
private Tree parent;
/**
* 该树的子节点
*/
private Tree child;
/**
* 该树的兄弟节点
*/
private Tree brother;
/**
* 树上显示的标题
*/
private String label;
/**
* 点击菜单时触发的js 脚本
*/
private String script;
/**
* 定义与该对象对应的js变量的标识组成部分之一
*/
private int variableId = count++;
/**
* 变量计数器
*/
private static int count = 0;
/**
* 树形节点js变量命名前缀
*/
public static String prefix = "node_";
/**
* 是否该树只包含文件夹形式(whether this tree contains only folders)
*/
public static boolean ONLY_FOLDER = false;
/**
* 默认构造函数
*/
private Tree() {
}
/**
* 获取一棵空树
*
* @return Tree
*/
public static Tree getEmptyTree() {
return new Tree();
}
/**
* 构造一个树形控件并初始化上面显示的文字和点击时触发的动作
*
* @param label 树形控件上显示的文字
* @param script 点击树形控件时触发的动作
*/
public Tree(String label, String script) {
this.label = label;
this.script = script;
}
/**
* 构造一个树形控件并初始化上面显示的文字
*
* @param label 树形控件上显示的文字
*/
public Tree(String label) {
this.label = label;
}
/**
* 判断当前节点是否是根节点
*
* @return boolean 如果是根节点,返回true
*/
public boolean isRoot() {
return null == this.parent;
}
/**
* 获取树定义的变量名称
*
* @return 树定义的变量名称
*/
private String variable() {
if (this.parent == null)
return "root";
return prefix + this.variableId;
}
/**
* 生成树形控件Tree 对应的javascript 代码
*
* @param tree 待生成js代码的树形控件对象
* @return js 返回生成 tree 代表的树形控件的js代码
*/
public static String generateJS(Tree tree) {
StringBuffer buffer = new StringBuffer();
if (tree.isRoot()) {
// is root,generate root
buffer.append(generateRoot(tree));
} else {
// not root,generate item
buffer.append(generateItem(tree));
}
if (tree.child != null) { // has child
buffer.append(generateJS(tree.child));
}
if (tree.brother != null) { //has brother
buffer.append(generateJS(tree.brother));
}
return buffer.toString();
}
/**
* 获取生成该树形控件的js代码
*
* @return js 能生成该对象所代表的树形控件的js代码
*/
public String getTree() {
return generateJS(this) + "/ndocument.write(root);";
}
/**
* 生成树的根
*
* @param tree 树根节点
* @return root 生成树根的js
*/
private static String generateRoot(Tree tree) {
String root = "var root = new WebFXTree(/"" + tree.label + "/");/n";
if (ONLY_FOLDER) {
root += "root.setBehavior('explorer');/n";
} else {
root += "root.setBehavior('classic');/n";
}
return root;
}
/**
* 生成一个树节点
*
* @param tree 树节点对象
* @return treeItem 树节点的js代码
*/
private static String generateItem(Tree tree) {
String treeItem = "/n"
+ "var " + prefix + tree.variableId + "= new WebFXTreeItem(/"" + tree.label + "/"";
if (null == tree.script) {
treeItem += ");";
} else {
treeItem += ",/"" + tree.script + "/");";
}
treeItem += "/n" + tree.parent.variable() + ".add(" + tree.variable() + ");";
return treeItem;
}
/**
* 为当前节点添加子节点
*
* @param child 待添加的子节点
* @return child 被添加的子节点
*/
public Tree addChild(Tree child) {
if (this.child != null) {
//has child ,add the given child as the younger brother of the elder child
Tree elder = this.child;
return elder.addBrother(child);
} else {
//has no child,add this as the first child
this.child = child;
child.parent = this;
}
return child;
}
/**
* 添加子节点
*
* @param label 子节点上显示的名称
* @param script 点击子节点时触发的动作
* @return Tree 被添加的子树节点
*/
public Tree addChild(String label, String script) {
Tree son = new Tree(label, script);
return addChild(son);
}
/**
* 添加子节点
*
* @param label 子节点上显示的名称
* @return child 被添加的子树节点
*/
public Tree addChild(String label) {
return addChild(label, null);
}
/**
* 添加当前树节点的兄弟节点
*
* @param younger 待添加的兄弟节点
* @return Tree 被添加的兄弟节点
*/
public Tree addBrother(Tree younger) {
if (isRoot()) {
// if this is the root ,add the given node as brother
return addChild(younger);
}
Tree elder = this;
//get the youngest brother
while (elder.brother != null) {
elder = elder.brother;
}
//add the younger as the yongest brother
elder.brother = younger;
younger.parent = elder.parent;
return younger;
}
/**
* 为当前节点添加兄弟节点
*
* @param label 兄弟节点上显示的文字
* @param script 点击兄弟节点时触发的动作
* @return Tree 被添加的兄弟节点
*/
public Tree addBrother(String label, String script) {
Tree younger = new Tree(label, script);
return addBrother(younger);
}
/**
* 为当前节点添加兄弟节点
*
* @param label 兄弟节点上显示的文字
* @return Tree 被添加的兄弟节点
*/
public Tree addBrother(String label) {
return addBrother(label, null);
}
/**
* 返回当前节点的最终根节点
*
* @return root 当前节点的最终根节点
*/
public Tree getRoot() {
Tree tree = this;
while (tree.parent != null) {
tree = tree.parent;
}
return tree;
}
/**
* 获取点击树形控件时触发的动作
*
* @return script 点击树形控件时触发的动作
*/
public String getScript() {
return script;
}
/**
* 设置点击树形控件时触发的动作
*
* @param script 待设置的动作
*/
public void setScript(String script) {
this.script = script;
}
/**
* 获取树形控件上显示的文字
*
* @return label 树形控件上显示的文字
*/
public String getLabel() {
return label;
}
/**
* 设置树形控件上显示的文字
*
* @param label 待显示的文字
*/
public void setLabel(String label) {
this.label = label;
}
public String toString() {
return this.label;
}
}