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