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

#ifndef __javax_swing_text_DefaultCaret__
#define __javax_swing_text_DefaultCaret__

#pragma interface

#include <java/awt/Rectangle.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Point;
        class Rectangle;
      namespace event
      {
          class FocusEvent;
          class MouseEvent;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class Timer;
      namespace event
      {
          class ChangeEvent;
          class ChangeListener;
          class DocumentListener;
          class EventListenerList;
      }
      namespace text
      {
          class DefaultCaret;
          class DefaultCaret$BlinkTimerListener;
          class Highlighter$HighlightPainter;
          class JTextComponent;
          class NavigationFilter$FilterBypass;
      }
    }
  }
}

class javax::swing::text::DefaultCaret : public ::java::awt::Rectangle
{

public:
  DefaultCaret();
private:
  ::javax::swing::text::NavigationFilter$FilterBypass * getBypass();
public:
  virtual void setUpdatePolicy(jint);
  virtual jint getUpdatePolicy();
  virtual void mouseDragged(::java::awt::event::MouseEvent *);
  virtual void mouseMoved(::java::awt::event::MouseEvent *);
  virtual void mouseClicked(::java::awt::event::MouseEvent *);
  virtual void mouseEntered(::java::awt::event::MouseEvent *);
  virtual void mouseExited(::java::awt::event::MouseEvent *);
  virtual void mousePressed(::java::awt::event::MouseEvent *);
  virtual void mouseReleased(::java::awt::event::MouseEvent *);
  virtual void focusGained(::java::awt::event::FocusEvent *);
  virtual void focusLost(::java::awt::event::FocusEvent *);
private:
  void updateTimerStatus();
public: // actually protected
  virtual void moveCaret(::java::awt::event::MouseEvent *);
  virtual void positionCaret(::java::awt::event::MouseEvent *);
public:
  virtual void deinstall(::javax::swing::text::JTextComponent *);
  virtual void install(::javax::swing::text::JTextComponent *);
  virtual void setMagicCaretPosition(::java::awt::Point *);
  virtual ::java::awt::Point * getMagicCaretPosition();
  virtual jint getMark();
private:
  void clearHighlight();
  void handleHighlight();
public:
  virtual void setSelectionVisible(jboolean);
  virtual jboolean isSelectionVisible();
public: // actually protected
  virtual void repaint();
public:
  virtual void paint(::java::awt::Graphics *);
  virtual JArray< ::java::util::EventListener * > * getListeners(::java::lang::Class *);
  virtual void addChangeListener(::javax::swing::event::ChangeListener *);
  virtual void removeChangeListener(::javax::swing::event::ChangeListener *);
  virtual JArray< ::javax::swing::event::ChangeListener * > * getChangeListeners();
public: // actually protected
  virtual void fireStateChanged();
  virtual ::javax::swing::text::JTextComponent * getComponent();
public:
  virtual jint getBlinkRate();
  virtual void setBlinkRate(jint);
  virtual jint getDot();
  virtual void moveDot(jint);
public: // actually package-private
  virtual void moveDotImpl(jint);
public:
  virtual void setDot(jint);
public: // actually package-private
  virtual void setDotImpl(jint);
  virtual void appear();
public:
  virtual jboolean isActive();
  virtual jboolean isVisible();
  virtual void setVisible(jboolean);
public: // actually protected
  virtual ::javax::swing::text::Highlighter$HighlightPainter * getSelectionPainter();
  virtual void damage(::java::awt::Rectangle *);
  virtual void adjustVisibility(::java::awt::Rectangle *);
private:
  void initBlinkTimer();
public: // actually package-private
  static ::javax::swing::text::JTextComponent * componentWithSelection;
private:
  static const jlong serialVersionUID = 4325555698756477346LL;
public:
  static const jint ALWAYS_UPDATE = 2;
  static const jint NEVER_UPDATE = 1;
  static const jint UPDATE_WHEN_ON_EDT = 0;
public: // actually package-private
  jint __attribute__((aligned(__alignof__( ::java::awt::Rectangle)))) policy;
public: // actually protected
  ::javax::swing::event::ChangeEvent * changeEvent;
  ::javax::swing::event::EventListenerList * listenerList;
public: // actually package-private
  ::javax::swing::event::DocumentListener * documentListener;
  ::java::beans::PropertyChangeListener * propertyChangeListener;
  ::javax::swing::text::JTextComponent * textComponent;
private:
  jboolean selectionVisible;
  jint blinkRate;
  jint dot;
  jint mark;
  ::java::awt::Point * magicCaretPosition;
public: // actually package-private
  jboolean visible;
  jboolean active;
private:
  ::java::lang::Object * highlightEntry;
  ::javax::swing::Timer * blinkTimer;
  ::javax::swing::text::DefaultCaret$BlinkTimerListener * blinkListener;
public: // actually package-private
  ::javax::swing::text::NavigationFilter$FilterBypass * bypass;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_text_DefaultCaret__
