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    }