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