001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005//     http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5.corelib.components;
014
015import org.apache.tapestry5.MarkupWriter;
016import org.apache.tapestry5.corelib.base.AbstractTextField;
017
018/**
019 * A version of {@link TextField}, but rendered out as an <input type="password"> element. Further, the output
020 * value for a PasswordField is always blank.  When the value provided to the PasswordField is blank, it does not update
021 * its property (care should be taken that the "required" validator not be used in that case).
022 *
023 * Includes the <code>size</code> attribute, if a {@link org.apache.tapestry5.beaneditor.Width} annotation is present on
024 * the property bound to the value parameter.
025 * 
026 * @tapestrydoc
027 * @see Form
028 * @see TextField
029 * @see TextArea
030 */
031public class PasswordField extends AbstractTextField
032{
033
034    @Override
035    protected final void writeFieldTag(MarkupWriter writer, String value)
036    {
037        writer.element("input",
038
039                       "type", "password",
040
041                        "class", cssClass,
042
043                       "name", getControlName(),
044
045                       "id", getClientId(),
046
047                       "value", "",
048
049                       "size", getWidth());
050    }
051
052
053    final void afterRender(MarkupWriter writer)
054    {
055        writer.end(); // input
056    }
057
058    /**
059     * Returns true, blank input should be ignored and not cause an update to the server-side property bound to the
060     * value parameter.
061     *
062     * @return true
063     */
064    @Override
065    protected boolean ignoreBlankInput()
066    {
067        return true;
068    }
069}