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;
016
017 import java.util.Iterator;
018
019 import org.apache.tapestry.BaseComponent;
020 import org.apache.tapestry.IMarkupWriter;
021 import org.apache.tapestry.IRequestCycle;
022 import org.apache.tapestry.contrib.tree.model.ITreeDataModel;
023 import org.apache.tapestry.contrib.tree.model.ITreeModel;
024 import org.apache.tapestry.contrib.tree.model.ITreeRowSource;
025 import org.apache.tapestry.contrib.tree.model.TreeRowObject;
026
027 /**
028 * @author tsveltin ?
029 */
030 public abstract class TreeDataView extends BaseComponent implements ITreeRowSource
031 {
032 private TreeRowObject m_objTreeRowObject = null;
033
034 private int m_nTreeDeep = -1;
035
036 public TreeDataView()
037 {
038 super();
039 initialize();
040 }
041
042 public void initialize()
043 {
044 m_objTreeRowObject = null;
045 m_nTreeDeep = -1;
046 }
047
048 public abstract TreeView getTreeView();
049
050 public void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
051 {
052 // render data
053 Object objExistedTreeModelSource = cycle
054 .getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
055 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this);
056
057 TreeView objView = getTreeView();
058 ITreeModel objTreeModel = objView.getTreeModel();
059 ITreeDataModel objTreeDataModel = objTreeModel.getTreeDataModel();
060
061 Object objRoot = objTreeDataModel.getRoot();
062 Object objRootUID = objTreeDataModel.getUniqueKey(objRoot, null);
063 if (getShowRootNode())
064 {
065 walkTree(
066 objRoot,
067 objRootUID,
068 0,
069 objTreeModel,
070 writer,
071 cycle,
072 TreeRowObject.FIRST_LAST_ROW,
073 new int[0],
074 true);
075 }
076 else
077 {
078 boolean bFirst = true;
079 int nChildenCount = objTreeModel.getTreeDataModel().getChildCount(objRoot);
080 int nRowPossiotionType = nChildenCount == 1 ? TreeRowObject.FIRST_LAST_ROW
081 : TreeRowObject.FIRST_ROW;
082 for (Iterator iter = objTreeModel.getTreeDataModel().getChildren(objRoot); iter
083 .hasNext();)
084 {
085 Object objChild = iter.next();
086 Object objChildUID = objTreeModel.getTreeDataModel()
087 .getUniqueKey(objChild, objRoot);
088 boolean bChildLast = !iter.hasNext();
089 if (!bFirst)
090 {
091 if (bChildLast)
092 nRowPossiotionType = TreeRowObject.LAST_ROW;
093 else
094 nRowPossiotionType = TreeRowObject.MIDDLE_ROW;
095 }
096
097 walkTree(
098 objChild,
099 objChildUID,
100 0,
101 objTreeModel,
102 writer,
103 cycle,
104 nRowPossiotionType,
105 new int[0],
106 bChildLast);
107
108 bFirst = false;
109 }
110 }
111
112 cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, objExistedTreeModelSource);
113 }
114
115 public void walkTree(Object objParent, Object objParentUID, int nDepth,
116 ITreeModel objTreeModel, IMarkupWriter writer, IRequestCycle cycle,
117 int nRowPossiotionType, int[] arrConnectImages, boolean bLast)
118 {
119 m_nTreeDeep = nDepth;
120 int nNumberOfChildren = objTreeModel.getTreeDataModel().getChildCount(objParent);
121 boolean bLeaf = (nNumberOfChildren == 0) ? true : false;
122 m_objTreeRowObject = new TreeRowObject(objParent, objParentUID, nDepth, bLeaf,
123 nRowPossiotionType, arrConnectImages);
124
125 super.renderComponent(writer, cycle);
126
127 boolean bContain = objTreeModel.getTreeStateModel().isUniqueKeyExpanded(objParentUID);
128 if (bContain)
129 {
130 int[] arrConnectImagesNew = new int[arrConnectImages.length + 1];
131 System.arraycopy(arrConnectImages, 0, arrConnectImagesNew, 0, arrConnectImages.length);
132 if (bLast)
133 arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.EMPTY_CONN_IMG;
134 else
135 arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.LINE_CONN_IMG;
136
137 for (Iterator iter = objTreeModel.getTreeDataModel().getChildren(objParent); iter
138 .hasNext();)
139 {
140 Object objChild = iter.next();
141 Object objChildUID = objTreeModel.getTreeDataModel().getUniqueKey(
142 objChild,
143 objParentUID);
144 boolean bChildLast = !iter.hasNext();
145 if (bChildLast)
146 nRowPossiotionType = TreeRowObject.LAST_ROW;
147 else
148 nRowPossiotionType = TreeRowObject.MIDDLE_ROW;
149 walkTree(
150 objChild,
151 objChildUID,
152 nDepth + 1,
153 objTreeModel,
154 writer,
155 cycle,
156 nRowPossiotionType,
157 arrConnectImagesNew,
158 bChildLast);
159 }
160 }
161 }
162
163 public int getTreeDeep()
164 {
165 return m_nTreeDeep;
166 }
167
168 /**
169 * @see org.apache.tapestry.contrib.tree.model.ITreeRowSource#getTreeRow()
170 */
171 public TreeRowObject getTreeRow()
172 {
173 return getTreeRowObject();
174 }
175
176 public TreeRowObject getTreeRowObject()
177 {
178 return m_objTreeRowObject;
179 }
180
181 public void setTreeRowObject(TreeRowObject object)
182 {
183 m_objTreeRowObject = object;
184 }
185
186 public abstract boolean getShowRootNode();
187
188 }