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 }