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

#ifndef __javax_swing_text_FlowView$LogicalView__
#define __javax_swing_text_FlowView$LogicalView__

#pragma interface

#include <javax/swing/text/CompositeView.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Rectangle;
        class Shape;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class DocumentEvent;
      }
      namespace text
      {
          class AttributeSet;
          class Element;
          class FlowView;
          class FlowView$LogicalView;
          class View;
          class ViewFactory;
      }
    }
  }
}

class javax::swing::text::FlowView$LogicalView : public ::javax::swing::text::CompositeView
{

public: // actually package-private
  FlowView$LogicalView(::javax::swing::text::FlowView *, ::javax::swing::text::Element *);
public:
  virtual ::javax::swing::text::AttributeSet * getAttributes();
public: // actually protected
  virtual void childAllocation(jint, ::java::awt::Rectangle *);
  virtual ::javax::swing::text::View * getViewAtPoint(jint, jint, ::java::awt::Rectangle *);
  virtual jboolean isAfter(jint, jint, ::java::awt::Rectangle *);
  virtual jboolean isBefore(jint, jint, ::java::awt::Rectangle *);
public:
  virtual jfloat getPreferredSpan(jint);
  virtual jfloat getMinimumSpan(jint);
  virtual void paint(::java::awt::Graphics *, ::java::awt::Shape *);
public: // actually protected
  virtual void loadChildren(::javax::swing::text::ViewFactory *);
  virtual void forwardUpdateToView(::javax::swing::text::View *, ::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
  virtual jint getViewIndexAtPosition(jint);
public: // actually package-private
  ::javax::swing::text::FlowView * __attribute__((aligned(__alignof__( ::javax::swing::text::CompositeView)))) this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_FlowView$LogicalView__
