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

#ifndef __javax_swing_text_html_StyleSheet__
#define __javax_swing_text_html_StyleSheet__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Font;
    }
    namespace net
    {
        class URL;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace text
      {
          class AttributeSet;
          class Element;
          class MutableAttributeSet;
          class Style;
          class StyleContext$SmallAttributeSet;
          class View;
        namespace html
        {
            class CSS$Attribute;
            class HTML$Tag;
            class StyleSheet;
            class StyleSheet$BoxPainter;
            class StyleSheet$ListPainter;
        }
      }
    }
  }
}

class javax::swing::text::html::StyleSheet : public ::javax::swing::text::StyleContext
{

public:
  StyleSheet();
  virtual ::javax::swing::text::Style * getRule(::javax::swing::text::html::HTML$Tag *, ::javax::swing::text::Element *);
private:
  ::javax::swing::text::Style * getResolvedStyle(::java::lang::String *, ::java::util::List *, ::javax::swing::text::html::HTML$Tag *);
  ::javax::swing::text::Style * resolveStyle(::java::lang::String *, ::java::util::List *, ::javax::swing::text::html::HTML$Tag *);
  ::javax::swing::text::Style * resolveStyle(::java::lang::String *, JArray< ::java::lang::String * > *, JArray< ::java::util::Map * > *);
public:
  virtual ::javax::swing::text::Style * getRule(::java::lang::String *);
  virtual void addRule(::java::lang::String *);
  virtual ::javax::swing::text::AttributeSet * getDeclaration(::java::lang::String *);
  virtual void loadRules(::java::io::Reader *, ::java::net::URL *);
  virtual ::javax::swing::text::AttributeSet * getViewAttributes(::javax::swing::text::View *);
  virtual void removeStyle(::java::lang::String *);
  virtual void addStyleSheet(::javax::swing::text::html::StyleSheet *);
  virtual void removeStyleSheet(::javax::swing::text::html::StyleSheet *);
  virtual JArray< ::javax::swing::text::html::StyleSheet * > * getStyleSheets();
  virtual void importStyleSheet(::java::net::URL *);
  virtual void setBase(::java::net::URL *);
  virtual ::java::net::URL * getBase();
  virtual void addCSSAttribute(::javax::swing::text::MutableAttributeSet *, ::javax::swing::text::html::CSS$Attribute *, ::java::lang::String *);
  virtual jboolean addCSSAttributeFromHTML(::javax::swing::text::MutableAttributeSet *, ::javax::swing::text::html::CSS$Attribute *, ::java::lang::String *);
  virtual ::javax::swing::text::AttributeSet * translateHTMLToCSS(::javax::swing::text::AttributeSet *);
private:
  ::javax::swing::text::AttributeSet * translateBorder(::javax::swing::text::AttributeSet *, ::java::lang::Object *);
public:
  virtual ::javax::swing::text::AttributeSet * addAttribute(::javax::swing::text::AttributeSet *, ::java::lang::Object *, ::java::lang::Object *);
  virtual ::javax::swing::text::AttributeSet * addAttributes(::javax::swing::text::AttributeSet *, ::javax::swing::text::AttributeSet *);
  virtual ::javax::swing::text::AttributeSet * removeAttribute(::javax::swing::text::AttributeSet *, ::java::lang::Object *);
  virtual ::javax::swing::text::AttributeSet * removeAttributes(::javax::swing::text::AttributeSet *, ::javax::swing::text::AttributeSet *);
  virtual ::javax::swing::text::AttributeSet * removeAttributes(::javax::swing::text::AttributeSet *, ::java::util::Enumeration *);
public: // actually protected
  virtual ::javax::swing::text::StyleContext$SmallAttributeSet * createSmallAttributeSet(::javax::swing::text::AttributeSet *);
  virtual ::javax::swing::text::MutableAttributeSet * createLargeAttributeSet(::javax::swing::text::AttributeSet *);
public:
  virtual ::java::awt::Font * getFont(::javax::swing::text::AttributeSet *);
public: // actually package-private
  virtual jfloat getEMBase(::javax::swing::text::AttributeSet *);
  virtual jfloat getEXBase(::javax::swing::text::AttributeSet *);
private:
  jint getFontSize(::javax::swing::text::AttributeSet *);
public:
  virtual ::java::awt::Color * getForeground(::javax::swing::text::AttributeSet *);
  virtual ::java::awt::Color * getBackground(::javax::swing::text::AttributeSet *);
  virtual ::javax::swing::text::html::StyleSheet$BoxPainter * getBoxPainter(::javax::swing::text::AttributeSet *);
  virtual ::javax::swing::text::html::StyleSheet$ListPainter * getListPainter(::javax::swing::text::AttributeSet *);
  virtual void setBaseFontSize(jint);
  virtual void setBaseFontSize(::java::lang::String *);
  static jint getIndexOfSize(jfloat);
  virtual jfloat getPointSize(jint);
  virtual jfloat getPointSize(::java::lang::String *);
  virtual ::java::awt::Color * stringToColor(::java::lang::String *);
private:
  ::java::util::Map * attributeSetToMap(::javax::swing::text::AttributeSet *);
public: // actually package-private
  ::java::net::URL * __attribute__((aligned(__alignof__( ::javax::swing::text::StyleContext)))) base;
  jint baseFontSize;
private:
  ::java::util::ArrayList * linked;
public: // actually package-private
  ::java::util::ArrayList * css;
private:
  ::java::util::HashMap * resolvedStyles;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_StyleSheet__
