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

#ifndef __javax_swing_JTabbedPane$Page__
#define __javax_swing_JTabbedPane$Page__

#pragma interface

#include <javax/accessibility/AccessibleContext.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Component;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class Accessible;
        class AccessibleContext;
        class AccessibleRole;
        class AccessibleStateSet;
    }
    namespace swing
    {
        class Icon;
        class JTabbedPane;
        class JTabbedPane$Page;
    }
  }
}

class javax::swing::JTabbedPane$Page : public ::javax::accessibility::AccessibleContext
{

public: // actually protected
  JTabbedPane$Page(::javax::swing::JTabbedPane *, ::java::lang::String *, ::javax::swing::Icon *, ::java::awt::Component *, ::java::lang::String *);
public:
  virtual ::java::awt::Component * getComponent();
  virtual void setComponent(::java::awt::Component *);
  virtual ::java::lang::String * getTip();
  virtual void setTip(::java::lang::String *);
  virtual ::java::awt::Color * getBackground();
  virtual void setBackground(::java::awt::Color *);
  virtual ::java::awt::Color * getForeground();
  virtual void setForeground(::java::awt::Color *);
  virtual ::java::lang::String * getTitle();
  virtual void setTitle(::java::lang::String *);
  virtual ::javax::swing::Icon * getIcon();
  virtual void setIcon(::javax::swing::Icon *);
  virtual ::javax::swing::Icon * getDisabledIcon();
  virtual void setDisabledIcon(::javax::swing::Icon *);
  virtual jboolean isEnabled();
  virtual void setEnabled(jboolean);
  virtual jint getMnemonic();
  virtual void setMnemonic(jint);
  virtual void setMnemonic(jchar);
  virtual jint getDisplayedMnemonicIndex();
  virtual void setDisplayedMnemonicIndex(jint);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual ::java::lang::String * getAccessibleName();
  virtual ::javax::accessibility::AccessibleRole * getAccessibleRole();
  virtual ::javax::accessibility::AccessibleStateSet * getAccessibleStateSet();
  virtual jint getAccessibleIndexInParent();
  virtual jint getAccessibleChildrenCount();
  virtual ::javax::accessibility::Accessible * getAccessibleChild(jint);
  virtual ::java::util::Locale * getLocale();
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::javax::accessibility::AccessibleContext)))) tip;
  ::java::awt::Component * component;
  ::javax::swing::Icon * icon;
  ::javax::swing::Icon * disabledIcon;
  jboolean enabled;
  ::java::lang::String * title;
  ::java::awt::Color * bg;
  ::java::awt::Color * fg;
  jint mnemonicKey;
  jint underlinedChar;
  static const jlong serialVersionUID = 1614381073220130939LL;
public: // actually package-private
  ::javax::swing::JTabbedPane * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JTabbedPane$Page__
