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

#ifndef __javax_swing_text_html_parser_Parser__
#define __javax_swing_text_html_parser_Parser__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace swing
      {
        namespace text
        {
          namespace html
          {
            namespace parser
            {
              namespace support
              {
                  class Parser;
              }
            }
          }
        }
      }
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace text
      {
          class SimpleAttributeSet;
        namespace html
        {
          namespace parser
          {
              class DTD;
              class Element;
              class Parser;
              class TagElement;
          }
        }
      }
    }
  }
}

class javax::swing::text::html::parser::Parser : public ::java::lang::Object
{

public:
  Parser(::javax::swing::text::html::parser::DTD *);
  virtual void parse(::java::io::Reader *);
  virtual ::java::lang::String * parseDTDMarkup();
public: // actually protected
  virtual jboolean parseMarkupDeclarations(::java::lang::StringBuffer *);
  virtual ::javax::swing::text::SimpleAttributeSet * getAttributes();
  virtual jint getCurrentLine();
  virtual jint getCurrentPos();
  virtual void endTag(jboolean);
  virtual void error(::java::lang::String *);
  virtual void error(::java::lang::String *, ::java::lang::String *);
  virtual void error(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void error(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void flushAttributes();
  virtual void handleComment(JArray< jchar > *);
  virtual void handleEOFInComment();
  virtual void handleEmptyTag(::javax::swing::text::html::parser::TagElement *);
  virtual void handleEndTag(::javax::swing::text::html::parser::TagElement *);
  virtual void handleError(jint, ::java::lang::String *);
  virtual void handleStartTag(::javax::swing::text::html::parser::TagElement *);
  virtual void handleText(JArray< jchar > *);
  virtual void handleTitle(JArray< jchar > *);
  virtual ::javax::swing::text::html::parser::TagElement * makeTag(::javax::swing::text::html::parser::Element *);
  virtual ::javax::swing::text::html::parser::TagElement * makeTag(::javax::swing::text::html::parser::Element *, jboolean);
  virtual void markFirstTime(::javax::swing::text::html::parser::Element *);
  virtual void startTag(::javax::swing::text::html::parser::TagElement *);
  ::javax::swing::text::html::parser::DTD * __attribute__((aligned(__alignof__( ::java::lang::Object)))) dtd;
  jboolean strict;
public: // actually package-private
  ::gnu::javax::swing::text::html::parser::support::Parser * gnu;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_parser_Parser__
