001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.contrib.tree.components.table;
016
017 import org.apache.tapestry.BaseComponent;
018 import org.apache.tapestry.IMarkupWriter;
019 import org.apache.tapestry.IRequestCycle;
020 import org.apache.tapestry.contrib.table.model.ITableColumn;
021 import org.apache.tapestry.contrib.table.model.ITableModel;
022 import org.apache.tapestry.contrib.table.model.ITableSessionStateManager;
023 import org.apache.tapestry.contrib.table.model.simple.SimpleListTableDataModel;
024 import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumnModel;
025 import org.apache.tapestry.contrib.table.model.simple.SimpleTableModel;
026 import org.apache.tapestry.contrib.table.model.simple.SimpleTableSessionStateManager;
027 import org.apache.tapestry.contrib.tree.model.*;
028 import org.apache.tapestry.event.PageDetachListener;
029 import org.apache.tapestry.event.PageEvent;
030
031 import java.util.ArrayList;
032 import java.util.Iterator;
033 import java.util.List;
034
035 /**
036 */
037 public abstract class TreeTableDataView extends BaseComponent implements
038 ITreeRowSource, PageDetachListener
039 {
040
041 private int m_nTreeDeep = -1;
042
043 private TreeRowObject m_objTreeRowObject = null;
044
045 private ArrayList m_arrAllExpandedNodes = null;
046
047 public TreeTableDataView()
048 {
049 super();
050 initialize();
051 }
052
053 public void initialize()
054 {
055 m_nTreeDeep = -1;
056 // m_objTableModel = null;
057 m_objTreeRowObject = null;
058 m_arrAllExpandedNodes = null;
059 }
060
061 /**
062 * @see org.apache.tapestry.event.PageDetachListener#pageDetached(org.apache.tapestry.event.PageEvent)
063 */
064 public void pageDetached(PageEvent event)
065 {
066 initialize();
067 }
068
069 public abstract ITreeModelSource getTreeViewParameter();
070
071 public ITreeModelSource getTreeModelSource()
072 {
073 ITreeModelSource objSource = (ITreeModelSource) getPage()
074 .getRequestCycle().getAttribute(
075 ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE);
076
077 return objSource == null ? getTreeViewParameter() : objSource;
078 }
079
080 public List generateNodeList()
081 {
082 if (m_arrAllExpandedNodes == null)
083 {
084 ArrayList arrAllExpandedNodes = new ArrayList();
085
086 // render data
087 ITreeModelSource objTreeModelSource = getTreeModelSource();
088 ITreeModel objTreeModel = objTreeModelSource.getTreeModel();
089 ITreeDataModel objTreeDataModel = objTreeModel.getTreeDataModel();
090
091 Object objRoot = objTreeDataModel.getRoot();
092 Object objRootUID = objTreeDataModel.getUniqueKey(objRoot, null);
093
094 if (getShowRootNode())
095 {
096 walkTree(arrAllExpandedNodes, objRoot, objRootUID, 0,
097 objTreeModel, TreeRowObject.FIRST_LAST_ROW, new int[0],
098 true);
099 }
100 else
101 {
102 int nChildenCount = objTreeModel.getTreeDataModel()
103 .getChildCount(objRoot);
104 int nRowPossiotionType = nChildenCount == 1 ? TreeRowObject.FIRST_LAST_ROW
105 : TreeRowObject.FIRST_ROW;
106 boolean bFirst = true;
107 for(Iterator iter = objTreeModel.getTreeDataModel()
108 .getChildren(objRoot); iter.hasNext();)
109 {
110 Object objChild = iter.next();
111 Object objChildUID = objTreeModel.getTreeDataModel()
112 .getUniqueKey(objChild, objRoot);
113 boolean bChildLast = !iter.hasNext();
114 if (!bFirst)
115 {
116 if (bChildLast)
117 nRowPossiotionType = TreeRowObject.LAST_ROW;
118 else nRowPossiotionType = TreeRowObject.MIDDLE_ROW;
119 }
120 walkTree(arrAllExpandedNodes, objChild, objChildUID, 0,
121 objTreeModel, nRowPossiotionType, new int[0],
122 bChildLast);
123 bFirst = false;
124 }
125 }
126
127 m_arrAllExpandedNodes = arrAllExpandedNodes;
128 }
129
130 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 int rowPositionType = nRowPossiotionType;
138 m_nTreeDeep = nDepth;
139 int nNumberOfChildren = objTreeModel.getTreeDataModel().getChildCount(
140 objParent);
141 boolean bLeaf = (nNumberOfChildren == 0) ? true : false;
142 TreeRowObject objTreeRowObject = new TreeRowObject(objParent,
143 objParentUID, nDepth, bLeaf, rowPositionType,
144 arrConnectImages);
145 arrAllExpandedNodes.add(objTreeRowObject);
146
147 boolean bContain = objTreeModel.getTreeStateModel()
148 .isUniqueKeyExpanded(objParentUID);
149 if (bContain)
150 {
151 int[] arrConnectImagesNew = new int[arrConnectImages.length + 1];
152 System.arraycopy(arrConnectImages, 0, arrConnectImagesNew, 0,
153 arrConnectImages.length);
154 if (bLast)
155 arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.EMPTY_CONN_IMG;
156 else arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.LINE_CONN_IMG;
157 Iterator colChildren = objTreeModel.getTreeDataModel().getChildren(
158 objParent);
159 for(Iterator iter = colChildren; iter.hasNext();)
160 {
161 Object objChild = iter.next();
162 Object objChildUID = objTreeModel.getTreeDataModel()
163 .getUniqueKey(objChild, objParentUID);
164 boolean bChildLast = !iter.hasNext();
165 if (bChildLast)
166 rowPositionType = TreeRowObject.LAST_ROW;
167 else rowPositionType = TreeRowObject.MIDDLE_ROW;
168 walkTree(arrAllExpandedNodes, objChild, objChildUID,
169 nDepth + 1, objTreeModel, rowPositionType,
170 arrConnectImagesNew, bChildLast);
171 }
172 }
173 }
174
175 /**
176 * Returns the treeDeep.
177 *
178 * @return int
179 */
180 public int getTreeDeep()
181 {
182 return m_nTreeDeep;
183 }
184
185 /*
186 * public ITableModel getTableModel() { if(m_objTableModel == null){
187 * m_objTableModel = createTableModel(); } return m_objTableModel; }
188 */
189 public ITableModel getTableModel()
190 {
191 return createTableModel();
192 }
193
194 private ITableModel createTableModel()
195 {
196 List arrAllNodes = generateNodeList();
197 Object[] arrAllExpandedNodes = new Object[arrAllNodes.size()];
198 arrAllNodes.toArray(arrAllExpandedNodes);
199
200 SimpleTableModel objTableModel = new SimpleTableModel(
201 arrAllExpandedNodes, getTableColunms());
202 objTableModel.getPagingState().setPageSize(getEntriesPerTablePage());
203
204 return objTableModel;
205 }
206
207 public ITableColumn[] getTableColunms()
208 {
209 ArrayList arrColumnsList = new ArrayList();
210 arrColumnsList.add(new TreeTableColumn("Name", false, null));
211
212 List arrTableColunms = getTableColumnsParameter();
213 if (arrTableColunms != null) arrColumnsList.addAll(arrTableColunms);
214
215 ITableColumn[] arrColumns = new ITableColumn[arrColumnsList.size()];
216 arrColumnsList.toArray(arrColumns);
217
218 return arrColumns;
219 }
220
221 public abstract List getTableColumnsParameter();
222
223 public abstract int getEntriesPerTablePage();
224
225 /**
226 * @see org.apache.tapestry.contrib.tree.model.ITreeRowSource#getTreeRow()
227 */
228 public TreeRowObject getTreeRow()
229 {
230 return getTreeRowObject();
231 }
232
233 public ITableSessionStateManager getTableSessionStateManager()
234 {
235 SimpleListTableDataModel objDataModel = new SimpleListTableDataModel(
236 generateNodeList());
237 SimpleTableColumnModel objColumnModel = new SimpleTableColumnModel(
238 getTableColunms());
239 SimpleTableSessionStateManager objStateManager = new SimpleTableSessionStateManager(
240 objDataModel, objColumnModel);
241 return objStateManager;
242 // return NullTableSessionStateManager.NULL_STATE_MANAGER;
243 }
244
245 /**
246 * @see org.apache.tapestry.BaseComponent#renderComponent(org.apache.tapestry.IMarkupWriter,
247 * org.apache.tapestry.IRequestCycle)
248 */
249 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
250 {
251 Object objExistedTreeModelSource = cycle
252 .getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
253 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this);
254
255 super.renderComponent(writer, cycle);
256
257 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE,
258 objExistedTreeModelSource);
259 }
260
261 /**
262 * @see org.apache.tapestry.AbstractComponent#renderBody(org.apache.tapestry.IMarkupWriter,
263 * org.apache.tapestry.IRequestCycle)
264 */
265 public void renderBody(IMarkupWriter writer, IRequestCycle cycle)
266 {
267 Object objExistedTreeModelSource = cycle
268 .getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
269 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this);
270
271 super.renderBody(writer, cycle);
272
273 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE,
274 objExistedTreeModelSource);
275 }
276
277 public TreeRowObject getTreeRowObject()
278 {
279 return m_objTreeRowObject;
280 }
281
282 public void setTreeRowObject(TreeRowObject object)
283 {
284 m_objTreeRowObject = object;
285 }
286
287 public abstract boolean getShowRootNode();
288 }