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

#ifndef __javax_swing_text_html_parser_Element__
#define __javax_swing_text_html_parser_Element__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace swing
      {
        namespace text
        {
          namespace html
          {
            namespace parser
            {
              namespace support
              {
                  class gnuStringIntMapper;
              }
            }
          }
        }
      }
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace text
      {
        namespace html
        {
          namespace parser
          {
              class AttributeList;
              class ContentModel;
              class Element;
          }
        }
      }
    }
  }
}

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

public: // actually package-private
  Element();
public:
  static jint name2type(::java::lang::String *);
  ::javax::swing::text::html::parser::AttributeList * getAttribute(::java::lang::String *);
  ::javax::swing::text::html::parser::AttributeList * getAttributeByValue(::java::lang::String *);
  ::javax::swing::text::html::parser::AttributeList * getAttributes();
  ::javax::swing::text::html::parser::ContentModel * getContent();
  jboolean isEmpty();
  jint getIndex();
  ::java::lang::String * getName();
  jint getType();
  jboolean omitEnd();
  jboolean omitStart();
  ::java::lang::String * toString();
public: // actually package-private
  static ::gnu::javax::swing::text::html::parser::support::gnuStringIntMapper * mapper;
private:
  static const jlong serialVersionUID = -6717939384601675586LL;
public:
  ::javax::swing::text::html::parser::AttributeList * __attribute__((aligned(__alignof__( ::java::lang::Object)))) atts;
  ::java::util::BitSet * exclusions;
  ::java::util::BitSet * inclusions;
  ::javax::swing::text::html::parser::ContentModel * content;
  ::java::lang::Object * data;
  ::java::lang::String * name;
  jboolean oEnd;
  jboolean oStart;
  jint index;
  jint type;
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_parser_Element__
