OSDN Git Service

video
[smackclient/smackclient.git] / app / src / main / java / cc / minsnail / tools / TreeHelper.java
1 package cc.minsnail.tools;
2
3 import java.lang.reflect.Field;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import cc.minsnail.annotation.TreeNodeId;
8 import cc.minsnail.annotation.TreeNodeLable;
9 import cc.minsnail.annotation.TreeNodePid;
10 import cc.minsnail.beans.YgTreeNode;
11 import cc.minsnail.beans.YgUserNode;
12
13 /**
14  * Created by yg on 2016/10/28.
15  */
16 public class TreeHelper {
17     public static <T> List<YgTreeNode> toNode(List<YgUserNode> datas) throws IllegalAccessException {
18         List<YgTreeNode> nodes = new ArrayList<>();
19         for (YgUserNode t : datas) {
20             YgTreeNode node = new YgTreeNode();
21             node.setId(t.getId());
22             node.setPid(t.getPid());
23             node.setJid(t.getJid());
24             node.setUserName(t.getUserName());
25             node.setName(t.getName());
26 //           Class clazz = t.getClass();
27 //            Field[] fields = clazz.getFields();
28 //            for (Field field:fields){
29 //                if (field.getAnnotation(TreeNodeId.class)!=null){
30 //                    field.setAccessible(true);
31 //                    id = field.getInt(t);
32 //                }
33 //                if (field.getAnnotation(TreeNodePid.class)!=null){
34 //                    field.setAccessible(true);
35 //                    pid = field.getInt(t);
36 //                }
37 //                if (field.getAnnotation(TreeNodeLable.class)!=null){
38 //                    field.setAccessible(true);
39 //                    lable = (String) field.get(t);
40 //                }
41 //            }
42             nodes.add(node);
43         }
44         //确定父节点叶子节点关系
45         for (int i = 0; i < nodes.size(); i++) {
46             YgTreeNode node1 = nodes.get(i);
47             for (int j = i + 1; j < nodes.size(); j++) {
48                 YgTreeNode node2 = nodes.get(j);
49                 if (node2.getPid() == node1.getId()) {
50                     node1.getChildren().add(node2);
51                     node2.setParent(node1);
52                 } else if (node1.getPid() == node2.getId()) {
53                     node2.getChildren().add(node1);
54                     node1.setParent(node2);
55                 }
56             }
57         }
58         return nodes;
59     }
60
61     public static <T> List<YgTreeNode> getSortedNodes(List<YgUserNode> datas, int defaultExpandLevel) throws IllegalAccessException {
62         List<YgTreeNode> result = new ArrayList<>();
63         List<YgTreeNode> nodes = toNode(datas);
64         List<YgTreeNode> rootNodes = getRootNodes(nodes);
65         for (YgTreeNode node : rootNodes) {
66             addNode(result, node, defaultExpandLevel, 1);
67         }
68         return result;
69     }
70
71     public static List<YgTreeNode> filterVisibleNodes(List<YgTreeNode> nodes) {
72         List<YgTreeNode> result = new ArrayList<>();
73         for (YgTreeNode node : nodes) {
74             if (node.isRoot() || node.isParentExpand()) {
75                 // TODO: 2016/10/28
76                 result.add(node);
77             }
78         }
79         return result;
80     }
81
82     private static void addNode(List<YgTreeNode> result, YgTreeNode node, int defaultExpandLevel, int currentLevel) {
83         result.add(node);
84         if (defaultExpandLevel >= currentLevel) {
85             node.setExpand(true);
86         }
87         if (node.isLeaf()) return;
88         for (int i = 0; i < node.getChildren().size(); i++) {
89             addNode(result, node.getChildren().get(i), defaultExpandLevel, currentLevel + 1);
90         }
91     }
92
93     private static List<YgTreeNode> getRootNodes(List<YgTreeNode> nodes) {
94         List<YgTreeNode> rootNodes = new ArrayList<>();
95         for (YgTreeNode node : nodes) {
96             if (node.isRoot()) {
97                 rootNodes.add(node);
98             }
99         }
100         return rootNodes;
101     }
102 }