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.util.ComponentAddress;
020    
021    /**
022     * A low level Table component that renders the pages in the table.
023     * This component must be wrapped by {@link org.apache.tapestry.contrib.table.components.TableView}.
024     * <p>
025     * The component generates a list of pages in the Table centered around the 
026     * current one and allows you to navigate to other pages.
027     * <p> 
028     * Please see the Component Reference for details on how to use this component. 
029     * 
030     *  [<a href="../../../../../../../ComponentReference/contrib.TablePages.html">Component Reference</a>]
031     * 
032     * @author mindbridge
033     *
034     */
035    public abstract class TablePages extends AbstractTableViewComponent
036    {
037        // Transient
038        private int m_nDisplayPage;
039        
040        // Bindings    
041        public abstract int getPagesDisplayed();
042    
043        /**
044         * Returns the displayPage.
045         * @return int
046         */
047        public int getDisplayPage()
048        {
049            return m_nDisplayPage;
050        }
051    
052        /**
053         * Sets the displayPage.
054         * @param displayPage The displayPage to set
055         */
056        public void setDisplayPage(int displayPage)
057        {
058            m_nDisplayPage = displayPage;
059        }
060    
061        public int getCurrentPage()
062        {
063            return getTableModelSource().getTableModel().getPagingState().getCurrentPage() + 1;
064        }
065    
066        public int getPageCount()
067        {
068            return getTableModelSource().getTableModel().getPageCount();
069        }
070    
071        public boolean getCondBack()
072        {
073            return getCurrentPage() > 1;
074        }
075    
076        public boolean getCondFwd()
077        {
078            return getCurrentPage() < getPageCount();
079        }
080    
081        public boolean getCondCurrent()
082        {
083            return getDisplayPage() == getCurrentPage();
084        }
085    
086        public int getStartPage()
087        {
088            int nCurrent = getCurrentPage();
089            int nPagesDisplayed = getPagesDisplayed();
090    
091            int nRightMargin = nPagesDisplayed / 2;
092            int nStop = nCurrent + nRightMargin;
093            int nLastPage = getPageCount();
094    
095            int nLeftAddon = 0;
096            if (nStop > nLastPage)
097                nLeftAddon = nStop - nLastPage;
098    
099            int nLeftMargin = (nPagesDisplayed - 1) / 2 + nLeftAddon;
100            int nStart = nCurrent - nLeftMargin;
101            int nFirstPage = 1;
102            if (nStart < nFirstPage)
103                nStart = nFirstPage;
104            return nStart;
105        }
106    
107        public int getStopPage()
108        {
109            int nCurrent = getCurrentPage();
110            int nPagesDisplayed = getPagesDisplayed();
111    
112            int nLeftMargin = (nPagesDisplayed - 1) / 2;
113            int nStart = nCurrent - nLeftMargin;
114            int nFirstPage = 1;
115    
116            int nRightAddon = 0;
117            if (nStart < nFirstPage)
118                nRightAddon = nFirstPage - nStart;
119    
120            int nRightMargin = nPagesDisplayed / 2 + nRightAddon;
121            int nStop = nCurrent + nRightMargin;
122            int nLastPage = getPageCount();
123            if (nStop > nLastPage)
124                nStop = nLastPage;
125            return nStop;
126        }
127    
128        public Integer[] getPageList()
129        {
130            int nStart = getStartPage();
131            int nStop = getStopPage();
132    
133            Integer[] arrPages = new Integer[nStop - nStart + 1];
134            for (int i = nStart; i <= nStop; i++)
135                arrPages[i - nStart] = new Integer(i);
136    
137            return arrPages;
138        }
139    
140        public Object[] getFirstPageContext()
141        {
142            ComponentAddress objAddress = new ComponentAddress(getTableModelSource());
143            return new Object[] { objAddress, new Integer(1)};
144        }
145    
146        public Object[] getLastPageContext()
147        {
148            ComponentAddress objAddress = new ComponentAddress(getTableModelSource());
149            return new Object[] { objAddress, new Integer(getPageCount())};
150        }
151    
152        public Object[] getBackPageContext()
153        {
154            ComponentAddress objAddress = new ComponentAddress(getTableModelSource());
155            return new Object[] { objAddress, new Integer(getCurrentPage() - 1)};
156        }
157    
158        public Object[] getFwdPageContext()
159        {
160            ComponentAddress objAddress = new ComponentAddress(getTableModelSource());
161            return new Object[] { objAddress, new Integer(getCurrentPage() + 1)};
162        }
163    
164        public Object[] getDisplayPageContext()
165        {
166            ComponentAddress objAddress = new ComponentAddress(getTableModelSource());
167            return new Object[] { objAddress, new Integer(m_nDisplayPage)};
168        }
169    
170        public void changePage(IRequestCycle objCycle)
171        {
172            Object[] arrParameters = objCycle.getListenerParameters();
173            if (arrParameters.length != 2
174                && !(arrParameters[0] instanceof ComponentAddress)
175                && !(arrParameters[1] instanceof Integer))
176            {
177                // error
178                return;
179            }
180    
181            ComponentAddress objAddress = (ComponentAddress)arrParameters[0];
182            ITableModelSource objSource = (ITableModelSource)objAddress.findComponent(objCycle);
183            int page = ((Integer)arrParameters[1]).intValue();
184            
185            objSource.storeTableAction(new TableActionPageChange(page));
186        }
187    
188        public void setCurrentPage(ITableModelSource objSource, int nPage)
189        {
190            objSource.getTableModel().getPagingState().setCurrentPage(nPage - 1);
191        }
192    
193    }