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

#ifndef __java_awt_event_WindowEvent__
#define __java_awt_event_WindowEvent__

#pragma interface

#include <java/awt/event/ComponentEvent.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Window;
      namespace event
      {
          class WindowEvent;
      }
    }
  }
}

class java::awt::event::WindowEvent : public ::java::awt::event::ComponentEvent
{

public:
  WindowEvent(::java::awt::Window *, jint, ::java::awt::Window *, jint, jint);
  WindowEvent(::java::awt::Window *, jint, ::java::awt::Window *);
  WindowEvent(::java::awt::Window *, jint, jint, jint);
  WindowEvent(::java::awt::Window *, jint);
  virtual ::java::awt::Window * getWindow();
  virtual ::java::awt::Window * getOppositeWindow();
  virtual jint getOldState();
  virtual jint getNewState();
  virtual ::java::lang::String * paramString();
private:
  static const jlong serialVersionUID = -1567959133147912127LL;
public:
  static const jint WINDOW_FIRST = 200;
  static const jint WINDOW_OPENED = 200;
  static const jint WINDOW_CLOSING = 201;
  static const jint WINDOW_CLOSED = 202;
  static const jint WINDOW_ICONIFIED = 203;
  static const jint WINDOW_DEICONIFIED = 204;
  static const jint WINDOW_ACTIVATED = 205;
  static const jint WINDOW_DEACTIVATED = 206;
  static const jint WINDOW_GAINED_FOCUS = 207;
  static const jint WINDOW_LOST_FOCUS = 208;
  static const jint WINDOW_STATE_CHANGED = 209;
  static const jint WINDOW_LAST = 209;
private:
  ::java::awt::Window * __attribute__((aligned(__alignof__( ::java::awt::event::ComponentEvent)))) opposite;
  jint oldState;
  jint newState;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_event_WindowEvent__
