001// Copyright 2007-2013 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                        "class", cssClass,
044
045                       "name", getControlName(),
046
047                       "id", getClientId(),
048
049                       "value", "",
050
051                       "size", getWidth());
052    }
053
054
055    final void afterRender(MarkupWriter writer)
056    {
057        writer.end(); // input
058    }
059
060    /**
061     * Returns true, blank input should be ignored and not cause an update to the server-side property bound to the
062     * value parameter.
063     *
064     * @return true
065     */
066    @Override
067    protected boolean ignoreBlankInput()
068    {
069        return true;
070    }
071}