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; 016 017import java.util.Iterator; 018 019import org.apache.tapestry.IAsset; 020import org.apache.tapestry.IMarkupWriter; 021import org.apache.tapestry.IRender; 022import org.apache.tapestry.IRequestCycle; 023import org.apache.tapestry.contrib.table.model.ITableColumn; 024import org.apache.tapestry.contrib.table.model.ITableColumnModel; 025 026/** 027 * A low level Table component that renders the column headers in the table. This component must be 028 * wrapped by {@link org.apache.tapestry.contrib.table.components.TableView}. 029 * <p> 030 * The component iterates over all column objects in the 031 * {@link org.apache.tapestry.contrib.table.model.ITableColumnModel}and renders a header for each 032 * one of them using the renderer provided by the getColumnRender() method in 033 * {@link org.apache.tapestry.contrib.table.model.ITableColumn}. The headers are wrapped in 'th' 034 * tags by default. 035 * <p> 036 * Please see the Component Reference for details on how to use this component. [ <a 037 * href="../../../../../../../ComponentReference/contrib.TableColumns.html">Component Reference 038 * </a>] 039 * 040 * @author mindbridge 041 */ 042public abstract class TableColumns extends AbstractTableViewComponent 043{ 044 public static final String TABLE_COLUMN_ARROW_UP_ATTRIBUTE = "org.apache.tapestry.contrib.table.components.TableColumns.arrowUp"; 045 046 public static final String TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE = "org.apache.tapestry.contrib.table.components.TableColumns.arrowDown"; 047 048 public static final String TABLE_COLUMN_CSS_CLASS_SUFFIX = "ColumnHeader"; 049 050 public abstract IAsset getArrowDownAsset(); 051 052 public abstract IAsset getArrowUpAsset(); 053 054 public abstract void setColumn(ITableColumn column); 055 056 // Transient 057 private ITableColumn m_objTableColumn = null; 058 059 /** 060 * Returns the currently rendered table column. You can call this method to obtain the current 061 * column. 062 * 063 * @return ITableColumn the current table column 064 */ 065 public ITableColumn getTableColumn() 066 { 067 return m_objTableColumn; 068 } 069 070 /** 071 * Sets the currently rendered table column. This method is for internal use only. 072 * 073 * @param tableColumn 074 * The current table column 075 */ 076 public void setTableColumn(ITableColumn tableColumn) 077 { 078 m_objTableColumn = tableColumn; 079 080 if (isParameterBound("column")) 081 setColumn(tableColumn); 082 } 083 084 /** 085 * Get the list of all table columns to be displayed. 086 * 087 * @return an iterator of all table columns 088 */ 089 public Iterator getTableColumnIterator() 090 { 091 ITableColumnModel objColumnModel = getTableModelSource().getTableModel().getColumnModel(); 092 return objColumnModel.getColumns(); 093 } 094 095 /** 096 * Returns the renderer to be used to generate the header of the current column 097 * 098 * @return the header renderer of the current column 099 */ 100 public IRender getTableColumnRenderer() 101 { 102 return getTableColumn().getColumnRenderer( 103 getPage().getRequestCycle(), 104 getTableModelSource()); 105 } 106 107 public abstract String getColumnClassParameter(); 108 109 /** 110 * Returns the CSS class of the generated table cell. It uses the class parameter if it has been 111 * bound, or the default value of "[column name]ColumnHeader" otherwise. 112 * 113 * @return the CSS class of the cell 114 */ 115 public String getColumnClass() 116 { 117 if (isParameterBound("class")) 118 return getColumnClassParameter(); 119 120 return getTableColumn().getColumnName() + TABLE_COLUMN_CSS_CLASS_SUFFIX; 121 } 122 123 /** 124 * @see org.apache.tapestry.BaseComponent#renderComponent(IMarkupWriter, IRequestCycle) 125 */ 126 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) 127 { 128 Object oldValueUp = cycle.getAttribute(TABLE_COLUMN_ARROW_UP_ATTRIBUTE); 129 Object oldValueDown = cycle.getAttribute(TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE); 130 131 try 132 { 133 cycle.setAttribute(TABLE_COLUMN_ARROW_UP_ATTRIBUTE, getArrowUpAsset()); 134 cycle.setAttribute(TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE, getArrowDownAsset()); 135 136 super.renderComponent(writer, cycle); 137 } 138 finally 139 { 140 cycle.setAttribute(TABLE_COLUMN_ARROW_UP_ATTRIBUTE, oldValueUp); 141 cycle.setAttribute(TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE, oldValueDown); 142 143 // set the current column to null when the component is not active 144 m_objTableColumn = null; 145 } 146 } 147 148}