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 java.io.Serializable; 018 import java.util.Comparator; 019 020 import org.apache.tapestry.IComponent; 021 import org.apache.tapestry.IRender; 022 import org.apache.tapestry.IRequestCycle; 023 import org.apache.tapestry.components.Block; 024 import org.apache.tapestry.contrib.table.model.IAdvancedTableColumn; 025 import org.apache.tapestry.contrib.table.model.ITableModelSource; 026 import org.apache.tapestry.contrib.table.model.ITableRendererSource; 027 import org.apache.tapestry.valid.RenderString; 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 /** 042 * The suffix of the name of the Block that will be used as the column 043 * renderer 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 049 * renderer for this column. 050 */ 051 public static final String VALUE_RENDERER_BLOCK_SUFFIX = "ColumnValue"; 052 053 private static final long serialVersionUID = 1L; 054 055 private String m_strColumnName; 056 private boolean m_bSortable; 057 private Comparator m_objComparator; 058 059 private ITableRendererSource m_objColumnRendererSource; 060 private ITableRendererSource m_objValueRendererSource; 061 062 public AbstractTableColumn() 063 { 064 this("", false, null); 065 } 066 067 public AbstractTableColumn(String strColumnName, boolean bSortable, 068 Comparator objComparator) 069 { 070 this(strColumnName, bSortable, objComparator, null, null); 071 } 072 073 public AbstractTableColumn(String strColumnName, boolean bSortable, 074 Comparator objComparator, 075 ITableRendererSource objColumnRendererSource, 076 ITableRendererSource objValueRendererSource) 077 { 078 setColumnName(strColumnName); 079 setSortable(bSortable); 080 setComparator(objComparator); 081 setColumnRendererSource(objColumnRendererSource); 082 setValueRendererSource(objValueRendererSource); 083 } 084 085 /** 086 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getColumnName() 087 */ 088 public String getColumnName() 089 { 090 return m_strColumnName; 091 } 092 093 /** 094 * Sets the columnName. 095 * 096 * @param columnName 097 * 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 * 115 * @param sortable 116 * The sortable flag to set 117 */ 118 public void setSortable(boolean sortable) 119 { 120 m_bSortable = sortable; 121 } 122 123 /** 124 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getComparator() 125 */ 126 public Comparator getComparator() 127 { 128 return m_objComparator; 129 } 130 131 /** 132 * Sets the comparator. 133 * 134 * @param comparator 135 * The comparator to set 136 */ 137 public void setComparator(Comparator comparator) 138 { 139 m_objComparator = comparator; 140 } 141 142 /** 143 * @see org.apache.tapestry.contrib.table.model.ITableColumn#getColumnRenderer(IRequestCycle, 144 * ITableModelSource) 145 */ 146 public IRender getColumnRenderer(IRequestCycle objCycle, 147 ITableModelSource objSource) 148 { 149 ITableRendererSource objRendererSource = getColumnRendererSource(); 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 if (objRendererSource == null) 168 { 169 // log error 170 return new RenderString(""); 171 } 172 173 return objRendererSource.getRenderer(objCycle, objSource, this, objRow); 174 } 175 176 /** 177 * Returns the columnRendererSource. 178 * 179 * @return ITableColumnRendererSource 180 */ 181 public ITableRendererSource getColumnRendererSource() 182 { 183 return m_objColumnRendererSource; 184 } 185 186 /** 187 * Sets the columnRendererSource. 188 * 189 * @param columnRendererSource 190 * The columnRendererSource to set 191 */ 192 public void setColumnRendererSource( 193 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 objSettingsContainer 225 * the component from which to get the settings 226 */ 227 public void loadSettings(IComponent objSettingsContainer) 228 { 229 IComponent objColumnRendererSource = (IComponent) objSettingsContainer 230 .getComponents().get( 231 getColumnName() + COLUMN_RENDERER_BLOCK_SUFFIX); 232 if (objColumnRendererSource == null) 233 objColumnRendererSource = (IComponent) objSettingsContainer 234 .getComponents().get(COLUMN_RENDERER_BLOCK_SUFFIX); 235 if (objColumnRendererSource != null 236 && objColumnRendererSource instanceof Block) 237 setColumnRendererSource(new BlockTableRendererSource( 238 (Block) objColumnRendererSource)); 239 240 IComponent objValueRendererSource = (IComponent) objSettingsContainer 241 .getComponents().get( 242 getColumnName() + VALUE_RENDERER_BLOCK_SUFFIX); 243 if (objValueRendererSource == null) 244 objValueRendererSource = (IComponent) objSettingsContainer 245 .getComponents().get(VALUE_RENDERER_BLOCK_SUFFIX); 246 if (objValueRendererSource != null 247 && objValueRendererSource instanceof Block) 248 setValueRendererSource(new BlockTableRendererSource( 249 (Block) objValueRendererSource)); 250 } 251 252 }