Source for java.awt.TextField

   1: /* TextField.java -- A one line text entry field
   2:    Copyright (C) 1999, 2002, 2004, 2006,  Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: 
  39: package java.awt;
  40: 
  41: import java.awt.event.ActionEvent;
  42: import java.awt.event.ActionListener;
  43: import java.awt.peer.ComponentPeer;
  44: import java.awt.peer.TextFieldPeer;
  45: import java.util.EventListener;
  46: 
  47: import javax.accessibility.AccessibleContext;
  48: import javax.accessibility.AccessibleStateSet;
  49: 
  50: /**
  51:  * This class implements a single line text entry field widget
  52:  *
  53:  * @author Aaron M. Renn (arenn@urbanophile.com)
  54:  */
  55: public class TextField extends TextComponent
  56: {
  57:   
  58:   /**
  59:    * The number used to generate the name returned by getName.
  60:    */
  61:   private static transient long next_textfield_number;
  62: 
  63:   
  64:   private static final long serialVersionUID = -2966288784432217853L;
  65: 
  66: 
  67:   /**
  68:    * @serial The number of columns in the text entry field.
  69:    */
  70:   private int columns;
  71: 
  72:   /**
  73:    * @serial The character that is echoed when doing protected input
  74:    */
  75:   private char echoChar;
  76: 
  77:   // List of registered ActionListener's for this object.
  78:   private ActionListener action_listeners;
  79: 
  80:   /**
  81:    * Initializes a new instance of <code>TextField</code> that is empty
  82:    * and has one column.
  83:    *
  84:    * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
  85:    */
  86:   public TextField()
  87:   {
  88:     this("", 0);
  89:   }
  90: 
  91:   /**
  92:    * Initializes a new instance of <code>TextField</code> containing
  93:    * the specified text.  The number of columns will be equal to the
  94:    * length of the text string.
  95:    *
  96:    * @param text The text to display in the field.
  97:    *
  98:    * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
  99:    */
 100:   public TextField(String text)
 101:   {
 102:     this(text, (text == null) ? 0 : text.length());
 103:   }
 104: 
 105:   /**
 106:    * Initializes a new instance of <code>TextField</code> that is empty
 107:    * and has the specified number of columns.
 108:    *
 109:    * @param columns The number of columns in the text field.
 110:    *
 111:    * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
 112:    */
 113:   public TextField(int columns)
 114:   {
 115:     this("", columns);
 116:   }
 117: 
 118:   /**
 119:    * Initializes a new instance of <code>TextField</code> with the
 120:    * specified text and number of columns.
 121:    *
 122:    * @param text The text to display in the field.
 123:    * @param columns The number of columns in the field.
 124:    *
 125:    * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true,
 126:    */
 127:   public TextField(String text, int columns)
 128:   {
 129:     super(text);
 130:   
 131:     if (columns < 0)
 132:       this.columns = 0;
 133:     else
 134:       this.columns = columns;
 135: 
 136:     if (GraphicsEnvironment.isHeadless())
 137:       throw new HeadlessException ();
 138:   }
 139: 
 140:   /**
 141:    * Returns the number of columns in the field.
 142:    *
 143:    * @return The number of columns in the field.
 144:    */
 145:   public int getColumns()
 146:   {
 147:     return(columns);
 148:   }
 149: 
 150:   /**
 151:    * Sets the number of columns in this field to the specified value.
 152:    *
 153:    * @param columns The new number of columns in the field.
 154:    *
 155:    * @exception IllegalArgumentException If columns is less than zero.
 156:    */
 157:   public synchronized void setColumns(int columns)
 158:   {
 159:     if (columns < 0)
 160:       throw new IllegalArgumentException("Value is less than zero: " +
 161:                                          columns);
 162: 
 163:     this.columns = columns;
 164:     // FIXME: How to we communicate this to our peer?
 165:   }
 166: 
 167:   /**
 168:    * Returns the character that is echoed to the screen when a text 
 169:    * field is protected (such as when a password is being entered).
 170:    *
 171:    * @return The echo character for this text field.
 172:    */
 173:   public char getEchoChar()
 174:   {
 175:     return(echoChar);
 176:   }
 177: 
 178:   /**
 179:    * Sets the character that is echoed when protected input such as
 180:    * a password is displayed.
 181:    *
 182:    * @param echoChar The new echo character.
 183:    */
 184:   public void setEchoChar(char echoChar)
 185:   {
 186:     setEchoCharacter(echoChar);
 187:   }
 188: 
 189:   /**
 190:    * Sets the character that is echoed when protected input such as
 191:    * a password is displayed.
 192:    *
 193:    * @param echoChar The new echo character.
 194:    *
 195:    * @deprecated This method is deprecated in favor of 
 196:    * <code>setEchoChar()</code>
 197:    */
 198:   public void setEchoCharacter(char echoChar)
 199:   {
 200:     this.echoChar = echoChar;
 201: 
 202:     TextFieldPeer peer = (TextFieldPeer) getPeer ();
 203:     if (peer != null)
 204:       peer.setEchoChar (echoChar);
 205:   }
 206: 
 207:   /**
 208:    * Tests whether or not this text field has an echo character set
 209:    * so that characters the user type are not echoed to the screen.
 210:    *
 211:    * @return <code>true</code> if an echo character is set,
 212:    * <code>false</code> otherwise.
 213:    */
 214:   public boolean echoCharIsSet()
 215:   {
 216:     if (echoChar == '\u0000')
 217:       return(false);
 218:     else
 219:       return(true);
 220:   }
 221: 
 222:   /**
 223:    * Returns the minimum size for this text field.
 224:    *
 225:    * @return The minimum size for this text field.
 226:    */
 227:   public Dimension getMinimumSize()
 228:   {
 229:     return getMinimumSize (getColumns ());
 230:   }
 231: 
 232:   /**
 233:    * Returns the minimum size of a text field with the specified number
 234:    * of columns.
 235:    *
 236:    * @param columns The number of columns to get the minimum size for.
 237:    */
 238:   public Dimension getMinimumSize(int columns)
 239:   {
 240:     return minimumSize(columns);
 241:   }
 242: 
 243:   /**
 244:    * Returns the minimum size for this text field.
 245:    *
 246:    * @return The minimum size for this text field.
 247:    *
 248:    * @deprecated This method is deprecated in favor of
 249:    * <code>getMinimumSize()</code>.
 250:    */
 251:   public Dimension minimumSize()
 252:   {
 253:     return minimumSize(getColumns ());
 254:   }
 255: 
 256:   /**
 257:    * Returns the minimum size of a text field with the specified number
 258:    * of columns.
 259:    *
 260:    * @param columns The number of columns to get the minimum size for.
 261:    *
 262:    * @deprecated This method is deprecated in favor of 
 263:    * <code>getMinimumSize(int)</code>.
 264:    */
 265:   public Dimension minimumSize(int columns)
 266:   {
 267:     if (isMinimumSizeSet())
 268:       return new Dimension(minSize);
 269:     
 270:     TextFieldPeer peer = (TextFieldPeer) getPeer ();
 271:     if (peer == null)
 272:       return new Dimension(getWidth(), getHeight());
 273: 
 274:     return peer.getMinimumSize (columns);
 275:   }
 276: 
 277:   /**
 278:    * Returns the preferred size for this text field.
 279:    *
 280:    * @return The preferred size for this text field.
 281:    */
 282:   public Dimension getPreferredSize()
 283:   {
 284:     return getPreferredSize(getColumns ());
 285:   }
 286: 
 287:   /**
 288:    * Returns the preferred size of a text field with the specified number
 289:    * of columns.
 290:    *
 291:    * @param columns The number of columns to get the preferred size for.
 292:    */
 293:   public Dimension getPreferredSize(int columns)
 294:   {
 295:     return preferredSize(columns);
 296:   }
 297: 
 298:   /**
 299:    * Returns the preferred size for this text field.
 300:    *
 301:    * @return The preferred size for this text field.
 302:    *
 303:    * @deprecated This method is deprecated in favor of 
 304:    * <code>getPreferredSize()</code>.
 305:    */
 306:   public Dimension preferredSize()
 307:   {
 308:     return preferredSize(getColumns ());
 309:   }
 310: 
 311:   /**
 312:    * Returns the preferred size of a text field with the specified number
 313:    * of columns.
 314:    *
 315:    * @param columns The number of columns to get the preferred size for.
 316:    *
 317:    * @deprecated This method is deprecated in favor of 
 318:    * <code>getPreferredSize(int)</code>.
 319:    */
 320:   public Dimension preferredSize(int columns)
 321:   {
 322:     if (isPreferredSizeSet())
 323:       return new Dimension(prefSize);
 324:     
 325:     TextFieldPeer peer = (TextFieldPeer) getPeer ();
 326:     if (peer == null)
 327:       return new Dimension (getWidth(), getHeight());
 328:     
 329:     return peer.getPreferredSize (columns);
 330:   }
 331: 
 332:   /**
 333:    * Notifies this object that it should create its native peer.
 334:    */
 335:   public void addNotify()
 336:   {
 337:     if (getPeer() != null)
 338:       return;
 339: 
 340:     setPeer((ComponentPeer)getToolkit().createTextField(this));
 341:     super.addNotify();
 342:   }
 343: 
 344:   /**
 345:    * Addes a new listener to the list of action listeners for this
 346:    * object.
 347:    *
 348:    * @param listener The listener to add to the list.
 349:    */
 350:   public synchronized void addActionListener(ActionListener listener)
 351:   {
 352:     action_listeners = AWTEventMulticaster.add(action_listeners, listener);
 353: 
 354:     enableEvents(AWTEvent.ACTION_EVENT_MASK);
 355:   }
 356: 
 357:   /**
 358:    * Removes the specified listener from the list of action listeners
 359:    * for this object.
 360:    *
 361:    * @param listener The listener to remove from the list.
 362:    */
 363:   public synchronized void removeActionListener(ActionListener listener)
 364:   {
 365:     action_listeners = AWTEventMulticaster.remove(action_listeners, listener);
 366:   }
 367: 
 368:   /**
 369:    * Processes the specified event.  If the event is an instance of
 370:    * <code>ActionEvent</code> then <code>processActionEvent()</code> is
 371:    * called to process it, otherwise the event is sent to the
 372:    * superclass.
 373:    *
 374:    * @param event The event to process.
 375:    */
 376:   protected void processEvent(AWTEvent event)
 377:   {
 378:     if (event instanceof ActionEvent)
 379:       processActionEvent((ActionEvent)event);
 380:     else
 381:       super.processEvent(event);
 382:   }
 383: 
 384:   /**
 385:    * Processes an action event by calling any registered listeners.
 386:    * Note to subclasses: This method is not called unless action events
 387:    * are enabled on this object.  This will be true if any listeners
 388:    * are registered, or if action events were specifically enabled
 389:    * using <code>enableEvents()</code>.
 390:    * 
 391:    * @param event The event to process.
 392:    */
 393:   protected void processActionEvent(ActionEvent event)
 394:   {
 395:     if (action_listeners != null)
 396:       action_listeners.actionPerformed(event);
 397:   }
 398: 
 399:   void dispatchEventImpl(AWTEvent e)
 400:   {
 401:     if (e.id <= ActionEvent.ACTION_LAST 
 402:         && e.id >= ActionEvent.ACTION_FIRST
 403:         && (action_listeners != null 
 404:         || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0))
 405:       processEvent(e);
 406:     else
 407:       super.dispatchEventImpl(e);
 408:   }
 409: 
 410:  /**
 411:   * Returns a debug string for this object.
 412:   *
 413:   * @return A debug string for this object.
 414:   */
 415:   protected String paramString()
 416:   {
 417:     return(getClass().getName() + "(columns=" + getColumns() + ",echoChar=" +
 418:            getEchoChar());
 419:   }
 420: 
 421:   /**
 422:    * Returns an array of all the objects currently registered as FooListeners
 423:    * upon this <code>TextField</code>. FooListeners are registered using the
 424:    * addFooListener method.
 425:    *
 426:    * @exception ClassCastException If listenerType doesn't specify a class or
 427:    * interface that implements java.util.EventListener.
 428:    *
 429:    * @since 1.3
 430:    */
 431:   public <T extends EventListener> T[] getListeners (Class<T> listenerType)
 432:   {
 433:     if (listenerType == ActionListener.class)
 434:       return AWTEventMulticaster.getListeners (action_listeners, listenerType);
 435: 
 436:     return super.getListeners (listenerType);
 437:   }
 438: 
 439:   /**
 440:    * Return all ActionListeners register to this <code>TextField</code> object
 441:    * as an array.
 442:    *
 443:    * @since 1.4
 444:    */
 445:   public ActionListener[] getActionListeners ()
 446:   {
 447:     return (ActionListener[]) getListeners (ActionListener.class);
 448:   }
 449:   
 450:   /**
 451:    * Generate a unique name for this <code>TextField</code>.
 452:    *
 453:    * @return A unique name for this <code>TextField</code>.
 454:    */
 455:   String generateName()
 456:   {
 457:     return "textfield" + getUniqueLong();
 458:   }
 459: 
 460:   private static synchronized long getUniqueLong()
 461:   {
 462:     return next_textfield_number++;
 463:   }
 464: 
 465:   protected class AccessibleAWTTextField extends AccessibleAWTTextComponent
 466:   {
 467:     private static final long serialVersionUID = 6219164359235943158L;
 468: 
 469:     protected AccessibleAWTTextField()
 470:     {
 471:     }
 472:     
 473:     public AccessibleStateSet getAccessibleStateSet()
 474:     {
 475:       return super.getAccessibleStateSet();
 476:     }
 477:   }
 478:   
 479:   public AccessibleContext getAccessibleContext()
 480:   {
 481:     return new AccessibleAWTTextField();
 482:   }
 483: 
 484: }