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

#ifndef __javax_swing_text_html_HTMLWriter__
#define __javax_swing_text_html_HTMLWriter__

#pragma interface

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

extern "Java"
{
  namespace javax
  {
    namespace swing
    {
      namespace text
      {
          class AttributeSet;
          class Element;
        namespace html
        {
            class HTML$Tag;
            class HTMLDocument;
            class HTMLWriter;
            class Option;
        }
      }
    }
  }
}

class javax::swing::text::html::HTMLWriter : public ::javax::swing::text::AbstractWriter
{

public:
  HTMLWriter(::java::io::Writer *, ::javax::swing::text::html::HTMLDocument *);
  HTMLWriter(::java::io::Writer *, ::javax::swing::text::html::HTMLDocument *, jint, jint);
  virtual void write();
public: // actually protected
  virtual void writeAttributes(::javax::swing::text::AttributeSet *);
  virtual void emptyTag(::javax::swing::text::Element *);
  virtual jboolean isBlockTag(::javax::swing::text::AttributeSet *);
  virtual void startTag(::javax::swing::text::Element *);
  virtual void textAreaContent(::javax::swing::text::AttributeSet *);
  virtual void text(::javax::swing::text::Element *);
  virtual void selectContent(::javax::swing::text::AttributeSet *);
  virtual void writeOption(::javax::swing::text::html::Option *);
  virtual void endTag(::javax::swing::text::Element *);
  virtual void comment(::javax::swing::text::Element *);
  virtual jboolean synthesizedElement(::javax::swing::text::Element *);
  virtual jboolean matchNameAttribute(::javax::swing::text::AttributeSet *, ::javax::swing::text::html::HTML$Tag *);
  virtual void writeEmbeddedTags(::javax::swing::text::AttributeSet *);
  virtual void closeOutUnwantedEmbeddedTags(::javax::swing::text::AttributeSet *);
  virtual void writeLineSeparator();
  virtual void output(JArray< jchar > *, jint, jint);
private:
  void traverse(::javax::swing::text::Element *);
  void traverseHtmlFragment(::javax::swing::text::Element *);
  void writeRaw(::java::lang::String *);
  void writeContent(::java::lang::String *);
  void writeAllAttributes(::javax::swing::text::AttributeSet *);
  jboolean hasHtmlEntity(::java::lang::String *);
  jboolean isCharHtmlEntity(jchar);
  ::java::lang::String * escapeCharHtmlEntity(jchar);
  ::java::io::Writer * __attribute__((aligned(__alignof__( ::javax::swing::text::AbstractWriter)))) outWriter;
  ::javax::swing::text::html::HTMLDocument * htmlDoc;
  ::java::util::HashSet * openEmbededTagHashSet;
  ::java::lang::String * new_line_str;
  JArray< jchar > * html_entity_char_arr;
  JArray< ::java::lang::String * > * html_entity_escape_str_arr;
  jint doc_pos;
  jint doc_len;
  jint doc_offset_remaining;
  jint doc_len_remaining;
  ::java::util::HashSet * htmlFragmentParentHashSet;
  ::javax::swing::text::Element * startElem;
  ::javax::swing::text::Element * endElem;
  jboolean fg_pass_start_elem;
  jboolean fg_pass_end_elem;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_HTMLWriter__
