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

#ifndef __javax_swing_text_AsyncBoxView__
#define __javax_swing_text_AsyncBoxView__

#pragma interface

#include <javax/swing/text/View.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Shape;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class DocumentEvent;
          class DocumentEvent$ElementChange;
      }
      namespace text
      {
          class AsyncBoxView;
          class AsyncBoxView$ChildLocator;
          class AsyncBoxView$ChildState;
          class Element;
          class LayoutQueue;
          class Position$Bias;
          class View;
          class ViewFactory;
      }
    }
  }
}

class javax::swing::text::AsyncBoxView : public ::javax::swing::text::View
{

public:
  AsyncBoxView(::javax::swing::text::Element *, jint);
  virtual jint getMajorAxis();
  virtual jint getMinorAxis();
  virtual ::javax::swing::text::View * getView(jint);
  virtual jint getViewCount();
  virtual jint getViewIndex(jint, ::javax::swing::text::Position$Bias *);
  virtual jfloat getTopInset();
  virtual void setTopInset(jfloat);
  virtual jfloat getBottomInset();
  virtual void setBottomInset(jfloat);
  virtual jfloat getLeftInset();
  virtual void setLeftInset(jfloat);
  virtual jfloat getRightInset();
  virtual void setRightInset(jfloat);
public: // actually protected
  virtual void loadChildren(::javax::swing::text::ViewFactory *);
  virtual jfloat getInsetSpan(jint);
  virtual void setEstimatedMajorSpan(jboolean);
  virtual jboolean getEstimatedMajorSpan();
  virtual void minorRequirementChange(::javax::swing::text::AsyncBoxView$ChildState *);
  virtual void majorRequirementChange(::javax::swing::text::AsyncBoxView$ChildState *, jfloat);
public:
  virtual void setParent(::javax::swing::text::View *);
  virtual void setSize(jfloat, jfloat);
  virtual void replace(jint, jint, JArray< ::javax::swing::text::View * > *);
  virtual void paint(::java::awt::Graphics *, ::java::awt::Shape *);
  virtual jfloat getPreferredSpan(jint);
  virtual ::java::awt::Shape * modelToView(jint, ::java::awt::Shape *, ::javax::swing::text::Position$Bias *);
  virtual jint viewToModel(jfloat, jfloat, ::java::awt::Shape *, JArray< ::javax::swing::text::Position$Bias * > *);
  virtual ::java::awt::Shape * getChildAllocation(jint, ::java::awt::Shape *);
  virtual jfloat getMaximumSpan(jint);
  virtual jfloat getMinimumSpan(jint);
  virtual void preferenceChanged(::javax::swing::text::View *, jboolean, jboolean);
public: // actually protected
  virtual void updateLayout(::javax::swing::event::DocumentEvent$ElementChange *, ::javax::swing::event::DocumentEvent *, ::java::awt::Shape *);
  virtual ::javax::swing::text::AsyncBoxView$ChildState * getChildState(jint);
  virtual ::javax::swing::text::LayoutQueue * getLayoutQueue();
  virtual jint getViewIndexAtPosition(jint, ::javax::swing::text::Position$Bias *);
  virtual ::javax::swing::text::AsyncBoxView$ChildState * createChildState(::javax::swing::text::View *);
  virtual void flushRequirementChanges();
private:
  jint __attribute__((aligned(__alignof__( ::javax::swing::text::View)))) majorAxis;
  jfloat topInset;
  jfloat bottomInset;
  jfloat leftInset;
  jboolean estimatedMajorSpan;
  jfloat rightInset;
  ::java::util::ArrayList * childStates;
public: // actually package-private
  ::javax::swing::text::AsyncBoxView$ChildState * changing;
  ::javax::swing::text::AsyncBoxView$ChildState * minReq;
  ::javax::swing::text::AsyncBoxView$ChildState * prefReq;
private:
  jboolean majorChanged;
public: // actually package-private
  jboolean minorChanged;
  jfloat majorSpan;
  jfloat minorSpan;
private:
  ::java::lang::Runnable * flushTask;
public: // actually protected
  ::javax::swing::text::AsyncBoxView$ChildLocator * locator;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_AsyncBoxView__
