001    package org.apache.myfaces.tobago.taglib.extension;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import org.apache.myfaces.tobago.TobagoConstants;
021    import org.apache.myfaces.tobago.apt.annotation.ExtensionTag;
022    import org.apache.myfaces.tobago.apt.annotation.Tag;
023    import org.apache.myfaces.tobago.component.ComponentUtil;
024    import org.apache.myfaces.tobago.component.UICommand;
025    import org.apache.myfaces.tobago.taglib.component.AbstractCommandTagDeclaration;
026    import org.apache.myfaces.tobago.taglib.component.MenuCommandTag;
027    import org.apache.myfaces.tobago.taglib.component.SelectOneRadioTag;
028    import org.apache.myfaces.tobago.taglib.decl.HasConverter;
029    import org.apache.myfaces.tobago.taglib.decl.HasIdBindingAndRendered;
030    import org.apache.myfaces.tobago.taglib.decl.HasLabel;
031    import org.apache.myfaces.tobago.taglib.decl.HasValue;
032    import org.apache.myfaces.tobago.taglib.decl.IsDisabled;
033    
034    import javax.faces.component.UIComponent;
035    import javax.faces.el.ValueBinding;
036    import javax.faces.webapp.FacetTag;
037    import javax.servlet.jsp.JspException;
038    import javax.servlet.jsp.tagext.BodyTagSupport;
039    
040    /*
041     * Date: 09.05.2006
042     * Time: 17:41:39
043     */
044    
045    /**
046     * Renders a submenu with select one items (like a radio button).
047     */
048    
049    @Tag(name = "menuRadio", tagExtraInfoClassName = "org.apache.myfaces.tobago.taglib.component.CommandTagExtraInfo")
050    @ExtensionTag(baseClassName = "org.apache.myfaces.tobago.taglib.component.MenuRadioTag")
051    public class MenuRadioExtensionTag extends BodyTagSupport implements AbstractCommandTagDeclaration,
052        HasIdBindingAndRendered, HasLabel, IsDisabled, HasValue, HasConverter {
053    
054      private String rendered;
055      private String value;
056    
057      private MenuCommandTag menuCommandTag;
058      private SelectOneRadioTag selectOneRadio;
059      private FacetTag facetTag;
060      private String action;
061      private String actionListener;
062      private String onclick;
063      private String link;
064      private String resource;
065      private String jsfResource;
066      private String disabled;
067      private String binding;
068      private String label;
069      private String immediate;
070      private String transition;
071      private String converter;
072    
073      @Override
074      public int doStartTag() throws JspException {
075    
076        menuCommandTag = new MenuCommandTag();
077        menuCommandTag.setPageContext(pageContext);
078        menuCommandTag.setParent(getParent());
079    
080        if (rendered != null) {
081          menuCommandTag.setRendered(rendered);
082        }
083        if (action != null) {
084          menuCommandTag.setAction(action);
085        }
086        if (actionListener != null) {
087          menuCommandTag.setActionListener(actionListener);
088        }
089        if (onclick != null) {
090          menuCommandTag.setOnclick(onclick);
091        }
092        if (link != null) {
093          menuCommandTag.setLink(link);
094        }
095        if (resource != null) {
096          menuCommandTag.setResource(resource);
097        }
098        if (jsfResource != null) {
099          menuCommandTag.setJsfResource(jsfResource);
100        }
101        if (disabled != null) {
102          menuCommandTag.setDisabled(disabled);
103        }
104        if (binding != null) {
105          menuCommandTag.setBinding(binding);
106        }
107        if (label != null) {
108          menuCommandTag.setLabel(label);
109        }
110        if (immediate != null) {
111          menuCommandTag.setImmediate(immediate);
112        }
113        if (transition != null) {
114          menuCommandTag.setTransition(transition);
115        }
116        menuCommandTag.doStartTag();
117    
118        facetTag = new FacetTag();
119        facetTag.setPageContext(pageContext);
120        facetTag.setParent(menuCommandTag);
121        facetTag.setName(org.apache.myfaces.tobago.TobagoConstants.FACET_ITEMS);
122    
123        facetTag.doStartTag();
124        selectOneRadio = new SelectOneRadioTag();
125        selectOneRadio.setPageContext(pageContext);
126        selectOneRadio.setParent(facetTag);
127        if (converter != null) {
128          selectOneRadio.setConverter(converter);
129        }
130        if (value != null) {
131          selectOneRadio.setValue(value);
132        }
133        selectOneRadio.doStartTag();
134    
135        return super.doStartTag();
136      }
137    
138      @Override
139      public int doEndTag() throws JspException {
140    
141        // Move attribute renderedPartially from selectOne to menuCommand component
142        UIComponent selectOneComponent = selectOneRadio.getComponentInstance();
143        UICommand command = (UICommand) menuCommandTag.getComponentInstance();
144        ValueBinding binding = selectOneComponent.getValueBinding(TobagoConstants.ATTR_RENDERED_PARTIALLY);
145        if (binding != null) {
146          command.setValueBinding(TobagoConstants.ATTR_RENDERED_PARTIALLY, binding);
147        } else {
148          Object renderedPartially = selectOneComponent.getAttributes().get(TobagoConstants.ATTR_RENDERED_PARTIALLY);
149          ComponentUtil.setRenderedPartially(command, (String) renderedPartially);
150        }
151        
152        selectOneRadio.doEndTag();
153        facetTag.doEndTag();
154        menuCommandTag.doEndTag();
155    
156        return super.doEndTag();
157      }
158    
159      public void setAction(String action) {
160        this.action = action;
161      }
162    
163      public void setActionListener(String actionListener) {
164        this.actionListener = actionListener;
165      }
166    
167      public void setOnclick(String onclick) {
168        this.onclick = onclick;
169      }
170    
171      public void setLink(String navigate) {
172        this.link = navigate;
173      }
174    
175      public void setResource(String resource) {
176        this.resource = resource;
177      }
178    
179      public void setJsfResource(String jsfResource) {
180        this.jsfResource = jsfResource;
181      }
182    
183      public void setBinding(String binding) throws JspException {
184        this.binding = binding;
185      }
186    
187      public void setRendered(String rendered) {
188        this.rendered = rendered;
189      }
190    
191      public void setDisabled(String disabled) {
192        this.disabled = disabled;
193      }
194    
195      public void setValue(String value) {
196        this.value = value;
197      }
198    
199      public void setLabel(String label) {
200        this.label = label;
201      }
202    
203      public void setImmediate(String immediate) {
204        this.immediate = immediate;
205      }
206    
207      public void setTransition(String transition) {
208        this.transition = transition;
209      }
210    
211      public void setConverter(String converter) {
212        this.converter = converter;
213      }
214    
215      @Override
216      public void release() {
217        super.release();
218        rendered = null;
219        value = null;
220        action = null;
221        actionListener = null;
222        onclick = null;
223        link = null;
224        resource = null;
225        jsfResource = null;
226        disabled = null;
227        binding = null;
228        label = null;
229        immediate = null;
230        transition = null;
231        converter = null;
232        menuCommandTag = null;
233        facetTag = null;
234        selectOneRadio = null;
235      }
236    
237    }