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

#ifndef __java_applet_Applet__
#define __java_applet_Applet__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace applet
    {
        class Applet;
        class AppletContext;
        class AppletStub;
        class AudioClip;
    }
    namespace awt
    {
        class Dimension;
        class Image;
    }
    namespace net
    {
        class URL;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::applet::Applet : public ::java::awt::Panel
{

public:
  Applet();
  virtual void setStub(::java::applet::AppletStub *);
  virtual jboolean isActive();
  virtual ::java::net::URL * getDocumentBase();
  virtual ::java::net::URL * getCodeBase();
  virtual ::java::lang::String * getParameter(::java::lang::String *);
  virtual ::java::applet::AppletContext * getAppletContext();
  virtual void resize(jint, jint);
  virtual void resize(::java::awt::Dimension *);
  virtual void showStatus(::java::lang::String *);
  virtual ::java::awt::Image * getImage(::java::net::URL *);
  virtual ::java::awt::Image * getImage(::java::net::URL *, ::java::lang::String *);
  static ::java::applet::AudioClip * newAudioClip(::java::net::URL *);
  virtual ::java::applet::AudioClip * getAudioClip(::java::net::URL *);
  virtual ::java::applet::AudioClip * getAudioClip(::java::net::URL *, ::java::lang::String *);
  virtual ::java::lang::String * getAppletInfo();
  virtual ::java::util::Locale * getLocale();
  virtual JArray< JArray< ::java::lang::String * > * > * getParameterInfo();
  virtual void play(::java::net::URL *);
  virtual void play(::java::net::URL *, ::java::lang::String *);
  virtual void init();
  virtual void start();
  virtual void stop();
  virtual void destroy();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
private:
  void readObject(::java::io::ObjectInputStream *);
  static const jlong serialVersionUID = -5836846270535785031LL;
  ::java::applet::AppletStub * __attribute__((aligned(__alignof__( ::java::awt::Panel)))) stub;
  jint width;
  jint height;
  ::javax::accessibility::AccessibleContext * accessibleContext;
public:
  static ::java::lang::Class class$;
};

#endif // __java_applet_Applet__
