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