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

#ifndef __javax_swing_ImageIcon__
#define __javax_swing_ImageIcon__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Graphics;
        class Image;
        class MediaTracker;
      namespace image
      {
          class ImageObserver;
      }
    }
    namespace net
    {
        class URL;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class ImageIcon;
    }
  }
}

class javax::swing::ImageIcon : public ::java::lang::Object
{

public:
  ImageIcon();
  ImageIcon(::java::lang::String *);
  ImageIcon(::java::lang::String *, ::java::lang::String *);
  ImageIcon(JArray< jbyte > *);
  ImageIcon(JArray< jbyte > *, ::java::lang::String *);
  ImageIcon(::java::net::URL *);
  ImageIcon(::java::net::URL *, ::java::lang::String *);
  ImageIcon(::java::awt::Image *);
  ImageIcon(::java::awt::Image *, ::java::lang::String *);
  virtual ::java::awt::image::ImageObserver * getImageObserver();
  virtual void setImageObserver(::java::awt::image::ImageObserver *);
  virtual ::java::awt::Image * getImage();
  virtual void setImage(::java::awt::Image *);
  virtual ::java::lang::String * getDescription();
  virtual void setDescription(::java::lang::String *);
  virtual jint getIconHeight();
  virtual jint getIconWidth();
  virtual void paintIcon(::java::awt::Component *, ::java::awt::Graphics *, jint, jint);
public: // actually protected
  virtual void loadImage(::java::awt::Image *);
public:
  virtual jint getImageLoadStatus();
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
private:
  static const jlong serialVersionUID = 532615968316031794LL;
public: // actually protected
  static ::java::awt::Component * component;
  static ::java::awt::MediaTracker * tracker;
private:
  static jint id;
public: // actually package-private
  ::java::awt::Image * __attribute__((aligned(__alignof__( ::java::lang::Object)))) image;
  ::java::lang::String * description;
  ::java::awt::image::ImageObserver * observer;
private:
  jint loadStatus;
  ::javax::accessibility::AccessibleContext * accessibleContext;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_ImageIcon__
