001    /*
002     * Apache License
003     * Version 2.0, January 2004
004     * http://www.apache.org/licenses/
005     *
006     * Copyright 1996-2008 by Sven Homburg
007     *
008     * Licensed under the Apache License, Version 2.0 (the "License");
009     * you may not use this file except in compliance with the License.
010     * You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     */
014    
015    package org.chenillekit.tapestry.core.renderes;
016    
017    import java.util.Map;
018    
019    import org.apache.tapestry5.MarkupWriter;
020    import org.apache.tapestry5.OptionGroupModel;
021    import org.apache.tapestry5.OptionModel;
022    import org.apache.tapestry5.SelectModelVisitor;
023    import org.apache.tapestry5.ioc.internal.util.TapestryException;
024    
025    import org.chenillekit.tapestry.core.encoders.MultipleValueEncoder;
026    
027    /**
028     * @version $Id: MultipleSelectModelRenderer.java 594 2009-12-05 15:17:26Z mlusetti $
029     */
030    public class MultipleSelectModelRenderer implements SelectModelVisitor
031    {
032        private final MarkupWriter _writer;
033    
034        private final MultipleValueEncoder _encoder;
035    
036        public MultipleSelectModelRenderer(final MarkupWriter writer, MultipleValueEncoder encoder)
037        {
038            _writer = writer;
039            _encoder = encoder;
040        }
041    
042        public void beginOptionGroup(OptionGroupModel groupModel)
043        {
044            _writer.element("optgroup", "label", groupModel.getLabel());
045    
046            writeDisabled(groupModel.isDisabled());
047            writeAttributes(groupModel.getAttributes());
048        }
049    
050        public void endOptionGroup(OptionGroupModel groupModel)
051        {
052            _writer.end(); // select
053        }
054    
055        @SuppressWarnings("unchecked")
056        public void option(OptionModel optionModel)
057        {
058            Object optionValue = optionModel.getValue();
059    
060            if (_encoder == null)
061                throw new TapestryException("value encoder cannot be null", this, null);
062    
063            String clientValue = _encoder.toClient(optionValue);
064    
065            _writer.element("option", "value", clientValue);
066    
067            if (isOptionSelected(optionModel))
068                _writer.attributes("selected", "selected");
069    
070            writeDisabled(optionModel.isDisabled());
071            writeAttributes(optionModel.getAttributes());
072    
073            _writer.write(optionModel.getLabel());
074    
075            _writer.end();
076        }
077    
078        private void writeDisabled(boolean disabled)
079        {
080            if (disabled) _writer.attributes("disabled", "disabled");
081        }
082    
083        private void writeAttributes(Map<String, String> attributes)
084        {
085            if (attributes == null) return;
086    
087            for (Map.Entry<String, String> e : attributes.entrySet())
088                _writer.attributes(e.getKey(), e.getValue());
089        }
090    
091        protected boolean isOptionSelected(OptionModel optionModel)
092        {
093            return false;
094        }
095    }