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

#ifndef __java_awt_Frame__
#define __java_awt_Frame__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Frame;
        class GraphicsConfiguration;
        class Image;
        class MenuBar;
        class MenuComponent;
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::Frame : public ::java::awt::Window
{

public:
  Frame();
  Frame(::java::lang::String *);
  Frame(::java::awt::GraphicsConfiguration *);
  Frame(::java::lang::String *, ::java::awt::GraphicsConfiguration *);
  virtual ::java::lang::String * getTitle();
  virtual void setTitle(::java::lang::String *);
  virtual ::java::awt::Image * getIconImage();
  virtual void setIconImage(::java::awt::Image *);
  virtual ::java::awt::MenuBar * getMenuBar();
  virtual void setMenuBar(::java::awt::MenuBar *);
  virtual jboolean isResizable();
  virtual void setResizable(jboolean);
  virtual jint getCursorType();
  virtual void setCursor(jint);
  virtual void remove(::java::awt::MenuComponent *);
  virtual void addNotify();
  virtual void removeNotify();
public: // actually protected
  virtual ::java::lang::String * paramString();
private:
  static void noteFrame(::java::awt::Frame *);
public: // actually package-private
  static jboolean hasDisplayableFrames();
public:
  static JArray< ::java::awt::Frame * > * getFrames();
  virtual void setState(jint);
  virtual jint getState();
  virtual void setExtendedState(jint);
  virtual jint getExtendedState();
  virtual void setMaximizedBounds(::java::awt::Rectangle *);
  virtual ::java::awt::Rectangle * getMaximizedBounds();
  virtual jboolean isUndecorated();
  virtual void setUndecorated(jboolean);
public: // actually package-private
  virtual ::java::lang::String * generateName();
private:
  static jlong getUniqueLong();
public:
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  static const jint DEFAULT_CURSOR = 0;
  static const jint CROSSHAIR_CURSOR = 1;
  static const jint TEXT_CURSOR = 2;
  static const jint WAIT_CURSOR = 3;
  static const jint SW_RESIZE_CURSOR = 4;
  static const jint SE_RESIZE_CURSOR = 5;
  static const jint NW_RESIZE_CURSOR = 6;
  static const jint NE_RESIZE_CURSOR = 7;
  static const jint N_RESIZE_CURSOR = 8;
  static const jint S_RESIZE_CURSOR = 9;
  static const jint E_RESIZE_CURSOR = 11;
  static const jint W_RESIZE_CURSOR = 10;
  static const jint HAND_CURSOR = 12;
  static const jint MOVE_CURSOR = 13;
  static const jint ICONIFIED = 1;
  static const jint MAXIMIZED_BOTH = 6;
  static const jint MAXIMIZED_HORIZ = 2;
  static const jint MAXIMIZED_VERT = 4;
  static const jint NORMAL = 0;
private:
  static const jlong serialVersionUID = 2673458971256075116LL;
  jint __attribute__((aligned(__alignof__( ::java::awt::Window)))) frameSerializedDataVersion;
  ::java::awt::Image * icon;
  jboolean mbManagement;
  ::java::awt::MenuBar * menuBar;
public: // actually package-private
  ::java::util::Vector * ownedWindows;
private:
  jboolean resizable;
public: // actually package-private
  jint state;
private:
  ::java::lang::String * title;
  ::java::awt::Rectangle * maximizedBounds;
  jboolean undecorated;
  static jlong next_frame_number;
  static ::java::util::ArrayList * weakFrames;
  static ::java::lang::ref::ReferenceQueue * weakFramesQueue;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_Frame__
