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
015package org.apache.tapestry.contrib.table.components.inserted;
016
017import org.apache.tapestry.BaseComponent;
018import org.apache.tapestry.IAsset;
019import org.apache.tapestry.IRequestCycle;
020import org.apache.tapestry.contrib.table.components.TableColumns;
021import org.apache.tapestry.contrib.table.model.ITableColumn;
022import org.apache.tapestry.contrib.table.model.ITableModel;
023import org.apache.tapestry.contrib.table.model.ITableModelSource;
024import org.apache.tapestry.contrib.table.model.ITableRendererListener;
025import org.apache.tapestry.contrib.table.model.ITableSortingState;
026import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn;
027import org.apache.tapestry.event.PageDetachListener;
028import org.apache.tapestry.event.PageEvent;
029import 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 */
040public 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}