    001    // Copyright 2006, 2007, 2008, 2011 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.corelib.components;
    016
    017    import org.apache.tapestry5.ComponentResources;
    018    import org.apache.tapestry5.MarkupWriter;
    019    import org.apache.tapestry5.ValidationTracker;
    020    import org.apache.tapestry5.annotations.*;
    021    import org.apache.tapestry5.corelib.base.AbstractField;
    022    import org.apache.tapestry5.corelib.mixins.RenderDisabled;
    023    import org.apache.tapestry5.ioc.annotations.Inject;
    024    import org.apache.tapestry5.services.Request;
    025
    026    /**
    027     * A Checkbox component is simply a &lt;input type="checkbox"&gt;.
    028     *
    029     * @tapestrydoc
    030     */
    031    public class Checkbox extends AbstractField
    032    {
    033        /**
    034         * The value to be read or updated. If not bound, the Checkbox will attempt to edit a property of its container
    035         * whose name matches the component's id.
    036         */
    037        @Parameter(required = true, autoconnect = true)
    038        private boolean value;
    039
    040        @Inject
    041        private Request request;
    042
    043        @SuppressWarnings("unused")
    044        @Mixin
    045        private RenderDisabled renderDisabled;
    046
    047        @Inject
    048        private ComponentResources resources;
    049
    050        @Environmental
    051        private ValidationTracker tracker;
    052
    053        @BeginRender
    054        void begin(MarkupWriter writer)
    055        {
    056            String asSubmitted = tracker.getInput(this);
    057
    058            boolean checked = asSubmitted != null ? Boolean.parseBoolean(asSubmitted) : value;
    059
    060            writer.element("input", "type", "checkbox",
    061
    062                    "name", getControlName(),
    063
    064                    "id", getClientId(),
    065
    066                    "checked", checked ? "checked" : null);
    067
    068            resources.renderInformalParameters(writer);
    069
    070            decorateInsideField();
    071        }
    072
    073        @AfterRender
    074        void after(MarkupWriter writer)
    075        {
    076            writer.end(); // input
    077        }
    078
    079        @Override
    080        protected void processSubmission(String controlName)
    081        {
    082            String postedValue = request.getParameter(controlName);
    083
    084            // record as "true" or "false"
    085
    086            tracker.recordInput(this, Boolean.toString(postedValue != null));
    087
    088            value = postedValue != null;
    089        }
    090    }