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

#ifndef __java_awt_Container__
#define __java_awt_Container__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTEvent;
        class Component;
        class ComponentOrientation;
        class Container;
        class Container$GfxVisitor;
        class Dimension;
        class Event;
        class FocusTraversalPolicy;
        class Font;
        class Graphics;
        class Insets;
        class LayoutManager;
        class Point;
      namespace event
      {
          class ContainerEvent;
          class ContainerListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
}

class java::awt::Container : public ::java::awt::Component
{

public:
  Container();
  virtual jint getComponentCount();
  virtual jint countComponents();
  virtual ::java::awt::Component * getComponent(jint);
  virtual JArray< ::java::awt::Component * > * getComponents();
  virtual ::java::awt::Insets * getInsets();
  virtual ::java::awt::Insets * insets();
  virtual ::java::awt::Component * add(::java::awt::Component *);
  virtual ::java::awt::Component * add(::java::lang::String *, ::java::awt::Component *);
  virtual ::java::awt::Component * add(::java::awt::Component *, jint);
  virtual void add(::java::awt::Component *, ::java::lang::Object *);
  virtual void add(::java::awt::Component *, ::java::lang::Object *, jint);
public: // actually protected
  virtual void addImpl(::java::awt::Component *, ::java::lang::Object *, jint);
public:
  virtual void remove(jint);
  virtual void remove(::java::awt::Component *);
  virtual void removeAll();
  virtual ::java::awt::LayoutManager * getLayout();
  virtual void setLayout(::java::awt::LayoutManager *);
  virtual void doLayout();
  virtual void layout();
  virtual void invalidate();
  virtual void validate();
private:
  void invalidateTree();
public: // actually protected
  virtual void validateTree();
public:
  virtual void setFont(::java::awt::Font *);
  virtual ::java::awt::Dimension * getPreferredSize();
  virtual ::java::awt::Dimension * preferredSize();
  virtual ::java::awt::Dimension * getMinimumSize();
  virtual ::java::awt::Dimension * minimumSize();
  virtual ::java::awt::Dimension * getMaximumSize();
  virtual jfloat getAlignmentX();
  virtual jfloat getAlignmentY();
  virtual void paint(::java::awt::Graphics *);
  virtual void update(::java::awt::Graphics *);
  virtual void print(::java::awt::Graphics *);
  virtual void paintComponents(::java::awt::Graphics *);
  virtual void printComponents(::java::awt::Graphics *);
  virtual void addContainerListener(::java::awt::event::ContainerListener *);
  virtual void removeContainerListener(::java::awt::event::ContainerListener *);
  virtual JArray< ::java::awt::event::ContainerListener * > * getContainerListeners();
  virtual JArray< ::java::util::EventListener * > * getListeners(::java::lang::Class *);
public: // actually protected
  virtual void processEvent(::java::awt::AWTEvent *);
  virtual void processContainerEvent(::java::awt::event::ContainerEvent *);
public:
  virtual void deliverEvent(::java::awt::Event *);
  virtual ::java::awt::Component * getComponentAt(jint, jint);
  virtual ::java::awt::Point * getMousePosition(jboolean);
public: // actually package-private
  virtual jboolean mouseOverComponent(::java::awt::Component *, jboolean);
public:
  virtual ::java::awt::Component * locate(jint, jint);
  virtual ::java::awt::Component * getComponentAt(::java::awt::Point *);
  virtual ::java::awt::Component * findComponentAt(jint, jint);
  virtual ::java::awt::Component * findComponentAt(::java::awt::Point *);
  virtual void addNotify();
  virtual void removeNotify();
  virtual jboolean isAncestorOf(::java::awt::Component *);
public: // actually protected
  virtual ::java::lang::String * paramString();
public:
  virtual void list(::java::io::PrintStream *, jint);
  virtual void list(::java::io::PrintWriter *, jint);
  virtual void setFocusTraversalKeys(jint, ::java::util::Set *);
  virtual ::java::util::Set * getFocusTraversalKeys(jint);
  virtual jboolean areFocusTraversalKeysSet(jint);
  virtual jboolean isFocusCycleRoot(::java::awt::Container *);
  virtual void setFocusTraversalPolicy(::java::awt::FocusTraversalPolicy *);
  virtual ::java::awt::FocusTraversalPolicy * getFocusTraversalPolicy();
  virtual jboolean isFocusTraversalPolicySet();
  virtual void setFocusCycleRoot(jboolean);
  virtual jboolean isFocusTraversalPolicyProvider();
  virtual void setFocusTraversalPolicyProvider(jboolean);
  virtual jboolean isFocusCycleRoot();
  virtual void transferFocusDownCycle();
  virtual void applyComponentOrientation(::java::awt::ComponentOrientation *);
  virtual void addPropertyChangeListener(::java::beans::PropertyChangeListener *);
  virtual void addPropertyChangeListener(::java::lang::String *, ::java::beans::PropertyChangeListener *);
  virtual void setComponentZOrder(::java::awt::Component *, jint);
  virtual jint getComponentZOrder(::java::awt::Component *);
private:
  void visitChildren(::java::awt::Graphics *, ::java::awt::Container$GfxVisitor *, jboolean);
  void visitChild(::java::awt::Graphics *, ::java::awt::Container$GfxVisitor *, ::java::awt::Component *);
public: // actually package-private
  virtual void dispatchEventImpl(::java::awt::AWTEvent *);
  virtual void dispatchNoLightweight(::java::awt::AWTEvent *);
  virtual jboolean eventTypeEnabled(jint);
  virtual ::java::awt::Component * findNextFocusComponent(::java::awt::Component *);
  virtual void fireHierarchyEvent(jint, ::java::awt::Component *, ::java::awt::Container *, jlong);
  virtual void updateHierarchyListenerCount(jlong, jint);
  virtual void notifyReshape(jboolean, jboolean);
private:
  void addNotifyContainerChildren();
  void readObject(::java::io::ObjectInputStream *);
  void writeObject(::java::io::ObjectOutputStream *);
  static const jlong serialVersionUID = 4613797578919906343LL;
public: // actually package-private
  jint __attribute__((aligned(__alignof__( ::java::awt::Component)))) ncomponents;
  JArray< ::java::awt::Component * > * component;
  ::java::awt::LayoutManager * layoutMgr;
  jboolean focusCycleRoot;
private:
  jboolean focusTraversalPolicyProvider;
public: // actually package-private
  jint containerSerializedDataVersion;
  ::java::awt::event::ContainerListener * containerListener;
private:
  ::java::awt::FocusTraversalPolicy * focusTraversalPolicy;
public: // actually package-private
  JArray< ::java::util::Set * > * focusTraversalKeys;
  static jboolean $assertionsDisabled;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_Container__
