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

#ifndef __javax_swing_JTable$AccessibleJTable$AccessibleJTableHeaderCell__
#define __javax_swing_JTable$AccessibleJTable$AccessibleJTableHeaderCell__

#pragma interface

#include <javax/accessibility/AccessibleContext.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Component;
        class Cursor;
        class Dimension;
        class Font;
        class FontMetrics;
        class Point;
        class Rectangle;
      namespace event
      {
          class FocusListener;
      }
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class Accessible;
        class AccessibleContext;
        class AccessibleRole;
        class AccessibleStateSet;
    }
    namespace swing
    {
        class JTable$AccessibleJTable;
        class JTable$AccessibleJTable$AccessibleJTableHeaderCell;
      namespace table
      {
          class JTableHeader;
      }
    }
  }
}

class javax::swing::JTable$AccessibleJTable$AccessibleJTableHeaderCell : public ::javax::accessibility::AccessibleContext
{

  JTable$AccessibleJTable$AccessibleJTableHeaderCell(::javax::swing::JTable$AccessibleJTable *, ::javax::swing::table::JTableHeader *, ::java::awt::Component *, jint, jint);
public: // actually package-private
  virtual ::java::awt::Component * getColumnHeaderRenderer();
public:
  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();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual ::java::awt::Color * getBackground();
  virtual void setBackground(::java::awt::Color *);
  virtual ::java::awt::Color * getForeground();
  virtual void setForeground(::java::awt::Color *);
  virtual ::java::awt::Cursor * getCursor();
  virtual void setCursor(::java::awt::Cursor *);
  virtual ::java::awt::Font * getFont();
  virtual void setFont(::java::awt::Font *);
  virtual ::java::awt::FontMetrics * getFontMetrics(::java::awt::Font *);
  virtual jboolean isEnabled();
  virtual void setEnabled(jboolean);
  virtual jboolean isVisible();
  virtual void setVisible(jboolean);
  virtual jboolean isShowing();
  virtual jboolean contains(::java::awt::Point *);
  virtual ::java::awt::Point * getLocationOnScreen();
  virtual ::java::awt::Point * getLocation();
  virtual void setLocation(::java::awt::Point *);
  virtual ::java::awt::Rectangle * getBounds();
  virtual void setBounds(::java::awt::Rectangle *);
  virtual ::java::awt::Dimension * getSize();
  virtual void setSize(::java::awt::Dimension *);
  virtual ::javax::accessibility::Accessible * getAccessibleAt(::java::awt::Point *);
  virtual jboolean isFocusTraversable();
  virtual void requestFocus();
  virtual void addFocusListener(::java::awt::event::FocusListener *);
  virtual void removeFocusListener(::java::awt::event::FocusListener *);
public: // actually package-private
  JTable$AccessibleJTable$AccessibleJTableHeaderCell(::javax::swing::JTable$AccessibleJTable *, ::javax::swing::table::JTableHeader *, ::java::awt::Component *, jint, jint, ::javax::swing::JTable$AccessibleJTable$AccessibleJTableHeaderCell *);
  ::javax::swing::table::JTableHeader * __attribute__((aligned(__alignof__( ::javax::accessibility::AccessibleContext)))) header;
  jint columnIndex;
  ::javax::swing::JTable$AccessibleJTable * this$1;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JTable$AccessibleJTable$AccessibleJTableHeaderCell__
