1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
package org.kuali.student.common.ui.client.widgets.table; |
17 | |
|
18 | |
import org.kuali.student.common.ui.client.widgets.rules.Token; |
19 | |
|
20 | |
import com.google.gwt.user.client.ui.FlexTable; |
21 | |
|
22 | |
|
23 | |
|
24 | |
|
25 | |
|
26 | |
public class TreeTable extends FlexTable { |
27 | |
|
28 | |
public TreeTable() { |
29 | 0 | super(); |
30 | 0 | setBorderWidth(1); |
31 | 0 | } |
32 | |
|
33 | |
public NodeWidget getRootNodeWidget(){ |
34 | 0 | return (NodeWidget)super.getWidget(0, 0); |
35 | |
} |
36 | |
|
37 | |
private void initTable(Node root) { |
38 | 0 | super.clear(); |
39 | 0 | int column = root.getMaxLevelDistance() + 1; |
40 | 0 | int row = root.getAllLeafCount(); |
41 | |
|
42 | 0 | for (int i = 0; i < row; i++) { |
43 | 0 | for (int j = 0; j < column; j++) { |
44 | 0 | Node emptyNode = new Node(); |
45 | 0 | emptyNode.setUserObject("Empty:" + i + ":" + j); |
46 | 0 | setWidget(i, j, new NodeWidget(emptyNode)); |
47 | |
} |
48 | |
} |
49 | 0 | } |
50 | |
|
51 | |
public void buildTable(Node root) { |
52 | 0 | root = ExpressionParser.mergeBinaryTree(root); |
53 | |
|
54 | 0 | initTable(root); |
55 | 0 | buildTable(root, 0); |
56 | 0 | for (int i = 0; i < getRowCount(); i++) { |
57 | 0 | for (int j = getCellCount(i) - 1; j >= 0; j--) { |
58 | 0 | NodeWidget w = (NodeWidget) getWidget(i, j); |
59 | 0 | if (w.getNode().isLeaf() == false) { |
60 | 0 | mergeCellAcrossRow(i, j, w.getNode().getAllLeafCount() - 1); |
61 | |
} |
62 | |
} |
63 | |
} |
64 | 0 | for (int i = 0; i < getRowCount(); i++) { |
65 | 0 | for (int j = getCellCount(i) - 1; j >= 0; j--) { |
66 | 0 | NodeWidget w = (NodeWidget) getWidget(i, j); |
67 | 0 | if (w.getNode().getUserObject().toString().startsWith("Empty")) { |
68 | |
|
69 | 0 | NodeWidget n = ((NodeWidget) super.getWidget(i, j - 1)); |
70 | 0 | mergeCellAcrossColumn(i, j - 1); |
71 | 0 | setWidget(i, j - 1, n); |
72 | |
} |
73 | |
} |
74 | |
} |
75 | 0 | } |
76 | |
|
77 | |
private int getRowIndexAmongSibings(Node node) { |
78 | 0 | Node parent = node.getParent(); |
79 | 0 | if (parent == null) { |
80 | 0 | return 0; |
81 | |
} |
82 | |
|
83 | 0 | int count = getParentRowIndex(node); |
84 | 0 | for (int i = 0; i < parent.getChildCount(); i++) { |
85 | 0 | Node child = parent.getChildAt(i); |
86 | 0 | if (child == node) { |
87 | 0 | return count; |
88 | |
} |
89 | 0 | if (child.isLeaf()) { |
90 | 0 | count++; |
91 | |
} else { |
92 | 0 | count += child.getAllLeafCount(); |
93 | |
} |
94 | |
|
95 | |
} |
96 | 0 | return count; |
97 | |
} |
98 | |
|
99 | |
public NodeWidget getNodeWidget(Node node) { |
100 | 0 | NodeWidget result = null; |
101 | 0 | for (int i = 0; i < getRowCount(); i++) { |
102 | 0 | for (int j =0; j < getCellCount(i); j++) { |
103 | 0 | NodeWidget w = (NodeWidget) getWidget(i, j); |
104 | 0 | if (w.getNode() == node) { |
105 | 0 | return w; |
106 | |
} |
107 | |
} |
108 | |
} |
109 | 0 | return result; |
110 | |
} |
111 | |
|
112 | |
|
113 | |
|
114 | |
|
115 | |
|
116 | |
|
117 | |
public int getParentRowIndex(Node node) { |
118 | 0 | Node parent = node.getParent(); |
119 | 0 | if (parent == null) { |
120 | 0 | return 0; |
121 | |
} |
122 | 0 | for (int i = 0; i < getRowCount(); i++) { |
123 | 0 | for (int j = 0; j < getCellCount(i); j++) { |
124 | 0 | NodeWidget w = (NodeWidget) getWidget(i, j); |
125 | 0 | if (w.getNode() == node.getParent()) { |
126 | 0 | return i; |
127 | |
} |
128 | |
} |
129 | |
} |
130 | 0 | return 0; |
131 | |
} |
132 | |
|
133 | |
|
134 | |
|
135 | |
|
136 | |
|
137 | |
private void buildTable(Node<Token> node, int columnIndex) { |
138 | 0 | int rowIndex = getRowIndexAmongSibings(node); |
139 | 0 | setWidget(rowIndex, columnIndex, new NodeWidget(node)); |
140 | |
|
141 | 0 | for (int i = 0; i < node.getChildCount(); i++) { |
142 | 0 | Node child = node.getChildAt(i); |
143 | 0 | if (child.isLeaf()) { |
144 | 0 | int childRowIndex = getRowIndexAmongSibings(child); |
145 | 0 | ((NodeWidget) super.getWidget(childRowIndex, columnIndex + 1)).setNode(child); |
146 | 0 | } else { |
147 | 0 | buildTable(child, columnIndex + 1); |
148 | |
} |
149 | |
} |
150 | |
|
151 | 0 | } |
152 | |
|
153 | |
|
154 | |
|
155 | |
|
156 | |
|
157 | |
|
158 | |
|
159 | |
public void mergeCellAcrossRow(int row, int column, int count) { |
160 | 0 | for (int i = 1; i <= count; i++) { |
161 | 0 | removeCell(row + i, column); |
162 | |
} |
163 | 0 | getFlexCellFormatter().setRowSpan(row, column, count + 1); |
164 | 0 | } |
165 | |
|
166 | |
|
167 | |
|
168 | |
|
169 | |
|
170 | |
|
171 | |
|
172 | |
public void mergeCellAcrossColumn(int row, int column) { |
173 | 0 | removeCell(row, column); |
174 | 0 | getFlexCellFormatter().setColSpan(row, column, 10); |
175 | 0 | } |
176 | |
} |