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 import javax.tools.annotation.GenerateNativeHeader; 41 42 /* No native methods here, but the constants are needed in the supporting JNI code */ 43 @GenerateNativeHeader 44 final class LWTextFieldPeer 45 extends LWTextComponentPeer<TextField, JPasswordField> 46 implements TextFieldPeer, ActionListener { 47 48 private static final int DEFAULT_COLUMNS = 1; 49 50 LWTextFieldPeer(final TextField target, 51 final PlatformComponent platformComponent) { 52 super(target, platformComponent); 53 } 54 55 @Override 56 protected JPasswordField createDelegate() { 57 return new JTextAreaDelegate(); 58 } 59 60 @Override 61 void initializeImpl() { 62 super.initializeImpl(); 63 setEchoChar(getTarget().getEchoChar()); 64 synchronized (getDelegateLock()) { 65 getDelegate().addActionListener(this); 66 } 67 } 68 69 @Override 70 public JTextComponent getTextComponent() { 71 return getDelegate(); 72 } 73 74 @Override 75 public void setEchoChar(final char echoChar) { 76 synchronized (getDelegateLock()) { 77 getDelegate().setEchoChar(echoChar); 78 getDelegate().putClientProperty("JPasswordField.cutCopyAllowed", 79 getDelegate().echoCharIsSet() 80 ? Boolean.FALSE : Boolean.TRUE); 81 } 82 } 83 84 @Override 85 public Dimension getPreferredSize(final int columns) { 86 return getPreferredSize(1, columns); 87 } 88 89 @Override 90 public Dimension getMinimumSize(final int columns) { 91 return getPreferredSize(columns); 92 } 93 94 @Override 95 public Dimension getMinimumSize() { 96 return getMinimumSize(DEFAULT_COLUMNS); 97 } 98 99 @Override 100 public void actionPerformed(final ActionEvent e) { 101 postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, 102 getText(), e.getWhen(), e.getModifiers())); 103 } 104 105 /** 106 * Restoring native behavior. We should sets the selection range to zero, 107 * when component lost its focus. 108 * 109 * @param e the focus event 110 */ 111 @Override 112 protected void handleJavaFocusEvent(final FocusEvent e) { 113 if (e.getID() == FocusEvent.FOCUS_LOST) { 114 // In order to de-select the selection 115 setCaretPosition(0); 116 } 117 super.handleJavaFocusEvent(e); 118 } 119 120 private final class JTextAreaDelegate extends JPasswordField { 121 122 // Empty non private constructor was added because access to this 123 // class shouldn't be emulated by a synthetic accessor method. 124 JTextAreaDelegate() { 125 super(); 126 } 127 128 @Override 129 public void replaceSelection(String content) { 130 getDocument().removeDocumentListener(LWTextFieldPeer.this); 131 super.replaceSelection(content); 132 // post only one text event in this case 133 postTextEvent(); 134 getDocument().addDocumentListener(LWTextFieldPeer.this); 135 } 136 137 @Override 138 public boolean hasFocus() { 139 return getTarget().hasFocus(); 140 } 141 142 @Override 143 public Point getLocationOnScreen() { 144 return LWTextFieldPeer.this.getLocationOnScreen(); 145 } 146 } 147 }