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 }