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

#ifndef __javax_swing_JLayeredPane__
#define __javax_swing_JLayeredPane__

#pragma interface

#include <javax/swing/JComponent.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Graphics;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class JComponent;
        class JLayeredPane;
    }
  }
}

class javax::swing::JLayeredPane : public ::javax::swing::JComponent
{

public:
  JLayeredPane();
  virtual jint getLayer(::java::awt::Component *);
  static jint getLayer(::javax::swing::JComponent *);
  static ::javax::swing::JLayeredPane * getLayeredPaneAbove(::java::awt::Component *);
  virtual jint highestLayer();
  virtual jint lowestLayer();
  virtual void moveToFront(::java::awt::Component *);
  virtual void moveToBack(::java::awt::Component *);
  virtual jint getPosition(::java::awt::Component *);
  virtual void setPosition(::java::awt::Component *, jint);
  virtual JArray< ::java::awt::Component * > * getComponentsInLayer(jint);
  virtual jint getComponentCountInLayer(jint);
public: // actually protected
  virtual ::java::util::Hashtable * getComponentToLayer();
public:
  virtual jint getIndexOf(::java::awt::Component *);
public: // actually protected
  virtual ::java::lang::Integer * getObjectForLayer(jint);
  virtual jint insertIndexForLayer(jint, jint);
private:
  jint insertIndexForLayer(::java::awt::Component *, jint, jint);
public:
  virtual void remove(jint);
  virtual void removeAll();
  virtual void setLayer(::java::awt::Component *, jint);
  virtual void setLayer(::java::awt::Component *, jint, jint);
public: // actually protected
  virtual void addImpl(::java::awt::Component *, ::java::lang::Object *, jint);
public:
  static void putLayer(::javax::swing::JComponent *, jint);
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual void paint(::java::awt::Graphics *);
  virtual jboolean isOptimizedDrawingEnabled();
private:
  static const jlong serialVersionUID = 5534920399324590459LL;
public:
  static ::java::lang::String * LAYER_PROPERTY;
  static ::java::lang::Integer * FRAME_CONTENT_LAYER;
  static ::java::lang::Integer * DEFAULT_LAYER;
  static ::java::lang::Integer * PALETTE_LAYER;
  static ::java::lang::Integer * MODAL_LAYER;
  static ::java::lang::Integer * POPUP_LAYER;
  static ::java::lang::Integer * DRAG_LAYER;
private:
  ::java::util::Hashtable * __attribute__((aligned(__alignof__( ::javax::swing::JComponent)))) componentToLayer;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JLayeredPane__
