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 <input type="checkbox">.
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 }