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

#ifndef __javax_swing_JViewport__
#define __javax_swing_JViewport__

#pragma interface

#include <javax/swing/JComponent.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Dimension;
        class Graphics;
        class Image;
        class Insets;
        class LayoutManager;
        class Point;
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class JViewport;
        class JViewport$ViewListener;
      namespace border
      {
          class Border;
      }
      namespace event
      {
          class ChangeEvent;
          class ChangeListener;
      }
      namespace plaf
      {
          class ViewportUI;
      }
    }
  }
}

class javax::swing::JViewport : public ::javax::swing::JComponent
{

public:
  JViewport();
  virtual ::java::awt::Dimension * getExtentSize();
  virtual ::java::awt::Dimension * toViewCoordinates(::java::awt::Dimension *);
  virtual ::java::awt::Point * toViewCoordinates(::java::awt::Point *);
  virtual void setExtentSize(::java::awt::Dimension *);
  virtual ::java::awt::Dimension * getViewSize();
  virtual void setViewSize(::java::awt::Dimension *);
  virtual ::java::awt::Point * getViewPosition();
  virtual void setViewPosition(::java::awt::Point *);
  virtual ::java::awt::Rectangle * getViewRect();
  virtual jboolean isBackingStoreEnabled();
  virtual void setBackingStoreEnabled(jboolean);
  virtual void setScrollMode(jint);
  virtual jint getScrollMode();
  virtual ::java::awt::Component * getView();
  virtual void setView(::java::awt::Component *);
  virtual void reshape(jint, jint, jint, jint);
  virtual ::java::awt::Insets * getInsets();
  virtual ::java::awt::Insets * getInsets(::java::awt::Insets *);
  virtual jboolean isOptimizedDrawingEnabled();
  virtual void paint(::java::awt::Graphics *);
  virtual void addChangeListener(::javax::swing::event::ChangeListener *);
  virtual void removeChangeListener(::javax::swing::event::ChangeListener *);
  virtual JArray< ::javax::swing::event::ChangeListener * > * getChangeListeners();
  virtual ::java::lang::String * getUIClassID();
  virtual void updateUI();
  virtual ::javax::swing::plaf::ViewportUI * getUI();
  virtual void setUI(::javax::swing::plaf::ViewportUI *);
  virtual void setBorder(::javax::swing::border::Border *);
  virtual void scrollRectToVisible(::java::awt::Rectangle *);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual void repaint(jlong, jint, jint, jint, jint);
public: // actually protected
  virtual void addImpl(::java::awt::Component *, ::java::lang::Object *, jint);
  virtual void fireStateChanged();
  virtual ::javax::swing::JViewport$ViewListener * createViewListener();
  virtual ::java::awt::LayoutManager * createLayoutManager();
  virtual jboolean computeBlit(jint, jint, ::java::awt::Point *, ::java::awt::Point *, ::java::awt::Dimension *, ::java::awt::Rectangle *);
public: // actually package-private
  virtual void paintSimple(::java::awt::Graphics *);
  virtual void paintBackingStore(::java::awt::Graphics *);
  virtual void paintBlit(::java::awt::Graphics *);
  virtual void paintImmediately2(jint, jint, jint, jint);
  virtual jboolean isPaintRoot();
public:
  static const jint SIMPLE_SCROLL_MODE = 0;
  static const jint BLIT_SCROLL_MODE = 1;
  static const jint BACKINGSTORE_SCROLL_MODE = 2;
private:
  static const jlong serialVersionUID = -6925142919680527970LL;
  static jint defaultScrollMode;
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::javax::swing::JComponent)))) scrollUnderway;
  jboolean isViewSizeSet;
  jboolean backingStore;
  ::java::awt::Image * backingStoreImage;
  ::java::awt::Point * lastPaintPosition;
public: // actually package-private
  ::javax::swing::event::ChangeEvent * changeEvent;
  jint scrollMode;
  ::javax::swing::JViewport$ViewListener * viewListener;
  ::java::awt::Point * cachedBlitFrom;
  ::java::awt::Point * cachedBlitTo;
  ::java::awt::Dimension * cachedBlitSize;
  ::java::awt::Rectangle * cachedBlitPaint;
  jboolean damaged;
  jboolean sizeChanged;
private:
  jboolean isPaintRoot__;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JViewport__
