001    // Copyright 2006-2007 Daniel Gredler
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 net.sf.beanform.util;
016    
017    import java.util.ArrayList;
018    import java.util.Arrays;
019    import java.util.List;
020    
021    import org.apache.hivemind.Messages;
022    import org.apache.tapestry.form.IPropertySelectionModel;
023    
024    /**
025     * A generic {@link IPropertySelectionModel} implementation for enumerations.
026     *
027     * @author Daniel Gredler
028     */
029    public class EnumPropertySelectionModel<T extends Enum<T>> implements IPropertySelectionModel {
030    
031        private List<T> values;
032        private List<String> labels;
033    
034        public EnumPropertySelectionModel( Class<T> type, boolean includeEmptyOption, Messages messages ) {
035    
036            this.values = new ArrayList<T>();
037            if( includeEmptyOption ) this.values.add( null );
038            T[] enums = type.getEnumConstants();
039            this.values.addAll( Arrays.asList( enums ) );
040    
041            this.labels = new ArrayList<String>( this.values.size() );
042            for( T value : this.values ) {
043                if( value == null ) this.labels.add( "" );
044                else this.labels.add( messages.getMessage( value.toString() ) );
045            }
046        }
047    
048        public int getOptionCount() {
049            return this.values.size();
050        }
051    
052        public Object getOption( int index ) {
053            return this.values.get( index );
054        }
055    
056        public String getLabel( int index ) {
057            return this.labels.get( index );
058        }
059    
060        public String getValue( int index ) {
061            return Integer.toString( index );
062        }
063    
064        public Object translateValue( String value ) {
065            return this.values.get( Integer.parseInt( value ) );
066        }
067    
068        public boolean isDisabled(int index) {
069            return false;
070        }
071    
072    }