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.SelectBooleanCheckboxTag;
028    import org.apache.myfaces.tobago.taglib.decl.HasBooleanValue;
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.IsDisabled;
032    
033    import javax.faces.component.UIComponent;
034    import javax.faces.el.ValueBinding;
035    import javax.faces.webapp.FacetTag;
036    import javax.servlet.jsp.JspException;
037    import javax.servlet.jsp.tagext.BodyTagSupport;
038    
039    /**
040     * Renders a checkable menuitem.
041     */
042    @Tag(name = "menuCheckbox", tagExtraInfoClassName = "org.apache.myfaces.tobago.taglib.component.CommandTagExtraInfo")
043    @ExtensionTag(baseClassName = "org.apache.myfaces.tobago.taglib.component.MenuCheckboxTag")
044    public class MenuCheckboxExtensionTag extends BodyTagSupport implements AbstractCommandTagDeclaration,
045        HasIdBindingAndRendered, IsDisabled, HasBooleanValue, HasLabel {
046      private String rendered;
047      private String value;
048    
049      private MenuCommandTag menuCommandTag;
050      private SelectBooleanCheckboxTag selectBooleanCheckbox;
051      private FacetTag facetTag;
052      private String action;
053      private String actionListener;
054      private String onclick;
055      private String link;
056      private String resource;
057      private String jsfResource;
058      private String disabled;
059      private String binding;
060      private String label;
061      private String immediate;
062      private String transition;
063    
064      @Override
065      public int doStartTag() throws JspException {
066    
067        menuCommandTag = new MenuCommandTag();
068        menuCommandTag.setPageContext(pageContext);
069        menuCommandTag.setParent(getParent()); // ???
070        if (rendered != null) {
071          menuCommandTag.setRendered(rendered);
072        }
073        if (action != null) {
074          menuCommandTag.setAction(action);
075        }
076        if (actionListener != null) {
077          menuCommandTag.setActionListener(actionListener);
078        }
079        if (onclick != null) {
080          menuCommandTag.setOnclick(onclick);
081        }
082        if (link != null) {
083          menuCommandTag.setLink(link);
084        }
085        if (resource != null) {
086          menuCommandTag.setResource(resource);
087        }
088        if (jsfResource != null) {
089          menuCommandTag.setJsfResource(jsfResource);
090        }
091        if (disabled != null) {
092          menuCommandTag.setDisabled(disabled);
093        }
094        if (binding != null) {
095          menuCommandTag.setBinding(binding);
096        }
097        if (label != null) {
098          menuCommandTag.setLabel(label);
099        }
100        if (immediate != null) {
101          menuCommandTag.setImmediate(immediate);
102        }
103        if (transition != null) {
104          menuCommandTag.setTransition(transition);
105        }
106        menuCommandTag.doStartTag();
107    
108        facetTag = new FacetTag();
109        facetTag.setPageContext(pageContext);
110        facetTag.setParent(menuCommandTag);
111        facetTag.setName(org.apache.myfaces.tobago.TobagoConstants.FACET_ITEMS);
112    
113        facetTag.doStartTag();
114        selectBooleanCheckbox = new SelectBooleanCheckboxTag();
115        selectBooleanCheckbox.setPageContext(pageContext);
116        if (value != null) {
117          selectBooleanCheckbox.setValue(value);
118        }
119        selectBooleanCheckbox.setParent(facetTag);
120        selectBooleanCheckbox.doStartTag();
121        return super.doStartTag();
122      }
123    
124      @Override
125      public int doEndTag() throws JspException {
126    
127        // Move attribute renderedPartially from selectBoolean to menuCommand component
128        UIComponent selectBooleanComponent = selectBooleanCheckbox.getComponentInstance();
129        UICommand command = (UICommand) menuCommandTag.getComponentInstance();
130        ValueBinding binding = selectBooleanComponent.getValueBinding(TobagoConstants.ATTR_RENDERED_PARTIALLY);
131        if (binding != null) {
132          command.setValueBinding(TobagoConstants.ATTR_RENDERED_PARTIALLY, binding);
133        } else {
134          Object renderedPartially = selectBooleanComponent.getAttributes().get(TobagoConstants.ATTR_RENDERED_PARTIALLY);
135          ComponentUtil.setRenderedPartially(command, (String) renderedPartially);
136        }
137    
138        selectBooleanCheckbox.doEndTag();
139        facetTag.doEndTag();
140        menuCommandTag.doEndTag();
141        return super.doEndTag();
142      }
143    
144      public void setAction(String action) {
145        this.action = action;
146      }
147    
148      public void setActionListener(String actionListener) {
149        this.actionListener = actionListener;
150      }
151    
152      public void setOnclick(String onclick) {
153        this.onclick = onclick;
154      }
155    
156      public void setLink(String navigate) {
157        this.link = navigate;
158      }
159    
160      public void setResource(String resource) {
161        this.resource = resource;
162      }
163    
164      public void setJsfResource(String jsfResource) {
165        this.jsfResource = jsfResource;
166      }
167    
168      public void setBinding(String binding) throws JspException {
169        this.binding = binding;
170      }
171    
172      public void setRendered(String rendered) {
173        this.rendered = rendered;
174      }
175    
176      public void setDisabled(String disabled) {
177        this.disabled = disabled;
178      }
179    
180      public void setValue(String value) {
181        this.value = value;
182      }
183    
184      public void setLabel(String label) {
185        this.label = label;
186      }
187    
188      public void setImmediate(String immediate) {
189        this.immediate = immediate;
190      }
191    
192      public void setTransition(String transition) {
193        this.transition = transition;
194      }
195    
196      public void release() {
197        super.release();
198        rendered = null;
199        value = null;
200        action = null;
201        actionListener = null;
202        onclick = null;
203        link = null;
204        resource = null;
205        jsfResource = null;
206        disabled = null;
207        binding = null;
208        label = null;
209        immediate = null;
210        transition = null;
211        menuCommandTag = null;
212        facetTag = null;
213        selectBooleanCheckbox = null;
214      }
215    
216    }