
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_awt_TextComponent__
#define __java_awt_TextComponent__

#pragma interface

#include <java/awt/Component.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTEvent;
        class Point;
        class Rectangle;
        class TextComponent;
      namespace event
      {
          class TextEvent;
          class TextListener;
      }
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::TextComponent : public ::java::awt::Component
{

public: // actually package-private
  TextComponent(::java::lang::String *);
public:
  virtual ::java::lang::String * getText();
  virtual void setText(::java::lang::String *);
  virtual ::java::lang::String * getSelectedText();
  virtual jint getSelectionStart();
  virtual void setSelectionStart(jint);
  virtual jint getSelectionEnd();
  virtual void setSelectionEnd(jint);
  virtual void select(jint, jint);
  virtual void selectAll();
  virtual jint getCaretPosition();
  virtual void setCaretPosition(jint);
  virtual jboolean isEditable();
  virtual void setEditable(jboolean);
  virtual void removeNotify();
  virtual void addTextListener(::java::awt::event::TextListener *);
  virtual void removeTextListener(::java::awt::event::TextListener *);
public: // actually protected
  virtual void processEvent(::java::awt::AWTEvent *);
  virtual void processTextEvent(::java::awt::event::TextEvent *);
public: // actually package-private
  virtual void dispatchEventImpl(::java::awt::AWTEvent *);
public: // actually protected
  virtual ::java::lang::String * paramString();
public:
  virtual JArray< ::java::util::EventListener * > * getListeners(::java::lang::Class *);
  virtual JArray< ::java::awt::event::TextListener * > * getTextListeners();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
public: // actually package-private
  virtual jint getIndexAtPoint(::java::awt::Point *);
  virtual ::java::awt::Rectangle * getCharacterBounds(jint);
  static jboolean ignoreOldMouseEvents();
private:
  static const jlong serialVersionUID = -2214773872412987419LL;
public: // actually package-private
  jboolean __attribute__((aligned(__alignof__( ::java::awt::Component)))) editable;
  jint selectionStart;
  jint selectionEnd;
  ::java::lang::String * text;
public: // actually protected
  ::java::awt::event::TextListener * textListener;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_TextComponent__
