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

#ifndef __javax_swing_text_html_HTMLEditorKit__
#define __javax_swing_text_html_HTMLEditorKit__

#pragma interface

#include <javax/swing/text/StyledEditorKit.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Cursor;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class Action;
        class JEditorPane;
      namespace text
      {
          class Document;
          class Element;
          class MutableAttributeSet;
          class ViewFactory;
        namespace html
        {
            class HTML$Tag;
            class HTMLDocument;
            class HTMLEditorKit;
            class HTMLEditorKit$HTMLFactory;
            class HTMLEditorKit$LinkController;
            class HTMLEditorKit$Parser;
            class StyleSheet;
        }
      }
    }
  }
}

class javax::swing::text::html::HTMLEditorKit : public ::javax::swing::text::StyledEditorKit
{

public:
  HTMLEditorKit();
  virtual ::javax::swing::text::ViewFactory * getViewFactory();
  virtual ::javax::swing::text::Document * createDefaultDocument();
public: // actually protected
  virtual ::javax::swing::text::html::HTMLEditorKit$Parser * getParser();
public:
  virtual void insertHTML(::javax::swing::text::html::HTMLDocument *, jint, ::java::lang::String *, jint, jint, ::javax::swing::text::html::HTML$Tag *);
  virtual void read(::java::io::Reader *, ::javax::swing::text::Document *, jint);
  virtual void write(::java::io::Writer *, ::javax::swing::text::Document *, jint, jint);
  virtual ::java::lang::String * getContentType();
  virtual ::java::lang::Object * clone();
public: // actually protected
  virtual void createInputAttributes(::javax::swing::text::Element *, ::javax::swing::text::MutableAttributeSet *);
public:
  virtual void install(::javax::swing::JEditorPane *);
  virtual void deinstall(::javax::swing::JEditorPane *);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual JArray< ::javax::swing::Action * > * getActions();
  virtual ::java::awt::Cursor * getDefaultCursor();
  virtual ::java::awt::Cursor * getLinkCursor();
  virtual void setLinkCursor(::java::awt::Cursor *);
  virtual void setDefaultCursor(::java::awt::Cursor *);
  virtual ::javax::swing::text::MutableAttributeSet * getInputAttributes();
  virtual ::javax::swing::text::html::StyleSheet * getStyleSheet();
  virtual void setStyleSheet(::javax::swing::text::html::StyleSheet *);
  virtual jboolean isAutoFormSubmission();
  virtual void setAutoFormSubmission(jboolean);
private:
  static const jlong serialVersionUID = 8751997116710384592LL;
public:
  static ::java::lang::String * DEFAULT_CSS;
  static ::java::lang::String * BOLD_ACTION;
  static ::java::lang::String * ITALIC_ACTION;
  static ::java::lang::String * COLOR_ACTION;
  static ::java::lang::String * FONT_CHANGE_BIGGER;
  static ::java::lang::String * FONT_CHANGE_SMALLER;
  static ::java::lang::String * IMG_ALIGN_BOTTOM;
  static ::java::lang::String * IMG_ALIGN_MIDDLE;
  static ::java::lang::String * IMG_ALIGN_TOP;
  static ::java::lang::String * IMG_BORDER;
  static ::java::lang::String * LOGICAL_STYLE_ACTION;
  static ::java::lang::String * PARA_INDENT_LEFT;
  static ::java::lang::String * PARA_INDENT_RIGHT;
private:
  static JArray< ::javax::swing::Action * > * defaultActions;
  ::javax::swing::text::html::StyleSheet * __attribute__((aligned(__alignof__( ::javax::swing::text::StyledEditorKit)))) styleSheet;
public: // actually package-private
  ::javax::swing::text::html::HTMLEditorKit$HTMLFactory * viewFactory;
  ::java::awt::Cursor * linkCursor;
  ::java::awt::Cursor * defaultCursor;
  ::javax::swing::text::html::HTMLEditorKit$Parser * parser;
private:
  ::javax::swing::text::html::HTMLEditorKit$LinkController * linkController;
public: // actually package-private
  ::java::lang::String * contentType;
  ::javax::swing::text::MutableAttributeSet * inputAttributes;
  ::javax::swing::JEditorPane * editorPane;
private:
  jboolean autoFormSubmission;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_html_HTMLEditorKit__
