package com.ycsoft.commons.tree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import com.ycsoft.beans.prod.PProd;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.helper.StringHelper;
/**
* 创建Tree的类
*
* @author hh
* @data Mar 19, 2010 4:08:00 PM
*/
public class TreeBuilder {
public static List<TreeNode> createTree(List<Tree> src){
return createTree( src,null);
}
/**
* 创建一个没有根节点的树,
* @param src 必须按照节点的顺序排序
* @param checked null 不显示复选框,true 勾选复选框 ,false 不勾选复选框
* @return
*/
public static List<TreeNode> createTree(List<Tree> src,Boolean checked){
List<TreeNode> target = new ArrayList<TreeNode>();
Map<String,TreeNode> tempMap = new HashMap<String,TreeNode>();
for (Tree tree : src){
TreeNode node = new TreeNode();
tree.transform( node );
node.setChecked(checked);
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
TreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
removeNullNode(target);
return target;
}
public static List<TreeNode> createAdreeTree(List<Tree> src,boolean falseChildren){
List<TreeNode> target = new ArrayList<TreeNode>();
Map<String,TreeNode> tempMap = new HashMap<String,TreeNode>();
for (Tree tree : src){
TreeNode node = new TreeNode();
node.setChildren(null);
tree.transform( node );
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
TreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
if(parentNode.getChildren() == null){
parentNode.setChildren(new ArrayList<TreeNode>());
}
parentNode.setExpanded(true);
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
if(falseChildren){
removeNullNode(target);
}
return target;
}
public static List<AddrTreeNode> createSysAdreeTree(List<AddrTree> src){
List<AddrTreeNode> target = new ArrayList<AddrTreeNode>();
Map<String,AddrTreeNode> tempMap = new HashMap<String,AddrTreeNode>();
for (AddrTree tree : src){
AddrTreeNode node = new AddrTreeNode();
node.setChildren(null);
tree.transform( node );
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
AddrTreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
if(parentNode.getChildren() == null){
parentNode.setChildren(new ArrayList<AddrTreeNode>());
}
parentNode.setExpanded(true);
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
return target;
}
public static List<AddrTreeNode> createSysTree(List<AddrTree> src,boolean isExpanded){
List<AddrTreeNode> target = new ArrayList<AddrTreeNode>();
Map<String,AddrTreeNode> tempMap = new HashMap<String,AddrTreeNode>();
for (AddrTree tree : src){
AddrTreeNode node = new AddrTreeNode();
node.setChildren(null);
tree.transform( node );
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
AddrTreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
if(parentNode.getChildren() == null){
parentNode.setChildren(new ArrayList<AddrTreeNode>());
}
if(isExpanded){
parentNode.setExpanded(true);
}
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
return target;
}
public static List<TreeNode> createAdreeSynchronousTree(List<Tree> src){
List<TreeNode> target = new ArrayList<TreeNode>();
Map<String,TreeNode> tempMap = new HashMap<String,TreeNode>();
for (Tree tree : src){
TreeNode node = new TreeNode();
tree.transform( node );
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
TreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
parentNode.setExpanded(true);
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
return target;
}
/**
* 复选框树,src已经设定好Checked的值
*/
public static List<TreeNode> createTreeCheck(List<Tree> src){
List<TreeNode> target = new ArrayList<TreeNode>();
Map<String,TreeNode> tempMap = new HashMap<String,TreeNode>();
for (Tree tree : src){
TreeNode node = new TreeNode();
tree.transform( node );
//如果不是叶子节点,直接修改
if(StringHelper.isNotEmpty(node.getIs_leaf()) && node.getIs_leaf().equals("F")){
node.setLeaf(false);
node.setCls("fold");
}
TreeNode parentNode = tempMap.get( node.getPid() );
if (parentNode == null){
target.add(node);
} else {
parentNode.getChildren().add( node );
parentNode.setLeaf(false);
parentNode.setCls("fold");
}
tempMap.put( node.getId() , node);
}
removeNullNode(target);
return target;
}
public static boolean removeNullNode(List<TreeNode> target) {
boolean flag = true;//true 表示所有儿子都删除了
List<TreeNode> dels = new ArrayList<TreeNode>();
for (TreeNode t : target) {
if (t.isLeaf()) {
//叶子不删除
flag = false;
} else{
//不是叶子
if (t.getChildren()!=null && t.getChildren().size() > 0) {
//有儿子
if (removeNullNode(t.getChildren()))
dels.add(t);
else{
flag = false;
}
}else{
//没有儿子
dels.add(t);
}
}
}
for (TreeNode t : dels) {
target.remove(t);
}
return flag;
}
/**
* 将给定的List 对象转化为List TreeNode对象
* @param lst
* @return
*/
public static List<TreeNode> convertToNodes (List<?> lst, String id, String text)throws Exception{
List<TreeNode> target = new LinkedList<TreeNode>();
TreeNode _t = null;
for (Object v : lst) {
_t = new TreeNode();
_t.setId( BeanUtils.getProperty( v, id ) );
_t.setText( BeanUtils.getProperty( v, text ) );
target.add(_t);
}
return target;
}
/**
* 将给定的List 对象转化为List TreeNode对象
* @param lst
* @return
*/
public static List<TreeNode> convertToProdNodes (List<PProd> lst, String id, String text)throws Exception{
List<TreeNode> target = new LinkedList<TreeNode>();
TreeNode _t = null;
for (PProd v : lst) {
_t = new TreeNode();
_t.setId( BeanUtils.getProperty( v, id ) );
if(v.getIs_invalid().equals(SystemConstants.BOOLEAN_TRUE)){
_t.setText( "<font color=red>"+BeanUtils.getProperty( v, text )+"</font>" );
}else{
_t.setText( BeanUtils.getProperty( v, text ) );
}
_t.getOthers().put("optrId", v.getOptr_id());
_t.getOthers().put("countyId", v.getCounty_id());
target.add(_t);
}
return target;
}
}