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

#ifndef __gnu_xml_dom_html2_DomHTMLTextAreaElement__
#define __gnu_xml_dom_html2_DomHTMLTextAreaElement__

#pragma interface

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

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

public: // actually protected
  DomHTMLTextAreaElement(::gnu::xml::dom::html2::DomHTMLDocument *, ::java::lang::String *, ::java::lang::String *);
public:
  virtual ::java::lang::String * getDefaultValue();
  virtual void setDefaultValue(::java::lang::String *);
  virtual ::org::w3c::dom::html2::HTMLFormElement * getForm();
  virtual ::java::lang::String * getAccessKey();
  virtual void setAccessKey(::java::lang::String *);
  virtual jint getCols();
  virtual void setCols(jint);
  virtual jboolean getDisabled();
  virtual void setDisabled(jboolean);
  virtual ::java::lang::String * getName();
  virtual void setName(::java::lang::String *);
  virtual jboolean getReadOnly();
  virtual void setReadOnly(jboolean);
  virtual jint getRows();
  virtual void setRows(jint);
  virtual jint getTabIndex();
  virtual void setTabIndex(jint);
  virtual ::java::lang::String * getType();
  virtual ::java::lang::String * getValue();
  virtual void setValue(::java::lang::String *);
  virtual void blur();
  virtual void focus();
  virtual void select();
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::gnu::xml::dom::html2::DomHTMLElement)))) value;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_html2_DomHTMLTextAreaElement__
