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

#ifndef __gnu_xml_dom_html2_DomHTMLCollection__
#define __gnu_xml_dom_html2_DomHTMLCollection__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace dom
      {
        namespace html2
        {
            class DomHTMLCollection;
            class DomHTMLDocument;
        }
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class NamedNodeMap;
          class Node;
      }
    }
  }
}

class gnu::xml::dom::html2::DomHTMLCollection : public ::java::lang::Object
{

public: // actually package-private
  DomHTMLCollection(::gnu::xml::dom::html2::DomHTMLDocument *, ::org::w3c::dom::Node *);
  virtual void addNodeName(::java::lang::String *);
  virtual void addAttributeName(::java::lang::String *);
public:
  virtual jshort acceptNode(::org::w3c::dom::Node *);
private:
  jboolean acceptName(::java::lang::String *);
  jboolean acceptAttributes(::org::w3c::dom::NamedNodeMap *);
  ::org::w3c::dom::Node * getNamedItem(::org::w3c::dom::NamedNodeMap *, ::java::lang::String *);
public: // actually package-private
  virtual void evaluate();
public:
  virtual jint getLength();
  virtual void setLength(jint);
  virtual ::org::w3c::dom::Node * item(jint);
  virtual ::org::w3c::dom::Node * namedItem(::java::lang::String *);
public: // actually package-private
  ::gnu::xml::dom::html2::DomHTMLDocument * __attribute__((aligned(__alignof__( ::java::lang::Object)))) doc;
  ::org::w3c::dom::Node * root;
  ::java::util::List * nodeNames;
  ::java::util::List * attributeNames;
  ::java::util::List * results;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_html2_DomHTMLCollection__
