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

#ifndef __gnu_xml_dom_html2_DomHTMLImageElement__
#define __gnu_xml_dom_html2_DomHTMLImageElement__

#pragma interface

#include <gnu/xml/dom/html2/DomHTMLElement.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace dom
      {
        namespace html2
        {
            class DomHTMLDocument;
            class DomHTMLImageElement;
        }
      }
    }
  }
}

class gnu::xml::dom::html2::DomHTMLImageElement : public ::gnu::xml::dom::html2::DomHTMLElement
{

public: // actually protected
  DomHTMLImageElement(::gnu::xml::dom::html2::DomHTMLDocument *, ::java::lang::String *, ::java::lang::String *);
public:
  virtual ::java::lang::String * getName();
  virtual void setName(::java::lang::String *);
  virtual ::java::lang::String * getAlign();
  virtual void setAlign(::java::lang::String *);
  virtual ::java::lang::String * getAlt();
  virtual void setAlt(::java::lang::String *);
  virtual ::java::lang::String * getBorder();
  virtual void setBorder(::java::lang::String *);
  virtual jint getHeight();
  virtual void setHeight(jint);
  virtual jint getHspace();
  virtual void setHspace(jint);
  virtual jboolean getIsMap();
  virtual void setIsMap(jboolean);
  virtual ::java::lang::String * getLongDesc();
  virtual void setLongDesc(::java::lang::String *);
  virtual ::java::lang::String * getSrc();
  virtual void setSrc(::java::lang::String *);
  virtual ::java::lang::String * getUseMap();
  virtual void setUseMap(::java::lang::String *);
  virtual jint getVspace();
  virtual void setVspace(jint);
  virtual jint getWidth();
  virtual void setWidth(jint);
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_html2_DomHTMLImageElement__
