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