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.table.components;
016    
017    import org.apache.tapestry.IRequestCycle;
018    import org.apache.tapestry.contrib.table.model.ITableModelSource;
019    import org.apache.tapestry.event.PageBeginRenderListener;
020    import org.apache.tapestry.event.PageDetachListener;
021    import org.apache.tapestry.event.PageEvent;
022    
023    /**
024     * A low level Table component that renders the pages in the table.
025     * 
026     * This component is a variant of {@link org.apache.tapestry.contrib.table.components.TablePages}, 
027     * but is designed for operation in a form. The necessary page data is stored 
028     * in hidden fields, so that no StaleLink exceptions occur during a rewind. 
029     * The links also submit the form, which ensures that the data in the other 
030     * form fields is preserved even when the page chages.
031     *  
032     * The component must be wrapped by {@link org.apache.tapestry.contrib.table.components.TableView}.
033     * <p>
034     * The component generates a list of pages in the Table centered around the 
035     * current one and allows you to navigate to other pages.
036     * <p> 
037     * Please see the Component Reference for details on how to use this component. 
038     * 
039     *  [<a href="../../../../../../../ComponentReference/contrib.TableFormPages.html">Component Reference</a>]
040     * 
041     * @author mindbridge
042     *
043     */
044    public abstract class TableFormPages extends TablePages 
045        implements PageDetachListener, PageBeginRenderListener
046    {
047        private int m_nCurrentPage;
048        private int m_nPageCount;
049        private int m_nStartPage;
050        private int m_nStopPage;    
051    
052        public TableFormPages()
053        {
054            initialize();
055        }
056    
057        /**
058         * @see org.apache.tapestry.event.PageDetachListener#pageDetached(org.apache.tapestry.event.PageEvent)
059         */
060        public void pageDetached(PageEvent event)
061        {
062            initialize();
063        }
064        
065        /**
066         * @see org.apache.tapestry.event.PageBeginRenderListener#pageBeginRender(org.apache.tapestry.event.PageEvent)
067         */
068        public void pageBeginRender(PageEvent event)
069        {
070            // values set during rewind are removed
071            initialize();
072        }
073    
074        /**
075         * Initialize the values and return the object to operation identical
076         * to that of the super class.
077         */
078        private void initialize()
079        {
080            m_nCurrentPage = -1;
081            m_nPageCount = -1;
082            m_nStartPage = -1;
083            m_nStopPage = -1;
084        }
085    
086        // This would ideally be a delayed invocation -- called after the form rewind
087        public void changePage(IRequestCycle objCycle)
088        {
089            ITableModelSource objSource = getTableModelSource(); 
090            setCurrentPage(objSource, getSelectedPage());
091    
092            // ensure that the change is saved
093            objSource.fireObservedStateChange();
094        }
095    
096        // defined in the JWC file
097        public abstract int getSelectedPage();
098    
099    
100        /**
101         * @return the current page
102         */
103        public int getCurrentPage()
104        {
105            if (m_nCurrentPage < 0)
106                m_nCurrentPage = super.getCurrentPage();
107            return m_nCurrentPage;
108        }
109    
110        /**
111         * @return number of all pages to display
112         */
113        public int getPageCount()
114        {
115            if (m_nPageCount < 0)
116                m_nPageCount = super.getPageCount();
117            return m_nPageCount;
118        }
119    
120        /**
121         * @return the first page to display
122         */
123        public int getStartPage()
124        {
125            if (m_nStartPage < 0)
126                m_nStartPage = super.getStartPage();
127            return m_nStartPage;
128        }
129    
130        /**
131         * @return the last page to display
132         */
133        public int getStopPage()
134        {
135            if (m_nStopPage < 0)
136                m_nStopPage = super.getStopPage();
137            return m_nStopPage;
138        }
139    
140        /**
141         * @param i the current page
142         */
143        public void setCurrentPage(int i)
144        {
145            m_nCurrentPage = i;
146        }
147    
148        /**
149         * @param i number of all pages to display
150         */
151        public void setPageCount(int i)
152        {
153            m_nPageCount = i;
154        }
155    
156        /**
157         * @param i the first page to display
158         */
159        public void setStartPage(int i)
160        {
161            m_nStartPage = i;
162        }
163    
164        /**
165         * @param i the last page to display
166         */
167        public void setStopPage(int i)
168        {
169            m_nStopPage = i;
170        }
171    
172    }