From 155ea1b183205cece78aa864b12c691178a89def Mon Sep 17 00:00:00 2001 From: tromey Date: Wed, 23 Jan 2002 00:07:39 +0000 Subject: [PATCH] * java/awt/TextField.java: Replaced with Classpath version. * java/awt/TextArea.java: Replaced with Classpath version. * java/awt/TextComponent.java: Replaced with Classpath version. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49113 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 4 + libjava/java/awt/TextArea.java | 586 +++++++++++++++++++++++++++++++++--- libjava/java/awt/TextComponent.java | 444 ++++++++++++++++++++++++--- libjava/java/awt/TextField.java | 469 ++++++++++++++++++++++++++++- 4 files changed, 1417 insertions(+), 86 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 41031d8..afaeacb 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,9 @@ 2002-01-22 Tom Tromey + * java/awt/TextField.java: Replaced with Classpath version. + * java/awt/TextArea.java: Replaced with Classpath version. + * java/awt/TextComponent.java: Replaced with Classpath version. + * java/awt/GridBagConstraints.java: Updated copyright. 2002-01-22 Mark Wielaard diff --git a/libjava/java/awt/TextArea.java b/libjava/java/awt/TextArea.java index 09f5cb2..799656e 100644 --- a/libjava/java/awt/TextArea.java +++ b/libjava/java/awt/TextArea.java @@ -1,49 +1,549 @@ -/* Copyright (C) 1999 Free Software Foundation +/* TextArea.java -- A multi-line text entry widget + Copyright (C) 1999 Free Software Foundation, Inc. - This file is part of libjava. +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., 59 Temple Place, Suite 330, Boston, MA +02111-1307 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. */ -This software is copyrighted work licensed under the terms of the -Libjava License. Please consult the file "LIBJAVA_LICENSE" for -details. */ package java.awt; -/* A very incomplete placeholder. */ - -public class TextArea extends TextComponent -{ - public synchronized void append (String str) - { - replaceRange(str, length, length); - } - - public synchronized void insert (String str, int pos) - { - replaceRange(str, pos, pos); - } - - public synchronized void replaceRange (String str, int start, int end) - { - if (length == 0) - setText (str); - else - { - int len = str.length(); - int delta = len - (end - start); - int new_length = length + delta; - if (buffer.length < new_length) - { - int new_size = 2 * buffer.length; - if (new_size < new_length) - new_size = new_length; - char[] new_buffer = new char[new_size]; - System.arraycopy(buffer, 0, new_buffer, 0, length); - buffer = new_buffer; - } - if (len != end) - System.arraycopy(buffer, start, buffer, start + len, len - end); - str.getChars(0, len, buffer, start); - length += delta; - } - } +import java.awt.peer.TextAreaPeer; +import java.awt.peer.TextComponentPeer; +import java.awt.peer.ComponentPeer; + +/** + * This implements a multi-line text entry widget. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ +public class TextArea extends TextComponent implements java.io.Serializable +{ + +/* + * Static Variables + */ + +/** + * Use both horiztonal and vertical scroll bars. + */ +public static final int SCROLLBARS_BOTH = 0; + +/** + * Use vertical scroll bars only. + */ +public static final int SCROLLBARS_VERTICAL_ONLY = 1; + +/** + * Use horizatonal scroll bars only. + */ +public static final int SCROLLBARS_HORIZONTAL_ONLY = 2; + +/** + * Use no scrollbars. + */ +public static final int SCROLLBARS_NONE = 3; + +// Serialization constant +private static final long serialVersionUID = 3692302836626095722L; + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * @serial The number of columns in this text area. + */ +private int columns; + +/** + * @serial The number of rows in this text area. + */ +private int rows; + +/** + * @serial The type of scrollbars to display, which will be one of + * the contstants from this class. + */ +private int scrollbarVisibility; + +/*************************************************************************/ + +/* + * Constructors + */ + +/** + * Initialize a new instance of TextArea that is empty + * and is one row and one column. Both horizontal and vertical + * scrollbars will be used. + */ +public +TextArea() +{ + this("", 1, 1, SCROLLBARS_BOTH); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextArea that + * contains the specified string. Both horizontal and veritcal + * scrollbars will be used. + * + * @param text The text to display in this text area. + */ +public +TextArea(String text) +{ + this(text, 1, text.length(), SCROLLBARS_BOTH); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextArea that is empty + * and has the specified number of rows and columns. Both + * horizontal and vertical scrollbars will be used. + * + * @param rows The number of rows in this text area. + * @param columns The number of columns in this text area. + */ +public +TextArea(int rows, int columns) +{ + this("", rows, columns, SCROLLBARS_BOTH); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextArea that is the + * specified size and has the specified text. + * + * @param text The text to display in this text area. + * @param rows The number of rows in this text area. + * @param columns The number of columns in this text area. + */ +public +TextArea(String text, int rows, int columns) +{ + this(text, rows, columns, SCROLLBARS_BOTH); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextArea with the + * specified values. The scrollbar visibility value must be one + * of the constants in this class. + * + * @param text The text to display in this text area. + * @param rows The number of rows in this text area. + * @param columns The number of columns in this text area. + * @param scrollbarVisibility Which scrollbars to display. + */ +public +TextArea(String text, int rows, int columns, int scrollbarVisibility) +{ + super(text); + + if ((rows < 1) || (columns < 0)) + throw new IllegalArgumentException("Bad row or column value"); + + if ((scrollbarVisibility != SCROLLBARS_BOTH) && + (scrollbarVisibility != SCROLLBARS_VERTICAL_ONLY) && + (scrollbarVisibility != SCROLLBARS_HORIZONTAL_ONLY) && + (scrollbarVisibility != SCROLLBARS_NONE)) + throw new IllegalArgumentException("Bad scrollbar visibility value"); + + this.rows = rows; + this.columns = columns; + this.scrollbarVisibility = scrollbarVisibility; +} + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * Returns the number of columns in the field. + * + * @return The number of columns in the field. + */ +public int +getColumns() +{ + return(columns); +} + +/*************************************************************************/ + +/** + * 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); + + this.columns = columns; + // FIXME: How to we communicate this to our peer? } + +/*************************************************************************/ + +/** + * Returns the number of rows in the field. + * + * @return The number of rows in the field. + */ +public int +getRows() +{ + return(rows); +} + +/*************************************************************************/ + +/** + * Sets the number of rows in this field to the specified value. + * + * @param rows The new number of rows in the field. + * + * @exception IllegalArgumentException If rows is less than zero. + */ +public synchronized void +setRows(int rows) +{ + if (rows < 1) + throw new IllegalArgumentException("Value is less than one: " + + rows); + + this.rows = rows; + // FIXME: How to we communicate this to our peer? +} + +/*************************************************************************/ + +/** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + */ +public Dimension +getMinimumSize() +{ + return(getMinimumSize(getRows(), getColumns())); +} + +/*************************************************************************/ + +/** + * Returns the minimum size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the minimum size for. + * @param columns The number of columns to get the minimum size for. + */ +public Dimension +getMinimumSize(int rows, int columns) +{ + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tap.getMinimumSize(rows, columns)); +} + +/*************************************************************************/ + +/** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + * + * @deprecated This method is depcreated in favor of + * getMinimumSize(). + */ +public Dimension +minimumSize() +{ + return(getMinimumSize(getRows(), getColumns())); +} + +/*************************************************************************/ + +/** + * Returns the minimum size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the minimum size for. + * @param columns The number of columns to get the minimum size for. + * + * @deprecated This method is deprecated in favor of + * getMinimumSize(int). + */ +public Dimension +minimumSize(int rows, int columns) +{ + return(getMinimumSize(rows, columns)); +} + +/*************************************************************************/ + +/** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + */ +public Dimension +getPreferredSize() +{ + return(getPreferredSize(getRows(), getColumns())); +} + +/*************************************************************************/ + +/** + * Returns the preferred size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the preferred size for. + * @param columns The number of columns to get the preferred size for. + */ +public Dimension +getPreferredSize(int rows, int columns) +{ + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tap.getPreferredSize(rows, columns)); +} + +/*************************************************************************/ + +/** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(). + */ +public Dimension +preferredSize() +{ + return(getPreferredSize(getRows(), getColumns())); +} + +/*************************************************************************/ + +/** + * Returns the preferred size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the preferred size for. + * @param columns The number of columns to get the preferred size for. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(int). + */ +public Dimension +preferredSize(int columns) +{ + return(getPreferredSize(rows, columns)); +} + +/*************************************************************************/ + +/** + * Returns one of the constants from this class indicating which + * types of scrollbars this object uses, if any. + * + * @return The scrollbar type constant for this object. + */ +public int +getScrollbarVisibility() +{ + return(scrollbarVisibility); +} + +/*************************************************************************/ + +/** + * Notify this object that it should create its native peer. + */ +public void +addNotify() +{ + if (getPeer() != null) + return; + + setPeer((ComponentPeer)getToolkit().createTextArea(this)); +} + +/*************************************************************************/ + +/** + * Appends the specified text to the end of the current text. + * + * @param text The text to append. + */ +public void +append(String str) +{ + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.insert(str, tap.getText().length()); +} + +/*************************************************************************/ + +/** + * Appends the specified text to the end of the current text. + * + * @param text The text to append. + * + * @deprecated This method is deprecated in favor of + * append(). + */ +public void +appendText(String text) +{ + append(text); +} + +/*************************************************************************/ + +/** + * Inserts the specified text at the specified location. + * + * @param text The text to insert. + * @param pos The insert position. + */ +public void +insert(String text, int pos) +{ + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.insert(text, pos); +} + +/*************************************************************************/ + +/** + * Inserts the specified text at the specified location. + * + * @param text The text to insert. + * @param pos The insert position. + * + * @deprecated This method is depcreated in favor of insert(). + */ +public void +insertText(String text, int pos) +{ + insert(text, pos); +} + +/*************************************************************************/ + +/** + * Replaces the text bounded by the specified start and end positions + * with the specified text. + * + * @param text The new text for the range. + * @param start The start position of the replacement range. + * @param end The end position of the replacement range. + */ +public void +replaceRange(String text, int start, int end) +{ + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.replaceRange(text, start, end); +} + +/*************************************************************************/ + +/** + * Replaces the text bounded by the specified start and end positions + * with the specified text. + * + * @param text The new text for the range. + * @param start The start position of the replacement range. + * @param end The end position of the replacement range. + * + * @deprecated This method is deprecated in favor of + * replaceRange(). + */ +public void +replaceText(String text, int start, int end) +{ + replaceRange(text, start, end); +} + +/*************************************************************************/ + +/** + * Returns a debugging string for this text area. + * + * @return A debugging string for this text area. + */ +protected String +paramString() +{ + return(getClass().getName() + "(rows=" + getRows() + ",columns=" + + getColumns() + ",scrollbars=" + getScrollbarVisibility() + + ")"); +} + +} // class TextArea + diff --git a/libjava/java/awt/TextComponent.java b/libjava/java/awt/TextComponent.java index 0836b5f..a90cb80 100644 --- a/libjava/java/awt/TextComponent.java +++ b/libjava/java/awt/TextComponent.java @@ -1,51 +1,425 @@ -/* Copyright (C) 1999, 2001 Free Software Foundation +/* TextComponent.java -- Widgets for entering text + Copyright (C) 1999 Free Software Foundation, Inc. - This file is part of libjava. +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., 59 Temple Place, Suite 330, Boston, MA +02111-1307 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. */ -This software is copyrighted work licensed under the terms of the -Libjava License. Please consult the file "LIBJAVA_LICENSE" for -details. */ package java.awt; -import java.awt.event.*; +import java.awt.event.TextEvent; +import java.awt.event.TextListener; import java.awt.peer.TextComponentPeer; +import java.awt.peer.ComponentPeer; + +/** + * This class provides common functionality for widgets than + * contain text. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ +public class TextComponent extends Component implements java.io.Serializable +{ + +/* + * Static Variables + */ + +// Constant for serialization +private static final long serialVersionUID = -2214773872412987419L; + +/* + * Instance Variables + */ + +/** + * @serial Indicates whether or not this component is editable. + */ +private boolean editable; + +/** + * @serial The starting position of the selected text region. + */ +private int selectionStart; + +/** + * @serial The ending position of the selected text region. + */ +private int selectionEnd; -/* A very incomplete placeholder. */ +/** + * @serial The text in the component + */ +private String text; -public class TextComponent extends Component +/** + * A list of listeners that will receive events from this object. + */ +protected transient TextListener textListener; + +/*************************************************************************/ + +/* + * Constructors + */ + +TextComponent(String text) { - protected TextListener textListener; + this.text = text; +} - char[] buffer; - int length; - int caretPosition; +/*************************************************************************/ - public synchronized void addTextListener (TextListener listener) - { - textListener = AWTEventMulticaster.add (textListener, listener); - } +/* + * Instance Methods + */ - public synchronized String getText () - { return new String(buffer, 0, length); } +/** + * Returns the text in this component + * + * @return The text in this component. + */ +public synchronized String +getText() +{ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + text = tcp.getText(); - public synchronized void setText (String text) - { - length = text.length(); - if (buffer == null || buffer.length < length) - buffer = new char[length]; - text.getChars(0, length, buffer, 0); - } + return(text); +} - public int getCaretPosition () { return caretPosition; } +/*************************************************************************/ - public void setCaretPosition (int pos) - { - caretPosition = pos; - if (peer != null) - { - TextComponentPeer t = (TextComponentPeer) peer; - t.setCaretPosition (pos); - } - } +/** + * Sets the text in this component to the specified string. + * + * @param text The new text for this component. + */ +public synchronized void +setText(String text) +{ + if (text == null) + text = ""; + + this.text = text; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setText(text); +} + +/*************************************************************************/ + +/** + * Returns a string that contains the text that is currently selected. + * + * @return The currently selected text region. + */ +public synchronized String +getSelectedText() +{ + String alltext = getText(); + int start = getSelectionStart(); + int end = getSelectionEnd(); + + return(alltext.substring(start, end)); } + +/*************************************************************************/ + +/** + * Returns the starting position of the selected text region. + * // FIXME: What is returned if there is no selected text? + * + * @return The starting position of the selected text region. + */ +public synchronized int +getSelectionStart() +{ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + selectionStart = tcp.getSelectionStart(); + + return(selectionStart); +} + +/*************************************************************************/ + +/** + * Sets the starting position of the selected region to the + * specified value. If the specified value is out of range, then it + * will be silently changed to the nearest legal value. + * + * @param selectionStart The new start position for selected text. + */ +public synchronized void +setSelectionStart(int selectionStart) +{ + select(selectionStart, getSelectionEnd()); +} + +/*************************************************************************/ + +/** + * Returns the ending position of the selected text region. + * // FIXME: What is returned if there is no selected text. + * + * @return The ending position of the selected text region. + */ +public synchronized int +getSelectionEnd() +{ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + selectionEnd = tcp.getSelectionEnd(); + + return(selectionEnd); +} + +/*************************************************************************/ + +/** + * Sets the ending position of the selected region to the + * specified value. If the specified value is out of range, then it + * will be silently changed to the nearest legal value. + * + * @param selectionEnd The new start position for selected text. + */ +public synchronized void +setSelectionEnd(int selectionEnd) +{ + select(getSelectionStart(), selectionEnd); +} + +/*************************************************************************/ + +/** + * This method sets the selected text range to the text between the + * specified start and end positions. Illegal values for these + * positions are silently fixed. + * + * @param startSelection The new start position for the selected text. + * @param endSelection The new end position for the selected text. + */ +public synchronized void +select(int selectionStart, int endSelection) +{ + if (selectionStart < 0) + selectionStart = 0; + + if (selectionStart > getText().length()) + selectionStart = text.length(); + + if (selectionEnd > text.length()) + selectionEnd = text.length(); + + if (selectionStart > getSelectionEnd()) + selectionStart = selectionEnd; + + this.selectionStart = selectionStart; + this.selectionEnd = selectionEnd; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.select(selectionStart, selectionEnd); +} + +/*************************************************************************/ + +/** + * Selects all of the text in the component. + */ +public synchronized void +selectAll() +{ + select(0, getText().length()); +} + +/*************************************************************************/ + +/** + * Returns the current caret position in the text. + * + * @return The caret position in the text. + */ +public synchronized int +getCaretPosition() +{ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + return(tcp.getCaretPosition()); + else + return(0); +} + +/*************************************************************************/ + +/** + * Sets the caret position to the specified value. + * + * @param caretPosition The new caret position. + */ +public synchronized void +setCaretPosition(int caretPosition) +{ + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setCaretPosition(caretPosition); +} + +/*************************************************************************/ + +/** + * Tests whether or not this component's text can be edited. + * + * @return true if the text can be edited, false + * otherwise. + */ +public boolean +isEditable() +{ + return(editable); +} + +/*************************************************************************/ + +/** + * Sets whether or not this component's text can be edited. + * + * @param editable true to enable editing of the text, + * false to disable it. + */ +public synchronized void +setEditable(boolean editable) +{ + this.editable = editable; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setEditable(editable); +} + +/*************************************************************************/ + +/** + * Notifies the component that it should destroy its native peer. + */ +public void +removeNotify() +{ + super.removeNotify(); +} + +/*************************************************************************/ + +/** + * Adds a new listener to the list of text listeners for this + * component. + * + * @param listener The listener to be added. + */ +public synchronized void +addTextListener(TextListener listener) +{ + textListener = AWTEventMulticaster.add(textListener, listener); + + enableEvents(AWTEvent.TEXT_EVENT_MASK); +} + +/*************************************************************************/ + +/** + * Removes the specified listener from the list of listeners + * for this component. + * + * @param listener The listener to remove. + */ +public synchronized void +removeTextListener(TextListener listener) +{ + textListener = AWTEventMulticaster.remove(textListener, listener); +} + +/*************************************************************************/ + +/** + * Processes the specified event for this component. Text events are + * processed by calling the processTextEvent() method. + * All other events are passed to the superclass method. + * + * @param event The event to process. + */ +protected void +processEvent(AWTEvent event) +{ + if (event instanceof TextEvent) + processTextEvent((TextEvent)event); + else + super.processEvent(event); +} + +/*************************************************************************/ + +/** + * Processes the specified text event by dispatching it to any listeners + * that are registered. Note that this method will only be called + * if text event's are enabled. This will be true if there are any + * registered listeners, or if the event has been specifically + * enabled using enableEvents(). + * + * @param event The text event to process. + */ +protected void +processTextEvent(TextEvent event) +{ + if (textListener != null) + textListener.textValueChanged(event); +} + +/*************************************************************************/ + +/** + * Returns a debugging string. + * + * @return A debugging string. + */ +protected String +paramString() +{ + return(getClass().getName() + "(text=" + getText() + ")"); +} + +} // class TextComponent + diff --git a/libjava/java/awt/TextField.java b/libjava/java/awt/TextField.java index e8059d4..5499305 100644 --- a/libjava/java/awt/TextField.java +++ b/libjava/java/awt/TextField.java @@ -1,16 +1,469 @@ -/* Copyright (C) 2000 Free Software Foundation +/* TextField.java -- A one line text entry field + Copyright (C) 1999 Free Software Foundation, Inc. - This file is part of libgcj. +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., 59 Temple Place, Suite 330, Boston, MA +02111-1307 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. */ -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ package java.awt; -import java.awt.event.*; -/* A very incomplete placeholder. */ +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.peer.TextFieldPeer; +import java.awt.peer.TextComponentPeer; +import java.awt.peer.ComponentPeer; + +/** + * This class implements a single line text entry field widget + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ +public class TextField extends TextComponent implements java.io.Serializable +{ + +/* + * Static Variables + */ + +// Serialization constant +private static final long serialVersionUID = -2966288784432217853L; + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * @serial The number of columns in the text entry field. + */ +private int columns; + +/** + * @serial The character that is echoed when doing protected input + */ +private char echoChar; + +// List of registered ActionListener's for this object. +private ActionListener action_listeners; + +/*************************************************************************/ + +/* + * Constructors + */ + +/* + * Initializes a new instance of TextField that is empty + * and has one column. + */ +public +TextField() +{ + this("", 1); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextField 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. + */ +public +TextField(String text) +{ + this(text, text.length()); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextField that is empty + * and has the specified number of columns. + * + * @param columns The number of columns in the text field. + */ +public +TextField(int columns) +{ + this("", columns); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of TextField 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. + */ +public +TextField(String text, int columns) +{ + super(text); + this.columns = columns; +} + +/*************************************************************************/ + +/* + * Instance Methods + */ + +/** + * Returns the number of columns in the field. + * + * @return The number of columns in the field. + */ +public int +getColumns() +{ + return(columns); +} + +/*************************************************************************/ + +/** + * 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); + + this.columns = columns; + // FIXME: How to we communicate this to our peer? +} + +/*************************************************************************/ + +/** + * Returns the character that is echoed to the screen when a text + * field is protected (such as when a password is being entered). + * + * @return The echo character for this text field. + */ +public char +getEchoChar() +{ + return(echoChar); +} + +/*************************************************************************/ + +/** + * 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) +{ + this.echoChar = echoChar; + + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp != null) + tfp.setEchoChar(echoChar); +} + +/*************************************************************************/ + +/** + * Sets the character that is echoed when protected input such as + * a password is displayed. + * + * @param echoChar The new echo character. + * + * @deprecated This method is deprecated in favor of + * setEchoChar() + */ +public void +setEchoCharacter(char echoChar) +{ + setEchoChar(echoChar); +} + +/*************************************************************************/ + +/** + * 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 true if an echo character is set, + * false otherwise. + */ +public boolean +echoCharIsSet() +{ + if (echoChar == '\u0000') + return(false); + else + return(true); +} + +/*************************************************************************/ + +/** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + */ +public Dimension +getMinimumSize() +{ + return(getMinimumSize(getColumns())); +} + +/*************************************************************************/ + +/** + * 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) +{ + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tfp.getMinimumSize(columns)); +} + +/*************************************************************************/ + +/** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + * + * @deprecated This method is depcreated in favor of + * getMinimumSize(). + */ +public Dimension +minimumSize() +{ + return(getMinimumSize(getColumns())); +} + +/*************************************************************************/ + +/** + * 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. + * + * @deprecated This method is deprecated in favor of + * getMinimumSize(int). + */ +public Dimension +minimumSize(int columns) +{ + return(getMinimumSize(columns)); +} + +/*************************************************************************/ + +/** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + */ +public Dimension +getPreferredSize() +{ + return(getPreferredSize(getColumns())); +} + +/*************************************************************************/ + +/** + * 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) +{ + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tfp.getPreferredSize(columns)); +} + +/*************************************************************************/ + +/** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(). + */ +public Dimension +preferredSize() +{ + return(getPreferredSize(getColumns())); +} + +/*************************************************************************/ + +/** + * 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. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(int). + */ +public Dimension +preferredSize(int columns) +{ + return(getPreferredSize(columns)); +} + +/*************************************************************************/ -public class TextField extends TextComponent +/** + * Notifies this object that it should create its native peer. + */ +public void +addNotify() { + if (getPeer() != null) + return; + + setPeer((ComponentPeer)getToolkit().createTextField(this)); } + +/*************************************************************************/ + +/** + * 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); + + enableEvents(AWTEvent.ACTION_EVENT_MASK); +} + +/*************************************************************************/ + +/** + * 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); +} + +/*************************************************************************/ + +/** + * Processes the specified event. If the event is an instance of + * ActionEvent then processActionEvent() 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); +} + +/*************************************************************************/ + +/** + * 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 enableEvents(). + * + * @param event The event to process. + */ +protected void +processActionEvent(ActionEvent event) +{ + if (action_listeners != null) + action_listeners.actionPerformed(event); +} + +/*************************************************************************/ + +/** + * Returns a debug string for this object. + * + * @return A debug string for this object. + */ +protected String +paramString() +{ + return(getClass().getName() + "(columns=" + getColumns() + ",echoChar=" + + getEchoChar()); +} + +} // class TextField -- 2.7.4