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

#ifndef __java_awt_AWTKeyStroke__
#define __java_awt_AWTKeyStroke__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTKeyStroke;
      namespace event
      {
          class KeyEvent;
      }
    }
  }
}

class java::awt::AWTKeyStroke : public ::java::lang::Object
{

public: // actually protected
  AWTKeyStroke();
  AWTKeyStroke(jchar, jint, jint, jboolean);
  static void registerSubclass(::java::lang::Class *);
public:
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(jchar);
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(::java::lang::Character *, jint);
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(jint, jint, jboolean);
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(jint, jint);
  static ::java::awt::AWTKeyStroke * getAWTKeyStrokeForEvent(::java::awt::event::KeyEvent *);
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(::java::lang::String *);
  virtual jchar getKeyChar();
  virtual jint getKeyCode();
  virtual jint getModifiers();
  virtual jboolean isOnKeyRelease();
  virtual jint getKeyEventType();
  virtual jint hashCode();
  virtual jboolean equals(::java::lang::Object *);
  virtual ::java::lang::String * toString();
public: // actually protected
  virtual ::java::lang::Object * readResolve();
private:
  static ::java::awt::AWTKeyStroke * getAWTKeyStroke(jchar, jint, jint, jboolean);
  static jint extend(jint);
  static const jlong serialVersionUID = -6430539691155161871LL;
  static const jint MODIFIERS_MASK = 16367;
  static ::java::util::LinkedHashMap * cache;
  static ::java::awt::AWTKeyStroke * recent;
  static ::java::lang::reflect::Constructor * ctor;
public: // actually package-private
  static ::java::util::HashMap * vktable;
private:
  jchar __attribute__((aligned(__alignof__( ::java::lang::Object)))) keyChar;
public: // actually package-private
  jint keyCode;
private:
  jint modifiers;
  jboolean onKeyRelease;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_AWTKeyStroke__
