package Test;

import java.util.*;

import javax.servlet.http.HttpServletRequest;

public class DataTree {
	protected String idField = "id";
    protected String pidField = "pid";
    protected String nodesField = "children";

    protected String rootId = "-1";
    protected String leafField = "isLeaf";
    protected String levelField = "_level";
    protected String expandedField = "expanded";
 
    protected ArrayList tree = new ArrayList();     //树形数据
    protected ArrayList list = new ArrayList();     //列表数据
    protected ArrayList dataview = null;            //数据视图:折叠

    protected HashMap idMaps = new HashMap();

    public DataTree(String idField, String pidField, String nodesField)
    {
        this.idField = idField;
        this.pidField = pidField;
        this.nodesField = nodesField;
    }
    /// <summary>
    /// 加载列表数据
    /// </summary>
    /// <param name="list"></param>
    public void LoadList(ArrayList list)
    {
        if (list == null) list = new ArrayList();
        ArrayList tree = TreeUtil.ToTree(list, nodesField, idField, pidField);
        Load(tree);
    }
    /// <summary>
    /// 加载树形数据
    /// </summary>
    /// <param name="tree"></param>
    public void Load(ArrayList tree)
    {
        //节点必须有idField
        if (tree == null) tree = new ArrayList();
        list = TreeUtil.ToList(tree, "-1", nodesField, idField, pidField);
        dataview = null;

        //idField存储哈希,便于快速检索
        idMaps = new HashMap();
        for (int i = list.size() - 1; i >= 0; i--)
        {
            HashMap node = (HashMap)list.get(i);
            idMaps.put(node.get(idField).toString(), node);
        }

        //遍历列表,生成leafField, levelField
        for (int i = list.size() - 1; i >= 0; i--)
        {
            HashMap node = (HashMap)list.get(i);
            String id = node.get(idField).toString();
            ArrayList nodes = (ArrayList)node.get(nodesField);
            node.put(leafField, (nodes == null || nodes.size() == 0) ? true : false);
            node.put(levelField, GetAncestors(id).size());
        }

        //清除折叠信息
        _collapseNodes = new ArrayList();
        DoExpandeds();

        //清除过滤信息
        filtered = null;
    }        
    public int GetTotalCount()
    {
        return GetDataView().size();
    }
    public ArrayList GetPagedData(int pageIndex, int pageSize)
    {
        //1)折叠后的数据视图
        ArrayList list = GetDataView();

        //2)返回分页数据
        int pages = list.size() / pageSize;
        if (pages * pageSize < list.size()) pages += 1;

        if (pageIndex > pages - 1) pageIndex = pages - 1;

        ArrayList nodes = new ArrayList();
        int start = pageIndex * pageSize;
        int end = (pageIndex + 1) * pageSize;

        for (int i = start; i < end; i++)
        {
            if (i > list.size() - 1 || i < 0) continue;
            HashMap node = (HashMap)list.get(i);
            if (node == null)
            {
                continue;
            }
            nodes.add(node);
        }

        return CloneNodes(nodes);            
    }

    //////////////////////////////////////////////////////////////////////////////////
    protected ArrayList _collapseNodes = new ArrayList();
    public void SetRequest(HttpServletRequest request)
    {
    	String s = request.getParameter("__ecconfig");
        if (!StringUtil.isNullOrEmpty(s))
        {
            HashMap config = (HashMap)JSON.Decode(s);
            _collapseNodes = (ArrayList)config.get("collapseNodes");

            if (_collapseNodes == null) _collapseNodes = new ArrayList();
        }
        DoExpandeds();
        dataview = null;
    }
    protected void DoExpandeds()
    {
        //处理expandedField
        for (int i = 0, l = list.size(); i < l; i++)
        {
            HashMap node = (HashMap)list.get(i);
            node.remove(expandedField);
        }
        for (int i = 0, l = _collapseNodes.size(); i < l; i++)
        {
            String id = _collapseNodes.get(i).toString();
            HashMap node = GetNode(id);
            node.put(expandedField, false);
        }
    }
    //////////////////////////////////////////////////////////////////////////////////
    /// <summary>
    /// 获取数据视图:过滤、折叠后
    /// </summary>
    /// <returns></returns>
    public ArrayList GetDataView()
    {
        if (dataview == null)
        {                
            //expanded
            ArrayList data = new ArrayList();
            for (int i = 0,l=list.size(); i<l; i++)
            {
                HashMap node = (HashMap)list.get(i);
                if (IsVisibleNode(node))
                {
                    data.add(node);
                }
            }

            //filter
            if (filtered != null)
            {
                //1)缓存过滤节点和父节点
                HashMap filterMaps = new HashMap();
                for (int i = 0, l = filtered.size(); i < l; i++)
                {
                    HashMap node = (HashMap)filtered.get(i);
                    String id = node.get(idField).toString();
                    if (filterMaps.get(id) == null) filterMaps.put(id, node);

                    ArrayList ans = GetAncestors(id);
                    for (int j = 0, k = ans.size(); j < k; j++)
                    {
                        HashMap pnode = (HashMap)ans.get(j);
                        String pid = pnode.get(idField).toString();
                        if (filterMaps.get(pid) == null) filterMaps.put(pid, pnode);
                    }
                }
                //2)data删除所有不存在filterMaps中的节点
                for (int i = data.size() - 1; i >= 0; i--)
                {
                    HashMap node = (HashMap)data.get(i);
                    String id = node.get(idField).toString();
                    if (filterMaps.get(id) == null)
                    {
                        data.remove(i);
                    }
                }

            }
                                
            dataview = data;
        }
        return dataview;
    }
    protected ArrayList filtered = null;
    /// <summary>
    /// 设置过滤后的节点数组
    /// </summary>
    /// <param name="nodes"></param>       
    public void SetFiltered(ArrayList nodes)
    {
        filtered = nodes;
        dataview = null;
    }
    //////////////////////////////////////////////////////////////////////////////////
    public ArrayList GetAncestors(String id)
    {
        ArrayList ans = new ArrayList();
        while (true)
        {
            HashMap parentNode = GetParentNode(id);
            if (parentNode == null) break;
            ans.add(parentNode);
            id = parentNode.get(pidField).toString();
        }        
        reverseArray(ans);
        return ans;
    }        
    public HashMap GetParentNode(String pid)
    {
        return (HashMap)idMaps.get(pid);
    }
    public ArrayList GetChildNodes(String id)
    {
        HashMap node = (HashMap)idMaps.get(id);
        if (node == null) return null;
        return (ArrayList)node.get(nodesField);
    }
    public HashMap GetNode(String id)
    {
        return (HashMap)idMaps.get(id);
    }
    protected Boolean IsVisibleNode(HashMap node)
    {
        HashMap parent = GetParentNode(node.get(pidField).toString());
        if (parent == null) return true;
        if (parent.get(expandedField) == null) return IsVisibleNode(parent);
        if ((Boolean)parent.get(expandedField) == false) return false;
        return true;
    }
    protected ArrayList CloneNodes(ArrayList nodes)
    {
        ArrayList clone = (ArrayList)JSON.Decode(JSON.Encode(nodes));
        for (int i = 0, l = clone.size(); i < l; i++)
        {
            HashMap node = (HashMap)clone.get(i);
            node.remove(nodesField);
        }
        return clone;
    }
    protected static void reverseArray(List b) {
  	   int left  = 0;          // index of leftmost element
  	   int right = b.size()-1; // index of rightmost element
  	 
  	   while (left < right) {
  	      // exchange the left and right elements
  	      Object temp = b.get(left); 
  	      b.set(left, b.get(right)); 
  	      b.set(right, temp);  
  	      // move the bounds toward the center
  	      left++;
  	      right--;
  	   }
  	}
}
最近下载更多
wusiyin  LV14 2022年9月15日
askeydingxu2020  LV8 2020年11月28日
skipple3  LV39 2020年11月19日
xcj456  LV8 2020年9月12日
hzhsh0223  LV18 2020年3月7日
yfsh123  LV6 2019年8月9日
y_yuyongyi  LV1 2019年8月7日
wanglong_wang  LV13 2019年8月1日
zbchen2008  LV6 2019年7月9日
丷夏空丷  LV4 2019年5月19日
最近浏览更多
膜拜java  LV6 1月18日
liyang64 2023年12月14日
暂无贡献等级
fesfefe  LV13 2023年11月1日
edpwyg  LV14 2023年10月21日
liangshao  LV1 2023年5月2日
451804671 2023年3月22日
暂无贡献等级
abc562311934  LV4 2022年10月8日
wusiyin  LV14 2022年9月15日
微信网友_6131171360329728  LV2 2022年9月13日
刘亦菲9527  LV15 2022年8月24日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友