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

#ifndef __javax_swing_text_html_BlockView__
#define __javax_swing_text_html_BlockView__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace swing
      {
        namespace text
        {
          namespace html
          {
            namespace css
            {
                class Length;
            }
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Shape;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class SizeRequirements;
      namespace event
      {
          class DocumentEvent;
      }
      namespace text
      {
          class AttributeSet;
          class Element;
          class View;
          class ViewFactory;
        namespace html
        {
            class BlockView;
            class StyleSheet;
            class StyleSheet$BoxPainter;
        }
      }
    }
  }
}

class javax::swing::text::html::BlockView : public ::javax::swing::text::BoxView
{

public:
  BlockView(::javax::swing::text::Element *, jint);
  virtual void setParent(::javax::swing::text::View *);
public: // actually protected
  virtual ::javax::swing::SizeRequirements * calculateMajorAxisRequirements(jint, ::javax::swing::SizeRequirements *);
  virtual ::javax::swing::SizeRequirements * calculateMinorAxisRequirements(jint, ::javax::swing::SizeRequirements *);
private:
  jboolean setCSSSpan(::javax::swing::SizeRequirements *, jint);
  void constrainSize(jint, ::javax::swing::SizeRequirements *, ::javax::swing::SizeRequirements *);
public: // actually protected
  virtual void layoutMinorAxis(jint, jint, JArray< jint > *, JArray< jint > *);
  virtual void layoutMajorAxis(jint, jint, JArray< jint > *, JArray< jint > *);
private:
  void positionView(jint, jint, jint, JArray< jint > *, JArray< jint > *);
public:
  virtual void paint(::java::awt::Graphics *, ::java::awt::Shape *);
  virtual ::javax::swing::text::AttributeSet * getAttributes();
  virtual jint getResizeWeight(jint);
  virtual jfloat getAlignment(jint);
  virtual void changedUpdate(::javax::swing::event::DocumentEvent *, ::java::awt::Shape *, ::javax::swing::text::ViewFactory *);
  virtual jfloat getPreferredSpan(jint);
  virtual jfloat getMinimumSpan(jint);
  virtual jfloat getMaximumSpan(jint);
public: // actually protected
  virtual void setPropertiesFromAttributes();
  virtual ::javax::swing::text::html::StyleSheet * getStyleSheet();
public:
  virtual void replace(jint, jint, JArray< ::javax::swing::text::View * > *);
private:
  void fetchLayoutInfo(::javax::swing::text::View *);
  ::javax::swing::text::AttributeSet * __attribute__((aligned(__alignof__( ::javax::swing::text::BoxView)))) attributes;
public: // actually package-private
  ::javax::swing::text::html::StyleSheet$BoxPainter * painter;
private:
  JArray< ::gnu::javax::swing::text::html::css::Length * > * cssSpans;
  ::java::util::HashMap * positionInfo;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_BlockView__
