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

#ifndef __java_awt_ScrollPane__
#define __java_awt_ScrollPane__

#pragma interface

#include <java/awt/Container.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Adjustable;
        class Component;
        class Dimension;
        class Graphics;
        class LayoutManager;
        class Point;
        class ScrollPane;
        class ScrollPaneAdjustable;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::ScrollPane : public ::java::awt::Container
{

public:
  ScrollPane();
  ScrollPane(jint);
  virtual jint getScrollbarDisplayPolicy();
  virtual ::java::awt::Adjustable * getHAdjustable();
  virtual ::java::awt::Adjustable * getVAdjustable();
  virtual ::java::awt::Dimension * getViewportSize();
  virtual jint getHScrollbarHeight();
  virtual jint getVScrollbarWidth();
  virtual ::java::awt::Point * getScrollPosition();
  virtual void setScrollPosition(::java::awt::Point *);
  virtual void setScrollPosition(jint, jint);
  virtual void addNotify();
  virtual void removeNotify();
public: // actually protected
  virtual void addImpl(::java::awt::Component *, ::java::lang::Object *, jint);
public:
  virtual void doLayout();
  virtual void layout();
  virtual void setLayout(::java::awt::LayoutManager *);
  virtual void printComponents(::java::awt::Graphics *);
  virtual ::java::lang::String * paramString();
private:
  ::java::lang::String * getScrollbarDisplayPolicyString();
  ::java::lang::String * getIsValidString();
public: // actually protected
  virtual jboolean eventTypeEnabled(jint);
public:
  virtual jboolean isWheelScrollingEnabled();
  virtual void setWheelScrollingEnabled(jboolean);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
public: // actually package-private
  virtual ::java::lang::String * generateName();
private:
  static jlong getUniqueLong();
public:
  static const jint SCROLLBARS_AS_NEEDED = 0;
  static const jint SCROLLBARS_ALWAYS = 1;
  static const jint SCROLLBARS_NEVER = 2;
private:
  static jlong next_scrollpane_number;
  static const jlong serialVersionUID = 7956609840827222915LL;
  ::java::awt::ScrollPaneAdjustable * __attribute__((aligned(__alignof__( ::java::awt::Container)))) hAdjustable;
  ::java::awt::ScrollPaneAdjustable * vAdjustable;
  jint scrollbarDisplayPolicy;
  ::java::awt::Point * scrollPosition;
  jboolean wheelScrollingEnabled;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_ScrollPane__
