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.
020     * 
021     * @author Paul Ferraro
022     * @since 4.0
023     */
024    public 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    }