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

#ifndef __javax_swing_JRootPane__
#define __javax_swing_JRootPane__

#pragma interface

#include <javax/swing/JComponent.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Container;
        class LayoutManager;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class Action;
        class JButton;
        class JLayeredPane;
        class JMenuBar;
        class JRootPane;
      namespace plaf
      {
          class RootPaneUI;
      }
    }
  }
}

class javax::swing::JRootPane : public ::javax::swing::JComponent
{

public:
  virtual void setJMenuBar(::javax::swing::JMenuBar *);
  virtual void setMenuBar(::javax::swing::JMenuBar *);
  virtual ::javax::swing::JMenuBar * getJMenuBar();
  virtual ::javax::swing::JMenuBar * getMenuBar();
  virtual jboolean isValidateRoot();
  virtual ::java::awt::Container * getContentPane();
  virtual void setContentPane(::java::awt::Container *);
public: // actually protected
  virtual void addImpl(::java::awt::Component *, ::java::lang::Object *, jint);
public:
  virtual ::java::awt::Component * getGlassPane();
  virtual void setGlassPane(::java::awt::Component *);
  virtual ::javax::swing::JLayeredPane * getLayeredPane();
  virtual void setLayeredPane(::javax::swing::JLayeredPane *);
  JRootPane();
public: // actually protected
  virtual ::java::awt::LayoutManager * createRootLayout();
  virtual ::java::awt::Container * createContentPane();
  virtual ::java::awt::Component * createGlassPane();
  virtual ::javax::swing::JLayeredPane * createLayeredPane();
public:
  virtual ::javax::swing::plaf::RootPaneUI * getUI();
  virtual void setUI(::javax::swing::plaf::RootPaneUI *);
  virtual void updateUI();
  virtual ::java::lang::String * getUIClassID();
  virtual ::javax::swing::JButton * getDefaultButton();
  virtual void setDefaultButton(::javax::swing::JButton *);
  virtual jint getWindowDecorationStyle();
  virtual void setWindowDecorationStyle(jint);
  virtual jboolean isOptimizedDrawingEnable();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
private:
  static const jlong serialVersionUID = 8690748000348575668LL;
public:
  static const jint NONE = 0;
  static const jint FRAME = 1;
  static const jint PLAIN_DIALOG = 2;
  static const jint INFORMATION_DIALOG = 3;
  static const jint ERROR_DIALOG = 4;
  static const jint COLOR_CHOOSER_DIALOG = 5;
  static const jint FILE_CHOOSER_DIALOG = 6;
  static const jint QUESTION_DIALOG = 7;
  static const jint WARNING_DIALOG = 8;
public: // actually protected
  ::java::awt::Component * __attribute__((aligned(__alignof__( ::javax::swing::JComponent)))) glassPane;
  ::javax::swing::JLayeredPane * layeredPane;
  ::javax::swing::JMenuBar * menuBar;
  ::java::awt::Container * contentPane;
  ::javax::swing::JButton * defaultButton;
  ::javax::swing::Action * defaultPressAction;
  ::javax::swing::Action * defaultReleaseAction;
private:
  jint windowDecorationStyle;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JRootPane__
