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.form; 016 017 /** 018 * Decorates an underlying {@link IPropertySelectionModel}adding an initial property. The label, 019 * option, and value of the initial property are configurable.<p/> 020 * 021 * By default, the label will be rendered as disabled if its option is null. This behavior can be 022 * changed by {@link #setLabelAlwaysEnabled(boolean)}. 023 * 024 * @author Paul Ferraro 025 * @since 4.0 026 */ 027 public class LabeledPropertySelectionModel implements IPropertySelectionModel 028 { 029 /** 030 * Empty model implementation. Avoids NullPointerExceptions when default constructor is used. 031 */ 032 private static final IPropertySelectionModel EMPTY_MODEL = new IPropertySelectionModel() 033 { 034 /** 035 * @see org.apache.tapestry.form.IPropertySelectionModel#getOptionCount() 036 */ 037 public int getOptionCount() 038 { 039 return 0; 040 } 041 042 /** 043 * @see org.apache.tapestry.form.IPropertySelectionModel#getOption(int) 044 */ 045 public Object getOption(int index) 046 { 047 return null; 048 } 049 050 /** 051 * @see org.apache.tapestry.form.IPropertySelectionModel#getLabel(int) 052 */ 053 public String getLabel(int index) 054 { 055 return null; 056 } 057 058 /** 059 * @see org.apache.tapestry.form.IPropertySelectionModel#getValue(int) 060 */ 061 public String getValue(int index) 062 { 063 return null; 064 } 065 066 public boolean isDisabled(int index) 067 { 068 return false; 069 } 070 071 /** 072 * @see org.apache.tapestry.form.IPropertySelectionModel#translateValue(java.lang.String) 073 */ 074 public Object translateValue(String value) 075 { 076 return null; 077 } 078 }; 079 080 private IPropertySelectionModel _model; 081 082 private String _label = ""; 083 084 private Object _option = null; 085 086 private String _value = ""; 087 088 private boolean _labelAlwaysEnabled; 089 090 /** 091 * Constructs a new LabeledPropertySelectionModel using an empty model and default label, 092 * option, and value. Default constructor is made available so that this model may be specified 093 * as a component helper bean. 094 */ 095 public LabeledPropertySelectionModel() 096 { 097 this(EMPTY_MODEL); 098 } 099 100 /** 101 * Constructs a new LabeledPropertySelectionModel using the specified model and default label, 102 * option, and value. 103 * 104 * @param model 105 * the underlying model to decorate 106 */ 107 public LabeledPropertySelectionModel(IPropertySelectionModel model) 108 { 109 _model = model; 110 } 111 112 /** 113 * Constructs a new LabeledPropertySelectionModel using the specified model and label, and 114 * default option and value. 115 * 116 * @param model 117 * the underlying model to decorate 118 * @param label 119 * the label of the initial property 120 */ 121 public LabeledPropertySelectionModel(IPropertySelectionModel model, String label) 122 { 123 this(model); 124 125 _label = label; 126 } 127 128 /** 129 * Constructs a new LabeledPropertySelectionModel using the specified model, label, and option; 130 * and default value. 131 * 132 * @param model 133 * the underlying model to decorate 134 * @param label 135 * the label of the initial property 136 * @param option 137 * the option value of the initial property 138 */ 139 public LabeledPropertySelectionModel(IPropertySelectionModel model, String label, Object option) 140 { 141 this(model, label); 142 143 _option = option; 144 } 145 146 /** 147 * Constructs a new LabeledPropertySelectionModel using the specified model, label, option, and 148 * value. 149 * 150 * @param model 151 * the underlying model to decorate 152 * @param label 153 * the label of the initial property 154 * @param option 155 * the option value of the initial property 156 * @param value 157 * the value of the initial property 158 */ 159 public LabeledPropertySelectionModel(IPropertySelectionModel model, String label, Object option, String value) 160 { 161 this(model, label, option); 162 163 _value = value; 164 } 165 166 /** 167 * Constructs a new LabeledPropertySelectionModel using the specified model, label, option, and 168 * value. 169 * 170 * @param model 171 * the underlying model to decorate 172 * @param label 173 * the label of the initial property 174 * @param option 175 * the option value of the initial property 176 * @param value 177 * the value of the initial property 178 * @param labelAlwaysEnabled 179 * if the label should always be enabled 180 */ 181 public LabeledPropertySelectionModel(IPropertySelectionModel model, String label, Object option, String value, 182 boolean labelAlwaysEnabled) 183 { 184 this(model, label, option, value); 185 186 _labelAlwaysEnabled = labelAlwaysEnabled; 187 } 188 189 /** 190 * Returns the underlying IPropertySelectionModel. 191 * 192 * @return the underlying IPropertySelectionModel 193 */ 194 public IPropertySelectionModel getModel() 195 { 196 return _model; 197 } 198 199 /** 200 * Sets the underlying IPropertySelectionModel. 201 * 202 * @param model 203 * the IPropertySelectionModel to set 204 */ 205 public void setModel(IPropertySelectionModel model) 206 { 207 _model = model; 208 } 209 210 /** 211 * @see org.apache.tapestry.form.IPropertySelectionModel#getOptionCount() 212 */ 213 public int getOptionCount() 214 { 215 return _model.getOptionCount() + 1; 216 } 217 218 /** 219 * @see org.apache.tapestry.form.IPropertySelectionModel#getOption(int) 220 */ 221 public Object getOption(int index) 222 { 223 return (index == 0) ? _option : _model.getOption(index - 1); 224 } 225 226 /** 227 * @see org.apache.tapestry.form.IPropertySelectionModel#getLabel(int) 228 */ 229 public String getLabel(int index) 230 { 231 return (index == 0) ? _label : _model.getLabel(index - 1); 232 } 233 234 /** 235 * @see org.apache.tapestry.form.IPropertySelectionModel#getValue(int) 236 */ 237 public String getValue(int index) 238 { 239 return (index == 0) ? _value : _model.getValue(index - 1); 240 } 241 242 public boolean isDisabled(int index) 243 { 244 return index == 0 ? (!_labelAlwaysEnabled && _option == null) : _model.isDisabled(index - 1); 245 } 246 247 /** 248 * @see org.apache.tapestry.form.IPropertySelectionModel#translateValue(java.lang.String) 249 */ 250 public Object translateValue(String value) 251 { 252 if (value == null) 253 return null; 254 255 return value.equals(_value) ? _option : _model.translateValue(value); 256 } 257 258 /** 259 * Returns the label of the initial IPropertySelectionModel option. 260 * 261 * @return a IPropertySelectionModel option label 262 */ 263 public String getLabel() 264 { 265 return _label; 266 } 267 268 /** 269 * Sets the label of the initial IPropertySelectionModel option. 270 * 271 * @param label 272 * a IPropertySelectionModel option label 273 */ 274 public void setLabel(String label) 275 { 276 _label = label; 277 } 278 279 /** 280 * Returns the value of the initial IPropertySelectionModel option. 281 * 282 * @return a IPropertySelectionModel option value 283 */ 284 public String getValue() 285 { 286 return _value; 287 } 288 289 /** 290 * Sets the value of the initial IPropertySelectionModel option. 291 * 292 * @param value 293 * a IPropertySelectionModel option value 294 */ 295 public void setValue(String value) 296 { 297 _value = value; 298 } 299 300 /** 301 * Returns the initial option. 302 * 303 * @return a PropertySelectionModel option 304 */ 305 public Object getOption() 306 { 307 return _option; 308 } 309 310 /** 311 * Sets the initial IPropertySelectionModel option. 312 * 313 * @param option 314 * a IPropertySelectionModel option 315 */ 316 public void setOption(Object option) 317 { 318 _option = option; 319 } 320 321 /** 322 * Returns if label should always be enabled. 323 */ 324 public boolean isLabelAlwaysEnabled() 325 { 326 return _labelAlwaysEnabled; 327 } 328 329 /** 330 * Sets the state of the label. 331 */ 332 public void setLabelAlwaysEnabled(boolean labelAlwaysEnabled) 333 { 334 _labelAlwaysEnabled = labelAlwaysEnabled; 335 } 336 }