001// Copyright 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
015package org.apache.tapestry5.corelib.components;
016
017import org.apache.tapestry5.MarkupWriter;
018import org.apache.tapestry5.corelib.base.AbstractTextField;
019
020/**
021 * A version of {@link TextField}, but rendered out as an <input type="password"> element. Further, the output
022 * value for a PasswordField is always blank.  When the value provided to the PasswordField is blank, it does not update
023 * its property (care should be taken that the "required" validator not be used in that case).
024 * <p/>
025 * Includes the <code>size</code> attribute, if a {@link org.apache.tapestry5.beaneditor.Width} annotation is present on
026 * the property bound to the value parameter.
027 * 
028 * @tapestrydoc
029 * @see Form
030 * @see TextField
031 * @see TextArea
032 */
033public class PasswordField extends AbstractTextField
034{
035
036    @Override
037    protected final void writeFieldTag(MarkupWriter writer, String value)
038    {
039        writer.element("input",
040
041                       "type", "password",
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}