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