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

#ifndef __javax_swing_text_ParagraphView__
#define __javax_swing_text_ParagraphView__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Shape;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class DocumentEvent;
      }
      namespace text
      {
          class Element;
          class ParagraphView;
          class ParagraphView$Row;
          class Position$Bias;
          class TabSet;
          class View;
          class ViewFactory;
      }
    }
  }
}

class javax::swing::text::ParagraphView : public ::javax::swing::text::FlowView
{

public:
  ParagraphView(::javax::swing::text::Element *);
  virtual jfloat nextTabStop(jfloat, jint);
public: // actually protected
  virtual ::javax::swing::text::View * createRow();
public:
  virtual jfloat getAlignment(jint);
  virtual void changedUpdate(::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
public: // actually protected
  virtual void setPropertiesFromAttributes();
  virtual void setFirstLineIndent(jfloat);
  virtual void setJustification(jint);
  virtual void setLineSpacing(jfloat);
  virtual ::javax::swing::text::View * getLayoutView(jint);
  virtual jint getLayoutViewCount();
  virtual ::javax::swing::text::TabSet * getTabSet();
  virtual jint findOffsetToCharactersInString(JArray< jchar > *, jint);
  virtual jint getClosestPositionTo(jint, ::javax::swing::text::Position$Bias *, ::java::awt::Shape *, jint, JArray< ::javax::swing::text::Position$Bias * > *, jint, jint);
  virtual jfloat getPartialSize(jint, jint);
  virtual jfloat getTabBase();
  virtual void adjustRow(::javax::swing::text::ParagraphView$Row *, jint, jint);
public:
  virtual ::javax::swing::text::View * breakView(jint, jfloat, ::java::awt::Shape *);
  virtual jint getBreakWeight(jint, jfloat);
public: // actually package-private
  static jint access$0(::javax::swing::text::ParagraphView *);
public: // actually protected
  jint __attribute__((aligned(__alignof__( ::javax::swing::text::FlowView)))) firstLineIndent;
private:
  jint justification;
  jfloat lineSpacing;
  ::javax::swing::text::TabSet * tabSet;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_ParagraphView__
