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.commons.logging.Log; 018 import org.apache.commons.logging.LogFactory; 019 import org.apache.tapestry.BaseComponent; 020 import org.apache.tapestry.IBinding; 021 import org.apache.tapestry.IMarkupWriter; 022 import org.apache.tapestry.IRequestCycle; 023 import org.apache.tapestry.Tapestry; 024 import org.apache.tapestry.contrib.tree.model.ISessionStoreManager; 025 import org.apache.tapestry.contrib.tree.model.ITreeModel; 026 import org.apache.tapestry.contrib.tree.model.ITreeModelSource; 027 import org.apache.tapestry.contrib.tree.model.ITreeSessionStateManager; 028 import org.apache.tapestry.contrib.tree.model.ITreeStateListener; 029 import org.apache.tapestry.contrib.tree.simple.FullTreeSessionStateManager; 030 import org.apache.tapestry.event.PageBeginRenderListener; 031 import org.apache.tapestry.event.PageDetachListener; 032 import org.apache.tapestry.event.PageEvent; 033 import org.apache.tapestry.util.ComponentAddress; 034 035 /** 036 */ 037 public abstract class TreeView extends BaseComponent implements 038 PageDetachListener, PageBeginRenderListener, ITreeModelSource 039 { 040 041 private static final Log LOG = LogFactory.getLog(TreeView.class); 042 043 private IBinding m_objSessionStoreManagerBinding; 044 045 private IBinding m_objTreeModelBinding; 046 047 private IBinding m_objSessionStateManagerBinding; 048 049 private ITreeModel m_objTreeModel; 050 051 private ITreeSessionStateManager m_objTreeSessionStateManager; 052 053 private ISessionStoreManager m_objSessionStoreManager; 054 055 private Object m_objTreeSessionState; 056 057 private ComponentAddress m_objComponentAddress; 058 059 public TreeView() 060 { 061 super(); 062 initialize(); 063 } 064 065 private void initialize() 066 { 067 m_objTreeModel = null; 068 m_objTreeSessionStateManager = null; 069 m_objSessionStoreManager = null; 070 m_objTreeSessionState = null; 071 m_objComponentAddress = null; 072 } 073 074 /** 075 * @see org.apache.tapestry.AbstractComponent#renderComponent(IMarkupWriter, 076 * IRequestCycle) 077 */ 078 079 /** 080 * @see org.apache.tapestry.event.PageDetachListener#pageDetached(PageEvent) 081 */ 082 public void pageDetached(PageEvent arg0) 083 { 084 initialize(); 085 } 086 087 /** 088 * @see org.apache.tapestry.event.PageRenderListener#pageBeginRender(PageEvent) 089 */ 090 public void pageBeginRender(PageEvent arg0) 091 { 092 if (arg0.getRequestCycle().isRewinding()) { return; } 093 storeSesion(); 094 } 095 096 /** 097 * Returns the treeModelBinding. 098 * 099 * @return IBinding 100 */ 101 public IBinding getTreeModelBinding() 102 { 103 return m_objTreeModelBinding; 104 } 105 106 /** 107 * Sets the treeModelBinding. 108 * 109 * @param treeModelBinding 110 * The treeModelBinding to set 111 */ 112 public void setTreeModelBinding(IBinding treeModelBinding) 113 { 114 m_objTreeModelBinding = treeModelBinding; 115 } 116 117 /** 118 * Returns the SessionStoreManagerBinding. 119 * 120 * @return IBinding 121 */ 122 public IBinding getSessionStoreManagerBinding() 123 { 124 return m_objSessionStoreManagerBinding; 125 } 126 127 /** 128 * Returns the sessionStateManagerBinding. 129 * 130 * @return IBinding 131 */ 132 public IBinding getSessionStateManagerBinding() 133 { 134 return m_objSessionStateManagerBinding; 135 } 136 137 /** 138 * Sets the SessionStoreManagerBinding. 139 * 140 * @param sessionStoreManagerBinding 141 * The SessionStoreManagerBinding to set 142 */ 143 public void setSessionStoreManagerBinding( 144 IBinding sessionStoreManagerBinding) 145 { 146 m_objSessionStoreManagerBinding = sessionStoreManagerBinding; 147 } 148 149 /** 150 * Sets the sessionStateManagerBinding. 151 * 152 * @param sessionStateManagerBinding 153 * The sessionStateManagerBinding to set 154 */ 155 public void setSessionStateManagerBinding( 156 IBinding sessionStateManagerBinding) 157 { 158 m_objSessionStateManagerBinding = sessionStateManagerBinding; 159 } 160 161 private void extractTreeModel() 162 { 163 if (LOG.isDebugEnabled()) 164 { 165 LOG.debug("TreeView.extractTreeModel()"); 166 } 167 168 ISessionStoreManager objHolder = getSessionStoreManager(); 169 ITreeSessionStateManager objSessionManager = getTreeSessionStateMgr(); 170 Object objSessionState; 171 if (objHolder == null) 172 { 173 objSessionState = getTreeSessionState(); 174 } 175 else 176 { 177 objSessionState = objHolder.getSessionState(this.getPage(), 178 "treeSessionState"); 179 } 180 181 if (objSessionState != null) 182 { 183 m_objTreeModel = objSessionManager.getModel(objSessionState); 184 } 185 else 186 { 187 if (LOG.isDebugEnabled()) 188 { 189 LOG.debug("TreeView.extractTreeModel() from BINDING"); 190 } 191 192 m_objTreeModel = (ITreeModel) getTreeModelBinding().getObject(); 193 } 194 195 } 196 197 private void storeSesion() 198 { 199 if (LOG.isDebugEnabled()) 200 { 201 LOG.debug("TreeView.storeSesion()"); 202 } 203 204 ITreeSessionStateManager objSessionManager = getTreeSessionStateMgr(); 205 Object objSessionState = objSessionManager 206 .getSessionState(getTreeModel()); 207 208 store(objSessionState); 209 } 210 211 private void store(Object objSessionState) 212 { 213 ISessionStoreManager objHolder = getSessionStoreManager(); 214 215 if (objHolder == null) 216 { 217 Tapestry.fireObservedChange(this, "treeSessionState", 218 objSessionState); 219 } 220 else 221 { 222 // String strPath = "treeSessionState"; 223 String strPath = getExtendedId(); 224 if (LOG.isDebugEnabled()) 225 LOG.debug("store(): setting state with: " + strPath); 226 objHolder.setSessionState(this.getPage(), strPath, objSessionState); 227 } 228 } 229 230 /** 231 * @see ITreeComponent#resetState() 232 */ 233 public void resetState() 234 { 235 if (LOG.isDebugEnabled()) 236 { 237 LOG.debug("TreeView.resetState()"); 238 } 239 initialize(); 240 store(null); 241 } 242 243 /** 244 * Returns the SessionStoreManager. 245 * 246 * @return ISessionStoreManager 247 */ 248 public ISessionStoreManager getSessionStoreManager() 249 { 250 if (m_objSessionStoreManager == null 251 && getSessionStoreManagerBinding() != null) 252 { 253 m_objSessionStoreManager = (ISessionStoreManager) getSessionStoreManagerBinding() 254 .getObject(); 255 } 256 257 return m_objSessionStoreManager; 258 } 259 260 /** 261 * Returns the wizardSessionStateMgr. 262 * 263 * @return IWizardSessionStateManager 264 */ 265 public ITreeSessionStateManager getTreeSessionStateMgr() 266 { 267 if (m_objTreeSessionStateManager == null) 268 { 269 IBinding objBinding = getSessionStateManagerBinding(); 270 if (objBinding != null) 271 { 272 Object objManager = objBinding.getObject(); 273 m_objTreeSessionStateManager = (ITreeSessionStateManager) objManager; 274 } 275 else 276 { 277 m_objTreeSessionStateManager = new FullTreeSessionStateManager(); 278 } 279 } 280 return m_objTreeSessionStateManager; 281 } 282 283 public ComponentAddress getComponentPath() 284 { 285 if (m_objComponentAddress == null) 286 { 287 m_objComponentAddress = new ComponentAddress(this); 288 } 289 return m_objComponentAddress; 290 } 291 292 /** 293 * Returns the treeModel. 294 * 295 * @return ITreeModel 296 */ 297 public ITreeModel getTreeModel() 298 { 299 if (m_objTreeModel == null) 300 { 301 extractTreeModel(); 302 } 303 return m_objTreeModel; 304 } 305 306 /** 307 * Sets the treeModel. 308 * 309 * @param treeModel 310 * The treeModel to set 311 */ 312 public void setTreeModel(ITreeModel treeModel) 313 { 314 m_objTreeModel = treeModel; 315 } 316 317 /** 318 * Returns the treeSessionState. 319 * 320 * @return Object 321 */ 322 public Object getTreeSessionState() 323 { 324 return m_objTreeSessionState; 325 } 326 327 /** 328 * Sets the treeSessionState. 329 * 330 * @param treeSessionState 331 * The treeSessionState to set 332 */ 333 public void setTreeSessionState(Object treeSessionState) 334 { 335 m_objTreeSessionState = treeSessionState; 336 } 337 338 public String getSelectedNodeStyleID() 339 { 340 return getId() + ":selected"; 341 } 342 343 /** 344 * @see org.apache.tapestry.BaseComponent#renderComponent(org.apache.tapestry.IMarkupWriter, 345 * org.apache.tapestry.IRequestCycle) 346 */ 347 protected void renderComponent(IMarkupWriter arg0, IRequestCycle arg1) 348 { 349 Object objExistedTreeModelSource = arg1 350 .getAttribute(ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE); 351 arg1.setAttribute(ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE, this); 352 353 super.renderComponent(arg0, arg1); 354 arg1.setAttribute(ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE, 355 objExistedTreeModelSource); 356 } 357 358 /** 359 * @see org.apache.tapestry.contrib.tree.model.ITreeModelSource#getTreeStateListener() 360 */ 361 public ITreeStateListener getTreeStateListener() 362 { 363 ITreeStateListener objListener = null; 364 IBinding objBinding = getBinding("treeStateListener"); 365 if (objBinding != null) 366 { 367 objListener = (ITreeStateListener) objBinding.getObject(); 368 } 369 return objListener; 370 } 371 372 }