001    // Copyright 2007, 2008 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.tapestry5.internal.util;
016    
017    import org.apache.tapestry5.*;
018    
019    import java.util.Map;
020    
021    public class SelectModelRenderer implements SelectModelVisitor
022    {
023        private final MarkupWriter writer;
024    
025        private final ValueEncoder encoder;
026    
027        public SelectModelRenderer(final MarkupWriter writer, ValueEncoder encoder)
028        {
029            this.writer = writer;
030            this.encoder = encoder;
031        }
032    
033        public void beginOptionGroup(OptionGroupModel groupModel)
034        {
035            writer.element("optgroup", "label", groupModel.getLabel());
036    
037            writeDisabled(groupModel.isDisabled());
038            writeAttributes(groupModel.getAttributes());
039        }
040    
041        public void endOptionGroup(OptionGroupModel groupModel)
042        {
043            writer.end(); // select
044        }
045    
046        @SuppressWarnings("unchecked")
047        public void option(OptionModel optionModel)
048        {
049            Object optionValue = optionModel.getValue();
050    
051            String clientValue = encoder.toClient(optionValue);
052    
053            writer.element("option", "value", clientValue);
054    
055            if (isOptionSelected(optionModel, clientValue)) writer.attributes("selected", "selected");
056    
057            writeDisabled(optionModel.isDisabled());
058            writeAttributes(optionModel.getAttributes());
059    
060            writer.write(optionModel.getLabel());
061    
062            writer.end();
063        }
064    
065        private void writeDisabled(boolean disabled)
066        {
067            if (disabled) writer.attributes("disabled", "disabled");
068        }
069    
070        private void writeAttributes(Map<String, String> attributes)
071        {
072            if (attributes == null) return;
073    
074            for (Map.Entry<String, String> e : attributes.entrySet())
075                writer.attributes(e.getKey(), e.getValue());
076        }
077    
078        /**
079         * If true, then the selected attribute will be written. This implementation always returns false.
080         */
081        protected boolean isOptionSelected(OptionModel optionModel, String clientValue)
082        {
083            return false;
084        }
085    
086    }