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

#ifndef __gnu_java_awt_peer_swing_SwingTextAreaPeer__
#define __gnu_java_awt_peer_swing_SwingTextAreaPeer__

#pragma interface

#include <gnu/java/awt/peer/swing/SwingComponentPeer.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace peer
        {
          namespace swing
          {
              class SwingTextAreaPeer;
              class SwingTextAreaPeer$SwingTextArea;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Dimension;
        class Rectangle;
        class TextArea;
      namespace im
      {
          class InputMethodRequests;
      }
    }
  }
}

class gnu::java::awt::peer::swing::SwingTextAreaPeer : public ::gnu::java::awt::peer::swing::SwingComponentPeer
{

public:
  SwingTextAreaPeer(::java::awt::TextArea *);
  virtual ::java::awt::Dimension * getMinimumSize(jint, jint);
  virtual ::java::awt::Dimension * getPreferredSize(jint, jint);
  virtual void insert(::java::lang::String *, jint);
  virtual void insertText(::java::lang::String *, jint);
  virtual ::java::awt::Dimension * minimumSize();
  virtual ::java::awt::Dimension * preferredSize();
  virtual ::java::awt::Dimension * minimumSize(jint, jint);
  virtual ::java::awt::Dimension * preferredSize(jint, jint);
  virtual void replaceRange(::java::lang::String *, jint, jint);
  virtual void replaceText(::java::lang::String *, jint, jint);
  virtual jlong filterEvents(jlong);
  virtual jint getCaretPosition();
  virtual ::java::awt::Rectangle * getCharacterBounds(jint);
  virtual jint getIndexAtPoint(jint, jint);
  virtual ::java::awt::im::InputMethodRequests * getInputMethodRequests();
  virtual jint getSelectionEnd();
  virtual jint getSelectionStart();
  virtual ::java::lang::String * getText();
  virtual void select(jint, jint);
  virtual void setCaretPosition(jint);
  virtual void setEditable(jboolean);
  virtual void setText(::java::lang::String *);
  virtual void reshape(jint, jint, jint, jint);
private:
  ::gnu::java::awt::peer::swing::SwingTextAreaPeer$SwingTextArea * __attribute__((aligned(__alignof__( ::gnu::java::awt::peer::swing::SwingComponentPeer)))) jTextArea;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_swing_SwingTextAreaPeer__
