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

#ifndef __javax_swing_undo_UndoManager__
#define __javax_swing_undo_UndoManager__

#pragma interface

#include <javax/swing/undo/CompoundEdit.h>
extern "Java"
{
  namespace javax
  {
    namespace swing
    {
      namespace event
      {
          class UndoableEditEvent;
      }
      namespace undo
      {
          class UndoManager;
          class UndoableEdit;
      }
    }
  }
}

class javax::swing::undo::UndoManager : public ::javax::swing::undo::CompoundEdit
{

public:
  UndoManager();
  virtual ::java::lang::String * toString();
  virtual void end();
  virtual jint getLimit();
  virtual void setLimit(jint);
  virtual void discardAllEdits();
public: // actually protected
  virtual void trimForLimit();
  virtual void trimEdits(jint, jint);
  virtual ::javax::swing::undo::UndoableEdit * editToBeUndone();
  virtual ::javax::swing::undo::UndoableEdit * editToBeRedone();
  virtual void undoTo(::javax::swing::undo::UndoableEdit *);
  virtual void redoTo(::javax::swing::undo::UndoableEdit *);
public:
  virtual void undoOrRedo();
  virtual jboolean canUndoOrRedo();
  virtual void undo();
  virtual jboolean canUndo();
  virtual void redo();
  virtual jboolean canRedo();
  virtual jboolean addEdit(::javax::swing::undo::UndoableEdit *);
  virtual ::java::lang::String * getUndoOrRedoPresentationName();
  virtual ::java::lang::String * getUndoPresentationName();
  virtual ::java::lang::String * getRedoPresentationName();
  virtual void undoableEditHappened(::javax::swing::event::UndoableEditEvent *);
public: // actually package-private
  static const jlong serialVersionUID = -2077529998244066750LL;
  jint __attribute__((aligned(__alignof__( ::javax::swing::undo::CompoundEdit)))) indexOfNextAdd;
  jint limit;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_undo_UndoManager__
