mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			677 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			677 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
/* TextComponent.java -- Widgets for entering text
 | 
						|
   Copyright (C) 1999, 2002, 2003, 2006, Free Software Foundation, Inc.
 | 
						|
 | 
						|
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.TextEvent;
 | 
						|
import java.awt.event.TextListener;
 | 
						|
import java.awt.peer.TextComponentPeer;
 | 
						|
import java.io.Serializable;
 | 
						|
import java.text.BreakIterator;
 | 
						|
import java.util.EventListener;
 | 
						|
 | 
						|
import javax.accessibility.Accessible;
 | 
						|
import javax.accessibility.AccessibleContext;
 | 
						|
import javax.accessibility.AccessibleRole;
 | 
						|
import javax.accessibility.AccessibleState;
 | 
						|
import javax.accessibility.AccessibleStateSet;
 | 
						|
import javax.accessibility.AccessibleText;
 | 
						|
import javax.swing.text.AttributeSet;
 | 
						|
 | 
						|
/**
 | 
						|
 * This class provides common functionality for widgets than
 | 
						|
 * contain text.
 | 
						|
 *
 | 
						|
 * @author Aaron M. Renn (arenn@urbanophile.com)
 | 
						|
 */
 | 
						|
public class TextComponent extends Component
 | 
						|
  implements Serializable, Accessible
 | 
						|
{
 | 
						|
 | 
						|
  private static final long serialVersionUID = -2214773872412987419L;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @serial Indicates whether or not this component is editable.
 | 
						|
   * This is package-private to avoid an accessor method.
 | 
						|
   */
 | 
						|
  boolean editable;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @serial The starting position of the selected text region.
 | 
						|
   * This is package-private to avoid an accessor method.
 | 
						|
   */
 | 
						|
  int selectionStart;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @serial The ending position of the selected text region.
 | 
						|
   * This is package-private to avoid an accessor method.
 | 
						|
   */
 | 
						|
  int selectionEnd;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @serial The text in the component
 | 
						|
   * This is package-private to avoid an accessor method.
 | 
						|
   */
 | 
						|
  String text;
 | 
						|
 | 
						|
  /**
 | 
						|
   * A list of listeners that will receive events from this object.
 | 
						|
   */
 | 
						|
  protected transient TextListener textListener;
 | 
						|
 | 
						|
  protected class AccessibleAWTTextComponent
 | 
						|
    extends AccessibleAWTComponent
 | 
						|
    implements AccessibleText, TextListener
 | 
						|
  {
 | 
						|
    private static final long serialVersionUID = 3631432373506317811L;
 | 
						|
 | 
						|
    // Constructor
 | 
						|
    // Adds a listener for tracking caret changes
 | 
						|
    public AccessibleAWTTextComponent()
 | 
						|
    {
 | 
						|
      TextComponent.this.addTextListener(this);
 | 
						|
    }
 | 
						|
 | 
						|
    public AccessibleRole getAccessibleRole()
 | 
						|
    {
 | 
						|
      return AccessibleRole.TEXT;
 | 
						|
    }
 | 
						|
 | 
						|
    public AccessibleStateSet getAccessibleStateSet()
 | 
						|
    {
 | 
						|
      // TODO: Docs say PropertyChangeEvent will fire if this state changes.
 | 
						|
      // That means that the event has to fire when editable changes.
 | 
						|
      AccessibleStateSet ss = super.getAccessibleStateSet();
 | 
						|
      if (editable)
 | 
						|
        ss.add(AccessibleState.EDITABLE);
 | 
						|
      return ss;
 | 
						|
    }
 | 
						|
 | 
						|
    public AccessibleText getAccessibleText()
 | 
						|
    {
 | 
						|
      return this;
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getIndexAtPoint(java.awt.Point)
 | 
						|
     */
 | 
						|
    public int getIndexAtPoint(Point point)
 | 
						|
    {
 | 
						|
      return TextComponent.this.getIndexAtPoint(point);
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getCharacterBounds(int)
 | 
						|
     */
 | 
						|
    public Rectangle getCharacterBounds(int index)
 | 
						|
    {
 | 
						|
      return TextComponent.this.getCharacterBounds(index);
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getCharCount()
 | 
						|
     */
 | 
						|
    public int getCharCount()
 | 
						|
    {
 | 
						|
      return text.length();
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getCaretPosition()
 | 
						|
     */
 | 
						|
    public int getCaretPosition()
 | 
						|
    {
 | 
						|
      return TextComponent.this.getCaretPosition();
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getAtIndex(int, int)
 | 
						|
     */
 | 
						|
    public String getAtIndex(int part, int index)
 | 
						|
    {
 | 
						|
      if (index < 0 || index >= text.length())
 | 
						|
        return null;
 | 
						|
      BreakIterator it = null;
 | 
						|
      switch (part)
 | 
						|
      {
 | 
						|
        case CHARACTER:
 | 
						|
          return text.substring(index, index + 1);
 | 
						|
        case WORD:
 | 
						|
          it = BreakIterator.getWordInstance();
 | 
						|
          break;
 | 
						|
        case SENTENCE:
 | 
						|
          it = BreakIterator.getSentenceInstance();
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          return null;
 | 
						|
      }
 | 
						|
          it.setText(text);
 | 
						|
          int start = index;
 | 
						|
          if (!it.isBoundary(index))
 | 
						|
            start = it.preceding(index);
 | 
						|
          int end = it.following(index);
 | 
						|
          if (end == -1)
 | 
						|
            return text.substring(index);
 | 
						|
          else
 | 
						|
            return text.substring(index, end);
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getAfterIndex(int, int)
 | 
						|
     */
 | 
						|
    public String getAfterIndex(int part, int index) {
 | 
						|
      if (index < 0 || index >= text.length())
 | 
						|
        return null;
 | 
						|
      BreakIterator it = null;
 | 
						|
      switch (part)
 | 
						|
      {
 | 
						|
        case CHARACTER:
 | 
						|
          return text.substring(index, index + 1);
 | 
						|
        case WORD:
 | 
						|
          it = BreakIterator.getWordInstance();
 | 
						|
          break;
 | 
						|
        case SENTENCE:
 | 
						|
          it = BreakIterator.getSentenceInstance();
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          return null;
 | 
						|
      }
 | 
						|
          it.setText(text);
 | 
						|
          int start = index;
 | 
						|
          if (!it.isBoundary(index))
 | 
						|
            start = it.following(index);
 | 
						|
          // Make sure there was a complete unit.  I.e. if index is in the middle
 | 
						|
          // of a word, return null if there is no word after the that one.
 | 
						|
          if (start == -1)
 | 
						|
            return null;
 | 
						|
          int end = it.following(start);
 | 
						|
          if (end == -1)
 | 
						|
            return text.substring(index);
 | 
						|
          else
 | 
						|
            return text.substring(index, end);
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getBeforeIndex(int, int)
 | 
						|
     */
 | 
						|
    public String getBeforeIndex(int part, int index)
 | 
						|
    {
 | 
						|
      if (index < 1 || index >= text.length())
 | 
						|
        return null;
 | 
						|
      BreakIterator it = null;
 | 
						|
      switch (part)
 | 
						|
      {
 | 
						|
        case CHARACTER:
 | 
						|
          return text.substring(index - 1, index);
 | 
						|
        case WORD:
 | 
						|
          it = BreakIterator.getWordInstance();
 | 
						|
          break;
 | 
						|
        case SENTENCE:
 | 
						|
          it = BreakIterator.getSentenceInstance();
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          return null;
 | 
						|
      }
 | 
						|
          it.setText(text);
 | 
						|
          int end = index;
 | 
						|
          if (!it.isBoundary(index))
 | 
						|
            end = it.preceding(index);
 | 
						|
          // Make sure there was a complete unit.  I.e. if index is in the middle
 | 
						|
          // of a word, return null if there is no word before that one.
 | 
						|
          if (end == -1)
 | 
						|
            return null;
 | 
						|
          int start = it.preceding(end);
 | 
						|
          if (start == -1)
 | 
						|
            return text.substring(0, end);
 | 
						|
          else
 | 
						|
            return text.substring(start, end);
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getCharacterAttribute(int)
 | 
						|
     */
 | 
						|
    public AttributeSet getCharacterAttribute(int index)
 | 
						|
    {
 | 
						|
      // FIXME: I suspect this really gets filled in by subclasses.
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getSelectionStart()
 | 
						|
     */
 | 
						|
    public int getSelectionStart() {
 | 
						|
      // TODO Auto-generated method stub
 | 
						|
      return selectionStart;
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getSelectionEnd()
 | 
						|
     */
 | 
						|
    public int getSelectionEnd()
 | 
						|
    {
 | 
						|
      return selectionEnd;
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see javax.accessibility.AccessibleText#getSelectedText()
 | 
						|
     */
 | 
						|
    public String getSelectedText()
 | 
						|
    {
 | 
						|
      if (selectionEnd - selectionStart > 0)
 | 
						|
        return text.substring(selectionStart, selectionEnd);
 | 
						|
      else
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    /* (non-Javadoc)
 | 
						|
     * @see java.awt.event.TextListener#textValueChanged(java.awt.event.TextEvent)
 | 
						|
     */
 | 
						|
    public void textValueChanged(TextEvent event)
 | 
						|
    {
 | 
						|
      // TODO Auto-generated method stub
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  TextComponent(String text)
 | 
						|
  {
 | 
						|
    if (text == null)
 | 
						|
      this.text = "";
 | 
						|
    else
 | 
						|
      this.text = text;
 | 
						|
 | 
						|
    this.editable = true;
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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();
 | 
						|
 | 
						|
    return(text);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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);
 | 
						|
    setCaretPosition(0);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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.
 | 
						|
   * If the text is not selected then caret position is returned.
 | 
						|
   *
 | 
						|
   * @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() < selectionStart)
 | 
						|
                              ? selectionStart : getSelectionEnd());
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the ending position of the selected text region.
 | 
						|
   * If the text is not selected, then caret position is returned
 | 
						|
   *
 | 
						|
   * @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 selectionStart The new start position for the selected text.
 | 
						|
   * @param selectionEnd The new end position for the selected text.
 | 
						|
   */
 | 
						|
  public synchronized void select(int selectionStart, int selectionEnd)
 | 
						|
  {
 | 
						|
    if (selectionStart < 0)
 | 
						|
      selectionStart = 0;
 | 
						|
 | 
						|
    if (selectionStart > getText().length())
 | 
						|
      selectionStart = text.length();
 | 
						|
 | 
						|
    if (selectionEnd > text.length())
 | 
						|
      selectionEnd = text.length();
 | 
						|
 | 
						|
    if (selectionStart > selectionEnd)
 | 
						|
      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.
 | 
						|
   *
 | 
						|
   * @exception IllegalArgumentException If the value supplied for position
 | 
						|
   * is less than zero.
 | 
						|
   *
 | 
						|
   * @since 1.1
 | 
						|
   */
 | 
						|
  public synchronized void setCaretPosition(int caretPosition)
 | 
						|
  {
 | 
						|
    if (caretPosition < 0)
 | 
						|
      throw new IllegalArgumentException();
 | 
						|
 | 
						|
    TextComponentPeer tcp = (TextComponentPeer) getPeer();
 | 
						|
    if (tcp != null)
 | 
						|
      tcp.setCaretPosition(caretPosition);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Tests whether or not this component's text can be edited.
 | 
						|
   *
 | 
						|
   * @return <code>true</code> if the text can be edited, <code>false</code>
 | 
						|
   * otherwise.
 | 
						|
   */
 | 
						|
  public boolean isEditable()
 | 
						|
  {
 | 
						|
    return(editable);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sets whether or not this component's text can be edited.
 | 
						|
   *
 | 
						|
   * @param editable <code>true</code> to enable editing of the text,
 | 
						|
   * <code>false</code> 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 <code>processTextEvent()</code> 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 <code>enableEvents()</code>.
 | 
						|
   *
 | 
						|
   * @param event The text event to process.
 | 
						|
   */
 | 
						|
  protected void processTextEvent(TextEvent event)
 | 
						|
  {
 | 
						|
    if (textListener != null)
 | 
						|
      textListener.textValueChanged(event);
 | 
						|
  }
 | 
						|
 | 
						|
  void dispatchEventImpl(AWTEvent e)
 | 
						|
  {
 | 
						|
    if (e.id <= TextEvent.TEXT_LAST
 | 
						|
        && e.id >= TextEvent.TEXT_FIRST
 | 
						|
        && (textListener != null
 | 
						|
            || (eventMask & AWTEvent.TEXT_EVENT_MASK) != 0))
 | 
						|
      processEvent(e);
 | 
						|
    else
 | 
						|
      super.dispatchEventImpl(e);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns a debugging string.
 | 
						|
   *
 | 
						|
   * @return A debugging string.
 | 
						|
   */
 | 
						|
  protected String paramString()
 | 
						|
  {
 | 
						|
    return(getClass().getName() + "(text=" + getText() + ")");
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns an array of all the objects currently registered as FooListeners
 | 
						|
   * upon this <code>TextComponent</code>. FooListeners are registered using
 | 
						|
   * the addFooListener method.
 | 
						|
   *
 | 
						|
   * @exception ClassCastException If listenerType doesn't specify a class or
 | 
						|
   * interface that implements java.util.EventListener.
 | 
						|
   */
 | 
						|
  public <T extends EventListener> T[] getListeners(Class<T> listenerType)
 | 
						|
  {
 | 
						|
    if (listenerType == TextListener.class)
 | 
						|
      return AWTEventMulticaster.getListeners(textListener, listenerType);
 | 
						|
 | 
						|
    return super.getListeners(listenerType);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns all text listeners registered to this object.
 | 
						|
   */
 | 
						|
  public TextListener[] getTextListeners()
 | 
						|
  {
 | 
						|
    return (TextListener[]) getListeners(TextListener.class);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Gets the AccessibleContext associated with this <code>TextComponent</code>.
 | 
						|
   * The context is created, if necessary.
 | 
						|
   *
 | 
						|
   * @return the associated context
 | 
						|
   */
 | 
						|
  public AccessibleContext getAccessibleContext()
 | 
						|
  {
 | 
						|
    /* Create the context if this is the first request */
 | 
						|
    if (accessibleContext == null)
 | 
						|
      accessibleContext = new AccessibleAWTTextComponent();
 | 
						|
    return accessibleContext;
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  // Provide AccessibleAWTTextComponent access to several peer functions that
 | 
						|
  // aren't publicly exposed.  This is package-private to avoid an accessor
 | 
						|
  // method.
 | 
						|
  synchronized int getIndexAtPoint(Point p)
 | 
						|
  {
 | 
						|
    TextComponentPeer tcp = (TextComponentPeer) getPeer();
 | 
						|
    if (tcp != null)
 | 
						|
      return tcp.getIndexAtPoint(p.x, p.y);
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  synchronized Rectangle getCharacterBounds(int i)
 | 
						|
  {
 | 
						|
    TextComponentPeer tcp = (TextComponentPeer) getPeer();
 | 
						|
    if (tcp != null)
 | 
						|
      return tcp.getCharacterBounds(i);
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * All old mouse events for this component should
 | 
						|
   * be ignored.
 | 
						|
   *
 | 
						|
   * @return true to ignore all old mouse events.
 | 
						|
   */
 | 
						|
  static boolean ignoreOldMouseEvents()
 | 
						|
  {
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
} // class TextComponent
 |