TextField.java 12.8 KB
Newer Older
Tom Tromey committed
1
/* TextField.java -- A one line text entry field
2
   Copyright (C) 1999, 2002, 2004, 2006,  Free Software Foundation, Inc.
Tom Tromey committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.awt;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.peer.ComponentPeer;
import java.awt.peer.TextFieldPeer;
import java.util.EventListener;

import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleStateSet;

/**
51
 * This class implements a single line text entry field widget
Tom Tromey committed
52
 *
53
 * @author Aaron M. Renn (arenn@urbanophile.com)
Tom Tromey committed
54
 */
55
public class TextField extends TextComponent
Tom Tromey committed
56
{
57

58 59 60 61
  /**
   * The number used to generate the name returned by getName.
   */
  private static transient long next_textfield_number;
Tom Tromey committed
62

63

64
  private static final long serialVersionUID = -2966288784432217853L;
Tom Tromey committed
65 66


67 68 69 70
  /**
   * @serial The number of columns in the text entry field.
   */
  private int columns;
Tom Tromey committed
71

72 73 74 75
  /**
   * @serial The character that is echoed when doing protected input
   */
  private char echoChar;
Tom Tromey committed
76

77 78
  // List of registered ActionListener's for this object.
  private ActionListener action_listeners;
Tom Tromey committed
79

80 81 82 83 84 85 86 87 88 89
  /**
   * Initializes a new instance of <code>TextField</code> that is empty
   * and has one column.
   *
   * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
   */
  public TextField()
  {
    this("", 0);
  }
Tom Tromey committed
90

91 92 93 94 95 96 97 98 99 100 101 102 103
  /**
   * Initializes a new instance of <code>TextField</code> containing
   * the specified text.  The number of columns will be equal to the
   * length of the text string.
   *
   * @param text The text to display in the field.
   *
   * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
   */
  public TextField(String text)
  {
    this(text, (text == null) ? 0 : text.length());
  }
Tom Tromey committed
104

105 106 107 108 109 110 111 112 113 114 115 116
  /**
   * Initializes a new instance of <code>TextField</code> that is empty
   * and has the specified number of columns.
   *
   * @param columns The number of columns in the text field.
   *
   * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
   */
  public TextField(int columns)
  {
    this("", columns);
  }
Tom Tromey committed
117

118 119 120 121 122 123 124 125 126 127 128 129
  /**
   * Initializes a new instance of <code>TextField</code> with the
   * specified text and number of columns.
   *
   * @param text The text to display in the field.
   * @param columns The number of columns in the field.
   *
   * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
   */
  public TextField(String text, int columns)
  {
    super(text);
130

131 132 133 134
    if (columns < 0)
      this.columns = 0;
    else
      this.columns = columns;
Tom Tromey committed
135

136 137 138
    if (GraphicsEnvironment.isHeadless())
      throw new HeadlessException ();
  }
Tom Tromey committed
139

140 141 142 143 144 145 146 147 148
  /**
   * Returns the number of columns in the field.
   *
   * @return The number of columns in the field.
   */
  public int getColumns()
  {
    return(columns);
  }
Tom Tromey committed
149

150 151 152 153 154 155 156 157 158 159 160 161
  /**
   * Sets the number of columns in this field to the specified value.
   *
   * @param columns The new number of columns in the field.
   *
   * @exception IllegalArgumentException If columns is less than zero.
   */
  public synchronized void setColumns(int columns)
  {
    if (columns < 0)
      throw new IllegalArgumentException("Value is less than zero: " +
                                         columns);
Tom Tromey committed
162

163 164 165
    this.columns = columns;
    // FIXME: How to we communicate this to our peer?
  }
Tom Tromey committed
166

167
  /**
168
   * Returns the character that is echoed to the screen when a text
169 170 171 172 173 174 175 176
   * field is protected (such as when a password is being entered).
   *
   * @return The echo character for this text field.
   */
  public char getEchoChar()
  {
    return(echoChar);
  }
Tom Tromey committed
177

178 179 180 181 182 183 184 185 186 187
  /**
   * Sets the character that is echoed when protected input such as
   * a password is displayed.
   *
   * @param echoChar The new echo character.
   */
  public void setEchoChar(char echoChar)
  {
    setEchoCharacter(echoChar);
  }
Tom Tromey committed
188

189 190 191 192 193 194
  /**
   * Sets the character that is echoed when protected input such as
   * a password is displayed.
   *
   * @param echoChar The new echo character.
   *
195
   * @deprecated This method is deprecated in favor of
196 197 198 199 200
   * <code>setEchoChar()</code>
   */
  public void setEchoCharacter(char echoChar)
  {
    this.echoChar = echoChar;
Tom Tromey committed
201

202 203 204 205
    TextFieldPeer peer = (TextFieldPeer) getPeer ();
    if (peer != null)
      peer.setEchoChar (echoChar);
  }
Tom Tromey committed
206

207 208 209 210 211 212 213 214 215 216 217 218 219 220
  /**
   * Tests whether or not this text field has an echo character set
   * so that characters the user type are not echoed to the screen.
   *
   * @return <code>true</code> if an echo character is set,
   * <code>false</code> otherwise.
   */
  public boolean echoCharIsSet()
  {
    if (echoChar == '\u0000')
      return(false);
    else
      return(true);
  }
Tom Tromey committed
221

222 223 224 225 226 227 228 229 230
  /**
   * Returns the minimum size for this text field.
   *
   * @return The minimum size for this text field.
   */
  public Dimension getMinimumSize()
  {
    return getMinimumSize (getColumns ());
  }
Tom Tromey committed
231

232 233 234 235 236 237 238 239 240 241
  /**
   * Returns the minimum size of a text field with the specified number
   * of columns.
   *
   * @param columns The number of columns to get the minimum size for.
   */
  public Dimension getMinimumSize(int columns)
  {
    return minimumSize(columns);
  }
Tom Tromey committed
242

243 244 245 246 247 248 249 250 251 252 253 254
  /**
   * Returns the minimum size for this text field.
   *
   * @return The minimum size for this text field.
   *
   * @deprecated This method is deprecated in favor of
   * <code>getMinimumSize()</code>.
   */
  public Dimension minimumSize()
  {
    return minimumSize(getColumns ());
  }
Tom Tromey committed
255

256 257 258 259 260 261
  /**
   * Returns the minimum size of a text field with the specified number
   * of columns.
   *
   * @param columns The number of columns to get the minimum size for.
   *
262
   * @deprecated This method is deprecated in favor of
263 264 265 266
   * <code>getMinimumSize(int)</code>.
   */
  public Dimension minimumSize(int columns)
  {
267 268
    if (isMinimumSizeSet())
      return new Dimension(minSize);
269

270 271
    TextFieldPeer peer = (TextFieldPeer) getPeer ();
    if (peer == null)
272
      return new Dimension(getWidth(), getHeight());
Tom Tromey committed
273

274 275
    return peer.getMinimumSize (columns);
  }
Tom Tromey committed
276

277 278 279 280 281 282 283 284 285
  /**
   * Returns the preferred size for this text field.
   *
   * @return The preferred size for this text field.
   */
  public Dimension getPreferredSize()
  {
    return getPreferredSize(getColumns ());
  }
Tom Tromey committed
286

287 288 289 290 291 292 293 294 295 296
  /**
   * Returns the preferred size of a text field with the specified number
   * of columns.
   *
   * @param columns The number of columns to get the preferred size for.
   */
  public Dimension getPreferredSize(int columns)
  {
    return preferredSize(columns);
  }
Tom Tromey committed
297

298 299 300 301 302
  /**
   * Returns the preferred size for this text field.
   *
   * @return The preferred size for this text field.
   *
303
   * @deprecated This method is deprecated in favor of
304 305 306 307 308 309
   * <code>getPreferredSize()</code>.
   */
  public Dimension preferredSize()
  {
    return preferredSize(getColumns ());
  }
Tom Tromey committed
310

311 312 313 314 315 316
  /**
   * Returns the preferred size of a text field with the specified number
   * of columns.
   *
   * @param columns The number of columns to get the preferred size for.
   *
317
   * @deprecated This method is deprecated in favor of
318 319 320 321
   * <code>getPreferredSize(int)</code>.
   */
  public Dimension preferredSize(int columns)
  {
322 323
    if (isPreferredSizeSet())
      return new Dimension(prefSize);
324

325 326
    TextFieldPeer peer = (TextFieldPeer) getPeer ();
    if (peer == null)
327
      return new Dimension (getWidth(), getHeight());
328

329 330
    return peer.getPreferredSize (columns);
  }
Tom Tromey committed
331

332 333 334 335 336 337 338
  /**
   * Notifies this object that it should create its native peer.
   */
  public void addNotify()
  {
    if (getPeer() != null)
      return;
Tom Tromey committed
339

340 341 342
    setPeer((ComponentPeer)getToolkit().createTextField(this));
    super.addNotify();
  }
Tom Tromey committed
343

344 345 346 347 348 349 350 351 352
  /**
   * Addes a new listener to the list of action listeners for this
   * object.
   *
   * @param listener The listener to add to the list.
   */
  public synchronized void addActionListener(ActionListener listener)
  {
    action_listeners = AWTEventMulticaster.add(action_listeners, listener);
Tom Tromey committed
353

354 355
    enableEvents(AWTEvent.ACTION_EVENT_MASK);
  }
Tom Tromey committed
356

357 358 359 360 361 362 363 364 365 366
  /**
   * Removes the specified listener from the list of action listeners
   * for this object.
   *
   * @param listener The listener to remove from the list.
   */
  public synchronized void removeActionListener(ActionListener listener)
  {
    action_listeners = AWTEventMulticaster.remove(action_listeners, listener);
  }
Tom Tromey committed
367

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
  /**
   * Processes the specified event.  If the event is an instance of
   * <code>ActionEvent</code> then <code>processActionEvent()</code> is
   * called to process it, otherwise the event is sent to the
   * superclass.
   *
   * @param event The event to process.
   */
  protected void processEvent(AWTEvent event)
  {
    if (event instanceof ActionEvent)
      processActionEvent((ActionEvent)event);
    else
      super.processEvent(event);
  }
Tom Tromey committed
383

384 385 386 387 388 389
  /**
   * Processes an action event by calling any registered listeners.
   * Note to subclasses: This method is not called unless action events
   * are enabled on this object.  This will be true if any listeners
   * are registered, or if action events were specifically enabled
   * using <code>enableEvents()</code>.
390
   *
391 392 393 394 395 396 397
   * @param event The event to process.
   */
  protected void processActionEvent(ActionEvent event)
  {
    if (action_listeners != null)
      action_listeners.actionPerformed(event);
  }
Tom Tromey committed
398

399 400
  void dispatchEventImpl(AWTEvent e)
  {
401
    if (e.id <= ActionEvent.ACTION_LAST
402
        && e.id >= ActionEvent.ACTION_FIRST
403 404
        && (action_listeners != null
            || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0))
405 406 407 408
      processEvent(e);
    else
      super.dispatchEventImpl(e);
  }
Tom Tromey committed
409

410
 /**
Tom Tromey committed
411 412 413 414
  * Returns a debug string for this object.
  *
  * @return A debug string for this object.
  */
415 416 417 418 419
  protected String paramString()
  {
    return(getClass().getName() + "(columns=" + getColumns() + ",echoChar=" +
           getEchoChar());
  }
Tom Tromey committed
420 421 422 423 424 425 426 427 428 429 430

  /**
   * Returns an array of all the objects currently registered as FooListeners
   * upon this <code>TextField</code>. FooListeners are registered using the
   * addFooListener method.
   *
   * @exception ClassCastException If listenerType doesn't specify a class or
   * interface that implements java.util.EventListener.
   *
   * @since 1.3
   */
431
  public <T extends EventListener> T[] getListeners (Class<T> listenerType)
Tom Tromey committed
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
  {
    if (listenerType == ActionListener.class)
      return AWTEventMulticaster.getListeners (action_listeners, listenerType);

    return super.getListeners (listenerType);
  }

  /**
   * Return all ActionListeners register to this <code>TextField</code> object
   * as an array.
   *
   * @since 1.4
   */
  public ActionListener[] getActionListeners ()
  {
    return (ActionListener[]) getListeners (ActionListener.class);
  }
449

450 451 452 453 454 455 456 457 458 459 460 461 462 463
  /**
   * Generate a unique name for this <code>TextField</code>.
   *
   * @return A unique name for this <code>TextField</code>.
   */
  String generateName()
  {
    return "textfield" + getUniqueLong();
  }

  private static synchronized long getUniqueLong()
  {
    return next_textfield_number++;
  }
Tom Tromey committed
464 465 466

  protected class AccessibleAWTTextField extends AccessibleAWTTextComponent
  {
467 468
    private static final long serialVersionUID = 6219164359235943158L;

Tom Tromey committed
469 470 471
    protected AccessibleAWTTextField()
    {
    }
472

Tom Tromey committed
473 474 475 476 477
    public AccessibleStateSet getAccessibleStateSet()
    {
      return super.getAccessibleStateSet();
    }
  }
478

Tom Tromey committed
479 480 481 482 483
  public AccessibleContext getAccessibleContext()
  {
    return new AccessibleAWTTextField();
  }

484
}