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.model.common; 016 017import java.io.Serializable; 018import java.util.Comparator; 019 020import org.apache.tapestry.IComponent; 021import org.apache.tapestry.IRender; 022import org.apache.tapestry.IRequestCycle; 023import org.apache.tapestry.components.Block; 024import org.apache.tapestry.contrib.table.model.IAdvancedTableColumn; 025import org.apache.tapestry.contrib.table.model.ITableModelSource; 026import org.apache.tapestry.contrib.table.model.ITableRendererSource; 027import org.apache.tapestry.valid.RenderString; 028 029/** 030 * A base implementation of {@link org.apache.tapestry.contrib.table.model.ITableColumn} 031 * that allows renderers to be set via aggregation. 032 * 033 * @see org.apache.tapestry.contrib.table.model.ITableRendererSource 034 * @author mindbridge 035 * @since 2.3 036 */ 037public class AbstractTableColumn implements IAdvancedTableColumn, Serializable 038{ 039 private static final long serialVersionUID = 1L; 040 041 /** 042 * The suffix of the name of the Block that will be used as the column renderer 043 * for this column 044 */ 045 public static final String COLUMN_RENDERER_BLOCK_SUFFIX = "ColumnHeader"; 046 047 /** 048 * The suffix of the name of the Block that will be used as the value renderer 049 * for this column 050 */ 051 public static final String VALUE_RENDERER_BLOCK_SUFFIX = "ColumnValue"; 052 053 private String m_strColumnName; 054 private boolean m_bSortable; 055 private Comparator m_objComparator; 056 057 private ITableRendererSource m_objColumnRendererSource; 058 private ITableRendererSource m_objValueRendererSource; 059 060 public AbstractTableColumn() 061 { 062 this("", false, null); 063 } 064 065 public AbstractTableColumn( 066 String strColumnName, 067 boolean bSortable, 068 Comparator objComparator) 069 { 070 this(strColumnName, bSortable, objComparator, null, null); 071 } 072 073 public AbstractTableColumn( 074 String strColumnName, 075 boolean bSortable, 076 Comparator objComparator, 077 ITableRendererSource objColumnRendererSource, 078 ITableRendererSource objValueRendererSource) 079 { 080 setColumnName(strColumnName); 081 setSortable(bSortable); 082 setComparator(objComparator); 083 setColumnRendererSource(objColumnRendererSource); 084 setValueRendererSource(objValueRendererSource); 085 } 086 087 /** 088 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getColumnName() 089 */ 090 public String getColumnName() 091 { 092 return m_strColumnName; 093 } 094 095 /** 096 * Sets the columnName. 097 * @param columnName The columnName to set 098 */ 099 public void setColumnName(String columnName) 100 { 101 m_strColumnName = columnName; 102 } 103 104 /** 105 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getSortable() 106 */ 107 public boolean getSortable() 108 { 109 return m_bSortable; 110 } 111 112 /** 113 * Sets whether the column is sortable. 114 * @param sortable The sortable flag to set 115 */ 116 public void setSortable(boolean sortable) 117 { 118 m_bSortable = sortable; 119 } 120 121 /** 122 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getComparator() 123 */ 124 public Comparator getComparator() 125 { 126 return m_objComparator; 127 } 128 129 /** 130 * Sets the comparator. 131 * @param comparator The comparator to set 132 */ 133 public void setComparator(Comparator comparator) 134 { 135 m_objComparator = comparator; 136 } 137 138 /** 139 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getColumnRenderer(IRequestCycle, ITableModelSource) 140 */ 141 public IRender getColumnRenderer( 142 IRequestCycle objCycle, 143 ITableModelSource objSource) 144 { 145 ITableRendererSource objRendererSource = 146 getColumnRendererSource(); 147 if (objRendererSource == null) 148 { 149 // log error 150 return new RenderString(""); 151 } 152 153 return objRendererSource.getRenderer(objCycle, objSource, this, null); 154 } 155 156 /** 157 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getValueRenderer(IRequestCycle, ITableModelSource, Object) 158 */ 159 public IRender getValueRenderer( 160 IRequestCycle objCycle, 161 ITableModelSource objSource, 162 Object objRow) 163 { 164 ITableRendererSource objRendererSource = getValueRendererSource(); 165 if (objRendererSource == null) 166 { 167 // log error 168 return new RenderString(""); 169 } 170 171 return objRendererSource.getRenderer( 172 objCycle, 173 objSource, 174 this, 175 objRow); 176 } 177 178 /** 179 * Returns the columnRendererSource. 180 * @return ITableColumnRendererSource 181 */ 182 public ITableRendererSource getColumnRendererSource() 183 { 184 return m_objColumnRendererSource; 185 } 186 187 /** 188 * Sets the columnRendererSource. 189 * @param columnRendererSource The columnRendererSource to set 190 */ 191 public void setColumnRendererSource(ITableRendererSource columnRendererSource) 192 { 193 m_objColumnRendererSource = columnRendererSource; 194 } 195 196 /** 197 * Returns the valueRendererSource. 198 * 199 * @return the valueRendererSource of this column 200 */ 201 public ITableRendererSource getValueRendererSource() 202 { 203 return m_objValueRendererSource; 204 } 205 206 /** 207 * Sets the valueRendererSource. 208 * 209 * @param valueRendererSource The valueRendererSource to set 210 */ 211 public void setValueRendererSource(ITableRendererSource valueRendererSource) 212 { 213 m_objValueRendererSource = valueRendererSource; 214 } 215 216 /** 217 * Use the column name to get the column and value renderer sources 218 * from the provided component. 219 * Use the column and value renderer sources for all columns if necessary. 220 * 221 * @param objSettingsContainer the component from which to get the settings 222 */ 223 public void loadSettings(IComponent objSettingsContainer) 224 { 225 // Replace any periods in the column name with underscores so columns can be referenced in a @Block 226 String columnName = getColumnName().replace('.', '_'); 227 228 IComponent objColumnRendererSource = (IComponent) objSettingsContainer.getComponents().get(columnName + COLUMN_RENDERER_BLOCK_SUFFIX); 229 if (objColumnRendererSource == null) 230 objColumnRendererSource = (IComponent) objSettingsContainer.getComponents().get(COLUMN_RENDERER_BLOCK_SUFFIX); 231 if (objColumnRendererSource != null && objColumnRendererSource instanceof Block) 232 setColumnRendererSource(new BlockTableRendererSource((Block) objColumnRendererSource)); 233 234 IComponent objValueRendererSource = (IComponent) objSettingsContainer.getComponents().get(columnName + VALUE_RENDERER_BLOCK_SUFFIX); 235 if (objValueRendererSource == null) 236 objValueRendererSource = (IComponent) objSettingsContainer.getComponents().get(VALUE_RENDERER_BLOCK_SUFFIX); 237 if (objValueRendererSource != null && objValueRendererSource instanceof Block) 238 setValueRendererSource(new BlockTableRendererSource((Block) objValueRendererSource)); 239 } 240 241}