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

#ifndef __javax_swing_JList$AccessibleJList$AccessibleJListChild__
#define __javax_swing_JList$AccessibleJList$AccessibleJListChild__

#pragma interface

#include <javax/accessibility/AccessibleContext.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Cursor;
        class Dimension;
        class Font;
        class FontMetrics;
        class Point;
        class Rectangle;
      namespace event
      {
          class FocusListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class Accessible;
        class AccessibleContext;
        class AccessibleRole;
        class AccessibleStateSet;
    }
    namespace swing
    {
        class JList;
        class JList$AccessibleJList;
        class JList$AccessibleJList$AccessibleJListChild;
    }
  }
}

class javax::swing::JList$AccessibleJList$AccessibleJListChild : public ::javax::accessibility::AccessibleContext
{

public:
  JList$AccessibleJList$AccessibleJListChild(::javax::swing::JList$AccessibleJList *, ::javax::swing::JList *, jint);
  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 *);
  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 void addPropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual void removePropertyChangeListener(::java::beans::PropertyChangeListener *);
public: // actually package-private
  ::javax::swing::JList * __attribute__((aligned(__alignof__( ::javax::accessibility::AccessibleContext)))) parent;
  jint listIndex;
  ::java::awt::Cursor * cursor;
  ::javax::swing::JList$AccessibleJList * this$1;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JList$AccessibleJList$AccessibleJListChild__
