1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
package org.apache.tapestry.contrib.tree.components.table; |
16 | |
|
17 | |
import org.apache.tapestry.BaseComponent; |
18 | |
import org.apache.tapestry.IMarkupWriter; |
19 | |
import org.apache.tapestry.IRequestCycle; |
20 | |
import org.apache.tapestry.contrib.table.model.ITableColumn; |
21 | |
import org.apache.tapestry.contrib.table.model.ITableModel; |
22 | |
import org.apache.tapestry.contrib.table.model.ITableSessionStateManager; |
23 | |
import org.apache.tapestry.contrib.table.model.simple.SimpleListTableDataModel; |
24 | |
import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumnModel; |
25 | |
import org.apache.tapestry.contrib.table.model.simple.SimpleTableModel; |
26 | |
import org.apache.tapestry.contrib.table.model.simple.SimpleTableSessionStateManager; |
27 | |
import org.apache.tapestry.contrib.tree.model.*; |
28 | |
import org.apache.tapestry.event.PageDetachListener; |
29 | |
import org.apache.tapestry.event.PageEvent; |
30 | |
|
31 | |
import java.util.ArrayList; |
32 | |
import java.util.Iterator; |
33 | |
import java.util.List; |
34 | |
|
35 | |
|
36 | |
|
37 | |
public abstract class TreeTableDataView extends BaseComponent implements |
38 | |
ITreeRowSource, PageDetachListener |
39 | |
{ |
40 | |
|
41 | 0 | private int m_nTreeDeep = -1; |
42 | |
|
43 | 0 | private TreeRowObject m_objTreeRowObject = null; |
44 | |
|
45 | 0 | private ArrayList m_arrAllExpandedNodes = null; |
46 | |
|
47 | |
public TreeTableDataView() |
48 | |
{ |
49 | 0 | super(); |
50 | 0 | initialize(); |
51 | 0 | } |
52 | |
|
53 | |
public void initialize() |
54 | |
{ |
55 | 0 | m_nTreeDeep = -1; |
56 | |
|
57 | 0 | m_objTreeRowObject = null; |
58 | 0 | m_arrAllExpandedNodes = null; |
59 | 0 | } |
60 | |
|
61 | |
|
62 | |
|
63 | |
|
64 | |
public void pageDetached(PageEvent event) |
65 | |
{ |
66 | 0 | initialize(); |
67 | 0 | } |
68 | |
|
69 | |
public abstract ITreeModelSource getTreeViewParameter(); |
70 | |
|
71 | |
public ITreeModelSource getTreeModelSource() |
72 | |
{ |
73 | 0 | ITreeModelSource objSource = (ITreeModelSource) getPage() |
74 | |
.getRequestCycle().getAttribute( |
75 | |
ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE); |
76 | |
|
77 | 0 | return objSource == null ? getTreeViewParameter() : objSource; |
78 | |
} |
79 | |
|
80 | |
public List generateNodeList() |
81 | |
{ |
82 | 0 | if (m_arrAllExpandedNodes == null) |
83 | |
{ |
84 | 0 | ArrayList arrAllExpandedNodes = new ArrayList(); |
85 | |
|
86 | |
|
87 | 0 | ITreeModelSource objTreeModelSource = getTreeModelSource(); |
88 | 0 | ITreeModel objTreeModel = objTreeModelSource.getTreeModel(); |
89 | 0 | ITreeDataModel objTreeDataModel = objTreeModel.getTreeDataModel(); |
90 | |
|
91 | 0 | Object objRoot = objTreeDataModel.getRoot(); |
92 | 0 | Object objRootUID = objTreeDataModel.getUniqueKey(objRoot, null); |
93 | |
|
94 | 0 | if (getShowRootNode()) |
95 | |
{ |
96 | 0 | walkTree(arrAllExpandedNodes, objRoot, objRootUID, 0, |
97 | |
objTreeModel, TreeRowObject.FIRST_LAST_ROW, new int[0], |
98 | |
true); |
99 | |
} |
100 | |
else |
101 | |
{ |
102 | 0 | int nChildenCount = objTreeModel.getTreeDataModel() |
103 | |
.getChildCount(objRoot); |
104 | 0 | int nRowPossiotionType = nChildenCount == 1 ? TreeRowObject.FIRST_LAST_ROW |
105 | |
: TreeRowObject.FIRST_ROW; |
106 | 0 | boolean bFirst = true; |
107 | 0 | for(Iterator iter = objTreeModel.getTreeDataModel() |
108 | 0 | .getChildren(objRoot); iter.hasNext();) |
109 | |
{ |
110 | 0 | Object objChild = iter.next(); |
111 | 0 | Object objChildUID = objTreeModel.getTreeDataModel() |
112 | |
.getUniqueKey(objChild, objRoot); |
113 | 0 | boolean bChildLast = !iter.hasNext(); |
114 | 0 | if (!bFirst) |
115 | |
{ |
116 | 0 | if (bChildLast) |
117 | 0 | nRowPossiotionType = TreeRowObject.LAST_ROW; |
118 | 0 | else nRowPossiotionType = TreeRowObject.MIDDLE_ROW; |
119 | |
} |
120 | 0 | walkTree(arrAllExpandedNodes, objChild, objChildUID, 0, |
121 | |
objTreeModel, nRowPossiotionType, new int[0], |
122 | |
bChildLast); |
123 | 0 | bFirst = false; |
124 | 0 | } |
125 | |
} |
126 | |
|
127 | 0 | m_arrAllExpandedNodes = arrAllExpandedNodes; |
128 | |
} |
129 | |
|
130 | 0 | return m_arrAllExpandedNodes; |
131 | |
} |
132 | |
|
133 | |
public void walkTree(ArrayList arrAllExpandedNodes, Object objParent, |
134 | |
Object objParentUID, int nDepth, ITreeModel objTreeModel, |
135 | |
int nRowPossiotionType, int[] arrConnectImages, boolean bLast) |
136 | |
{ |
137 | 0 | int rowPositionType = nRowPossiotionType; |
138 | 0 | m_nTreeDeep = nDepth; |
139 | 0 | int nNumberOfChildren = objTreeModel.getTreeDataModel().getChildCount( |
140 | |
objParent); |
141 | 0 | boolean bLeaf = (nNumberOfChildren == 0) ? true : false; |
142 | 0 | TreeRowObject objTreeRowObject = new TreeRowObject(objParent, |
143 | |
objParentUID, nDepth, bLeaf, rowPositionType, |
144 | |
arrConnectImages); |
145 | 0 | arrAllExpandedNodes.add(objTreeRowObject); |
146 | |
|
147 | 0 | boolean bContain = objTreeModel.getTreeStateModel() |
148 | |
.isUniqueKeyExpanded(objParentUID); |
149 | 0 | if (bContain) |
150 | |
{ |
151 | 0 | int[] arrConnectImagesNew = new int[arrConnectImages.length + 1]; |
152 | 0 | System.arraycopy(arrConnectImages, 0, arrConnectImagesNew, 0, |
153 | |
arrConnectImages.length); |
154 | 0 | if (bLast) |
155 | 0 | arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.EMPTY_CONN_IMG; |
156 | 0 | else arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.LINE_CONN_IMG; |
157 | 0 | Iterator colChildren = objTreeModel.getTreeDataModel().getChildren( |
158 | |
objParent); |
159 | 0 | for(Iterator iter = colChildren; iter.hasNext();) |
160 | |
{ |
161 | 0 | Object objChild = iter.next(); |
162 | 0 | Object objChildUID = objTreeModel.getTreeDataModel() |
163 | |
.getUniqueKey(objChild, objParentUID); |
164 | 0 | boolean bChildLast = !iter.hasNext(); |
165 | 0 | if (bChildLast) |
166 | 0 | rowPositionType = TreeRowObject.LAST_ROW; |
167 | 0 | else rowPositionType = TreeRowObject.MIDDLE_ROW; |
168 | 0 | walkTree(arrAllExpandedNodes, objChild, objChildUID, |
169 | |
nDepth + 1, objTreeModel, rowPositionType, |
170 | |
arrConnectImagesNew, bChildLast); |
171 | 0 | } |
172 | |
} |
173 | 0 | } |
174 | |
|
175 | |
|
176 | |
|
177 | |
|
178 | |
|
179 | |
|
180 | |
public int getTreeDeep() |
181 | |
{ |
182 | 0 | return m_nTreeDeep; |
183 | |
} |
184 | |
|
185 | |
|
186 | |
|
187 | |
|
188 | |
|
189 | |
public ITableModel getTableModel() |
190 | |
{ |
191 | 0 | return createTableModel(); |
192 | |
} |
193 | |
|
194 | |
private ITableModel createTableModel() |
195 | |
{ |
196 | 0 | List arrAllNodes = generateNodeList(); |
197 | 0 | Object[] arrAllExpandedNodes = new Object[arrAllNodes.size()]; |
198 | 0 | arrAllNodes.toArray(arrAllExpandedNodes); |
199 | |
|
200 | 0 | SimpleTableModel objTableModel = new SimpleTableModel( |
201 | |
arrAllExpandedNodes, getTableColunms()); |
202 | 0 | objTableModel.getPagingState().setPageSize(getEntriesPerTablePage()); |
203 | |
|
204 | 0 | return objTableModel; |
205 | |
} |
206 | |
|
207 | |
public ITableColumn[] getTableColunms() |
208 | |
{ |
209 | 0 | ArrayList arrColumnsList = new ArrayList(); |
210 | 0 | arrColumnsList.add(new TreeTableColumn("Name", false, null)); |
211 | |
|
212 | 0 | List arrTableColunms = getTableColumnsParameter(); |
213 | 0 | if (arrTableColunms != null) arrColumnsList.addAll(arrTableColunms); |
214 | |
|
215 | 0 | ITableColumn[] arrColumns = new ITableColumn[arrColumnsList.size()]; |
216 | 0 | arrColumnsList.toArray(arrColumns); |
217 | |
|
218 | 0 | return arrColumns; |
219 | |
} |
220 | |
|
221 | |
public abstract List getTableColumnsParameter(); |
222 | |
|
223 | |
public abstract int getEntriesPerTablePage(); |
224 | |
|
225 | |
|
226 | |
|
227 | |
|
228 | |
public TreeRowObject getTreeRow() |
229 | |
{ |
230 | 0 | return getTreeRowObject(); |
231 | |
} |
232 | |
|
233 | |
public ITableSessionStateManager getTableSessionStateManager() |
234 | |
{ |
235 | 0 | SimpleListTableDataModel objDataModel = new SimpleListTableDataModel( |
236 | |
generateNodeList()); |
237 | 0 | SimpleTableColumnModel objColumnModel = new SimpleTableColumnModel( |
238 | |
getTableColunms()); |
239 | 0 | SimpleTableSessionStateManager objStateManager = new SimpleTableSessionStateManager( |
240 | |
objDataModel, objColumnModel); |
241 | 0 | return objStateManager; |
242 | |
|
243 | |
} |
244 | |
|
245 | |
|
246 | |
|
247 | |
|
248 | |
|
249 | |
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) |
250 | |
{ |
251 | 0 | Object objExistedTreeModelSource = cycle |
252 | |
.getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE); |
253 | 0 | cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this); |
254 | |
|
255 | 0 | super.renderComponent(writer, cycle); |
256 | |
|
257 | 0 | cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, |
258 | |
objExistedTreeModelSource); |
259 | 0 | } |
260 | |
|
261 | |
|
262 | |
|
263 | |
|
264 | |
|
265 | |
public void renderBody(IMarkupWriter writer, IRequestCycle cycle) |
266 | |
{ |
267 | 0 | Object objExistedTreeModelSource = cycle |
268 | |
.getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE); |
269 | 0 | cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this); |
270 | |
|
271 | 0 | super.renderBody(writer, cycle); |
272 | |
|
273 | 0 | cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, |
274 | |
objExistedTreeModelSource); |
275 | 0 | } |
276 | |
|
277 | |
public TreeRowObject getTreeRowObject() |
278 | |
{ |
279 | 0 | return m_objTreeRowObject; |
280 | |
} |
281 | |
|
282 | |
public void setTreeRowObject(TreeRowObject object) |
283 | |
{ |
284 | 0 | m_objTreeRowObject = object; |
285 | 0 | } |
286 | |
|
287 | |
public abstract boolean getShowRootNode(); |
288 | |
} |