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.inserted;
016    
017    import org.apache.tapestry.BaseComponent;
018    import org.apache.tapestry.IAsset;
019    import org.apache.tapestry.IRequestCycle;
020    import org.apache.tapestry.contrib.table.components.TableColumns;
021    import org.apache.tapestry.contrib.table.model.ITableColumn;
022    import org.apache.tapestry.contrib.table.model.ITableModel;
023    import org.apache.tapestry.contrib.table.model.ITableModelSource;
024    import org.apache.tapestry.contrib.table.model.ITableRendererListener;
025    import org.apache.tapestry.contrib.table.model.ITableSortingState;
026    import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn;
027    import org.apache.tapestry.event.PageDetachListener;
028    import org.apache.tapestry.event.PageEvent;
029    import org.apache.tapestry.util.ComponentAddress;
030    
031    /**
032     * A component that renders the default column header. If the current column is
033     * sortable, it renders the header as a link. Clicking on the link causes the
034     * table to be sorted on that column. Clicking on the link again causes the
035     * sorting order to be reversed.
036     * 
037     * @author mindbridge
038     */
039    public abstract class SimpleTableColumnComponent extends BaseComponent
040            implements ITableRendererListener, PageDetachListener
041    {
042    
043        // transient
044        private ITableColumn m_objColumn;
045        private ITableModelSource m_objModelSource;
046    
047        public SimpleTableColumnComponent()
048        {
049            init();
050        }
051    
052        /**
053         * @see org.apache.tapestry.event.PageDetachListener#pageDetached(PageEvent)
054         */
055        public void pageDetached(PageEvent arg0)
056        {
057            init();
058        }
059    
060        private void init()
061        {
062            m_objColumn = null;
063            m_objModelSource = null;
064        }
065    
066        /**
067         * @see org.apache.tapestry.contrib.table.model.ITableRendererListener#initializeRenderer(IRequestCycle,
068         *      ITableModelSource, ITableColumn, Object)
069         */
070        public void initializeRenderer(IRequestCycle objCycle,
071                ITableModelSource objSource, ITableColumn objColumn, Object objRow)
072        {
073            m_objModelSource = objSource;
074            m_objColumn = objColumn;
075        }
076    
077        public ITableModel getTableModel()
078        {
079            return m_objModelSource.getTableModel();
080        }
081    
082        public boolean getColumnSorted()
083        {
084            return m_objColumn.getSortable();
085        }
086    
087        public String getDisplayName()
088        {
089            if (m_objColumn instanceof SimpleTableColumn)
090            {
091                SimpleTableColumn objSimpleColumn = (SimpleTableColumn) m_objColumn;
092                return objSimpleColumn.getDisplayName();
093            }
094            return m_objColumn.getColumnName();
095        }
096    
097        public boolean getIsSorted()
098        {
099            ITableSortingState objSortingState = getTableModel().getSortingState();
100            String strSortColumn = objSortingState.getSortColumn();
101            return m_objColumn.getColumnName().equals(strSortColumn);
102        }
103    
104        public IAsset getSortImage()
105        {
106            IAsset objImageAsset;
107    
108            IRequestCycle objCycle = getPage().getRequestCycle();
109            ITableSortingState objSortingState = getTableModel().getSortingState();
110            if (objSortingState.getSortOrder() == ITableSortingState.SORT_ASCENDING)
111            {
112                objImageAsset = (IAsset) objCycle
113                        .getAttribute(TableColumns.TABLE_COLUMN_ARROW_UP_ATTRIBUTE);
114                if (objImageAsset == null) objImageAsset = getAsset("sortUp");
115            }
116            else
117            {
118                objImageAsset = (IAsset) objCycle
119                        .getAttribute(TableColumns.TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE);
120                if (objImageAsset == null) objImageAsset = getAsset("sortDown");
121            }
122    
123            return objImageAsset;
124        }
125    
126        public Object[] getColumnSelectedParameters()
127        {
128            return new Object[] { new ComponentAddress(m_objModelSource),
129                    m_objColumn.getColumnName() };
130        }
131    
132        public void columnSelected(IRequestCycle objCycle)
133        {
134            Object[] arrArgs = objCycle.getListenerParameters();
135            ComponentAddress objAddr = (ComponentAddress) arrArgs[0];
136            String strColumnName = (String) arrArgs[1];
137    
138            ITableModelSource objSource = (ITableModelSource) objAddr
139                    .findComponent(objCycle);
140            objSource.storeTableAction(new TableActionColumnSort(strColumnName));
141        }
142    
143    }