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

#ifndef __java_awt_CardLayout__
#define __java_awt_CardLayout__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class CardLayout;
        class Component;
        class Container;
        class Dimension;
    }
  }
}

class java::awt::CardLayout : public ::java::lang::Object
{

public:
  CardLayout();
  CardLayout(jint, jint);
  virtual void addLayoutComponent(::java::awt::Component *, ::java::lang::Object *);
  virtual void addLayoutComponent(::java::lang::String *, ::java::awt::Component *);
  virtual void first(::java::awt::Container *);
  virtual jint getHgap();
  virtual jfloat getLayoutAlignmentX(::java::awt::Container *);
  virtual jfloat getLayoutAlignmentY(::java::awt::Container *);
  virtual jint getVgap();
  virtual void invalidateLayout(::java::awt::Container *);
  virtual void last(::java::awt::Container *);
  virtual void layoutContainer(::java::awt::Container *);
  virtual ::java::awt::Dimension * maximumLayoutSize(::java::awt::Container *);
  virtual ::java::awt::Dimension * minimumLayoutSize(::java::awt::Container *);
  virtual void next(::java::awt::Container *);
  virtual ::java::awt::Dimension * preferredLayoutSize(::java::awt::Container *);
  virtual void previous(::java::awt::Container *);
  virtual void removeLayoutComponent(::java::awt::Component *);
  virtual void setHgap(jint);
  virtual void setVgap(jint);
  virtual void show(::java::awt::Container *, ::java::lang::String *);
  virtual ::java::lang::String * toString();
private:
  void gotoComponent(::java::awt::Container *, jint);
  ::java::awt::Dimension * getSize(::java::awt::Container *, jint);
  static const jlong serialVersionUID = -4328196481005934313LL;
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) hgap;
  jint vgap;
  ::java::util::Hashtable * tab;
  static const jint FIRST = 0;
  static const jint LAST = 1;
  static const jint NEXT = 2;
  static const jint PREV = 3;
  static const jint MIN = 0;
  static const jint MAX = 1;
  static const jint PREF = 2;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_CardLayout__
