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

#ifndef __gnu_java_awt_peer_swing_SwingTextFieldPeer$SwingTextField__
#define __gnu_java_awt_peer_swing_SwingTextFieldPeer$SwingTextField__

#pragma interface

#include <javax/swing/JTextField.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace peer
        {
          namespace swing
          {
              class SwingTextFieldPeer;
              class SwingTextFieldPeer$SwingTextField;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Container;
        class Graphics;
        class Image;
        class Point;
        class TextField;
      namespace event
      {
          class FocusEvent;
          class KeyEvent;
          class MouseEvent;
      }
    }
  }
  namespace javax
  {
    namespace swing
    {
        class JComponent;
    }
  }
}

class gnu::java::awt::peer::swing::SwingTextFieldPeer$SwingTextField : public ::javax::swing::JTextField
{

public: // actually package-private
  SwingTextFieldPeer$SwingTextField(::gnu::java::awt::peer::swing::SwingTextFieldPeer *, ::java::awt::TextField *);
public:
  virtual ::java::awt::Point * getLocationOnScreen();
  virtual jboolean isShowing();
  virtual ::java::awt::Image * createImage(jint, jint);
  virtual ::javax::swing::JComponent * getJComponent();
  virtual void handleMouseEvent(::java::awt::event::MouseEvent *);
  virtual void handleMouseMotionEvent(::java::awt::event::MouseEvent *);
  virtual void handleKeyEvent(::java::awt::event::KeyEvent *);
  virtual void handleFocusEvent(::java::awt::event::FocusEvent *);
  virtual ::java::awt::Container * getParent();
  virtual ::java::awt::Graphics * getGraphics();
  virtual void requestFocus();
  virtual jboolean requestFocus(jboolean);
public: // actually package-private
  ::java::awt::TextField * __attribute__((aligned(__alignof__( ::javax::swing::JTextField)))) textField;
  ::gnu::java::awt::peer::swing::SwingTextFieldPeer * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_swing_SwingTextFieldPeer$SwingTextField__
