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

#ifndef __javax_swing_plaf_basic_BasicTextUI$RootView__
#define __javax_swing_plaf_basic_BasicTextUI$RootView__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Container;
        class Graphics;
        class Shape;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class DocumentEvent;
      }
      namespace plaf
      {
        namespace basic
        {
            class BasicTextUI;
            class BasicTextUI$RootView;
        }
      }
      namespace text
      {
          class AttributeSet;
          class Document;
          class Position$Bias;
          class View;
          class ViewFactory;
      }
    }
  }
}

class javax::swing::plaf::basic::BasicTextUI$RootView : public ::javax::swing::text::View
{

public:
  BasicTextUI$RootView(::javax::swing::plaf::basic::BasicTextUI *);
  virtual ::javax::swing::text::ViewFactory * getViewFactory();
  virtual void preferenceChanged(::javax::swing::text::View *, jboolean, jboolean);
  virtual void setView(::javax::swing::text::View *);
  virtual ::javax::swing::text::View * getView(jint);
  virtual jint getViewCount();
  virtual ::java::awt::Container * getContainer();
  virtual void setSize(jfloat, jfloat);
  virtual void paint(::java::awt::Graphics *, ::java::awt::Shape *);
  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 void insertUpdate(::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
  virtual void removeUpdate(::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
  virtual void changedUpdate(::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
  virtual jint getNextVisualPositionFrom(jint, ::javax::swing::text::Position$Bias *, ::java::awt::Shape *, jint, JArray< ::javax::swing::text::Position$Bias * > *);
  virtual jint getStartOffset();
  virtual jint getEndOffset();
  virtual ::javax::swing::text::Document * getDocument();
  virtual ::javax::swing::text::AttributeSet * getAttributes();
  virtual jfloat getPreferredSpan(jint);
  virtual jfloat getMinimumSpan(jint);
  virtual jfloat getMaximumSpan(jint);
private:
  ::javax::swing::text::View * __attribute__((aligned(__alignof__( ::javax::swing::text::View)))) view;
public: // actually package-private
  ::javax::swing::plaf::basic::BasicTextUI * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicTextUI$RootView__
