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