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

#ifndef __javax_swing_JComponent$AccessibleJComponent__
#define __javax_swing_JComponent$AccessibleJComponent__

#pragma interface

#include <java/awt/Container$AccessibleAWTContainer.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
      namespace event
      {
          class ContainerListener;
          class FocusListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class Accessible;
        class AccessibleKeyBinding;
        class AccessibleRole;
        class AccessibleStateSet;
    }
    namespace swing
    {
        class JComponent;
        class JComponent$AccessibleJComponent;
      namespace border
      {
          class Border;
      }
    }
  }
}

class javax::swing::JComponent$AccessibleJComponent : public ::java::awt::Container$AccessibleAWTContainer
{

public: // actually protected
  JComponent$AccessibleJComponent(::javax::swing::JComponent *);
public:
  virtual void addPropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual void removePropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual jint getAccessibleChildrenCount();
  virtual ::javax::accessibility::Accessible * getAccessibleChild(jint);
  virtual ::javax::accessibility::AccessibleStateSet * getAccessibleStateSet();
  virtual ::java::lang::String * getAccessibleName();
  virtual ::java::lang::String * getAccessibleDescription();
  virtual ::javax::accessibility::AccessibleRole * getAccessibleRole();
public: // actually protected
  virtual ::java::lang::String * getBorderTitle(::javax::swing::border::Border *);
public:
  virtual ::java::lang::String * getToolTipText();
  virtual ::java::lang::String * getTitledBorderText();
  virtual ::javax::accessibility::AccessibleKeyBinding * getAccessibleKeyBinding();
private:
  static const jlong serialVersionUID = -7047089700479897799LL;
public: // actually protected
  ::java::awt::event::ContainerListener * __attribute__((aligned(__alignof__( ::java::awt::Container$AccessibleAWTContainer)))) accessibleContainerHandler;
  ::java::awt::event::FocusListener * accessibleFocusHandler;
public: // actually package-private
  ::javax::swing::JComponent * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JComponent$AccessibleJComponent__
