1 /* 2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 27 package sun.lwawt; 28 29 import java.awt.Dimension; 30 import java.awt.Point; 31 import java.awt.TextField; 32 import java.awt.event.ActionEvent; 33 import java.awt.event.ActionListener; 34 import java.awt.event.FocusEvent; 35 import java.awt.peer.TextFieldPeer; 36 37 import javax.swing.JPasswordField; 38 import javax.swing.text.JTextComponent; 39 40 final class LWTextFieldPeer 41 extends LWTextComponentPeer<TextField, JPasswordField> 42 implements TextFieldPeer, ActionListener { 43 44 private static final int DEFAULT_COLUMNS = 1; 45 46 LWTextFieldPeer(final TextField target, 47 final PlatformComponent platformComponent) { 48 super(target, platformComponent); 49 } 50 51 @Override 52 protected JPasswordField createDelegate() { 53 return new JTextAreaDelegate(); 54 } 55 56 @Override 57 public void initialize() { 58 super.initialize(); 59 setEchoChar(getTarget().getEchoChar()); 60 synchronized (getDelegateLock()) { 61 getDelegate().addActionListener(this); 62 } 63 } 64 65 @Override 66 public JTextComponent getTextComponent() { 67 return getDelegate(); 68 } 69 70 @Override 71 public void setEchoChar(final char echoChar) { 72 synchronized (getDelegateLock()) { 73 getDelegate().setEchoChar(echoChar); 74 getDelegate().putClientProperty("JPasswordField.cutCopyAllowed", 75 getDelegate().echoCharIsSet() 76 ? Boolean.FALSE : Boolean.TRUE); 77 } 78 } 79 80 @Override 81 public Dimension getPreferredSize(final int columns) { 82 return getPreferredSize(1, columns); 83 } 84 85 @Override 86 public Dimension getMinimumSize(final int columns) { 87 return getPreferredSize(columns); 88 } 89 90 @Override 91 public Dimension getMinimumSize() { 92 return getMinimumSize(DEFAULT_COLUMNS); 93 } 94 95 @Override 96 public void actionPerformed(final ActionEvent e) { 97 postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, 98 getText(), e.getWhen(), e.getModifiers())); 99 } 100 101 /** 102 * Restoring native behavior. We should sets the selection range to zero, 103 * when component lost its focus. 104 * 105 * @param e the focus event 106 */ 107 @Override 108 protected void handleJavaFocusEvent(final FocusEvent e) { 109 if (e.getID() == FocusEvent.FOCUS_LOST) { 110 // In order to de-select the selection 111 setCaretPosition(0); 112 } 113 super.handleJavaFocusEvent(e); 114 } 115 116 private final class JTextAreaDelegate extends JPasswordField { 117 118 // Empty non private constructor was added because access to this 119 // class shouldn't be emulated by a synthetic accessor method. 120 JTextAreaDelegate() { 121 super(); 122 } 123 124 @Override 125 public boolean hasFocus() { 126 return getTarget().hasFocus(); 127 } 128 129 @Override 130 public Point getLocationOnScreen() { 131 return LWTextFieldPeer.this.getLocationOnScreen(); 132 } 133 } 134 }