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    
015    package org.apache.tapestry5.corelib.components;
016    
017    import org.apache.tapestry5.MarkupWriter;
018    import 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     */
033    public 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    }