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

#ifndef __java_awt_BorderLayout__
#define __java_awt_BorderLayout__

#pragma interface

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

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

public:
  BorderLayout();
  BorderLayout(jint, jint);
  virtual jint getHgap();
  virtual void setHgap(jint);
  virtual jint getVgap();
  virtual void setVgap(jint);
  virtual void addLayoutComponent(::java::awt::Component *, ::java::lang::Object *);
  virtual void addLayoutComponent(::java::lang::String *, ::java::awt::Component *);
  virtual void removeLayoutComponent(::java::awt::Component *);
  virtual ::java::awt::Dimension * minimumLayoutSize(::java::awt::Container *);
  virtual ::java::awt::Dimension * preferredLayoutSize(::java::awt::Container *);
  virtual ::java::awt::Dimension * maximumLayoutSize(::java::awt::Container *);
  virtual jfloat getLayoutAlignmentX(::java::awt::Container *);
  virtual jfloat getLayoutAlignmentY(::java::awt::Container *);
  virtual void invalidateLayout(::java::awt::Container *);
  virtual void layoutContainer(::java::awt::Container *);
  virtual ::java::lang::String * toString();
private:
  ::java::awt::Dimension * calcCompSize(::java::awt::Component *, jint);
  ::java::awt::Dimension * calcSize(::java::awt::Container *, jint);
public:
  virtual ::java::awt::Component * getLayoutComponent(::java::lang::Object *);
  virtual ::java::awt::Component * getLayoutComponent(::java::awt::Container *, ::java::lang::Object *);
  virtual ::java::lang::Object * getConstraints(::java::awt::Component *);
  static ::java::lang::String * NORTH;
  static ::java::lang::String * SOUTH;
  static ::java::lang::String * EAST;
  static ::java::lang::String * WEST;
  static ::java::lang::String * CENTER;
  static ::java::lang::String * BEFORE_FIRST_LINE;
  static ::java::lang::String * AFTER_LAST_LINE;
  static ::java::lang::String * BEFORE_LINE_BEGINS;
  static ::java::lang::String * AFTER_LINE_ENDS;
  static ::java::lang::String * PAGE_START;
  static ::java::lang::String * PAGE_END;
  static ::java::lang::String * LINE_START;
  static ::java::lang::String * LINE_END;
private:
  static const jlong serialVersionUID = -8658291919501921765LL;
  ::java::awt::Component * __attribute__((aligned(__alignof__( ::java::lang::Object)))) north;
  ::java::awt::Component * south;
  ::java::awt::Component * east;
  ::java::awt::Component * west;
  ::java::awt::Component * center;
  ::java::awt::Component * firstLine;
  ::java::awt::Component * lastLine;
  ::java::awt::Component * firstItem;
  ::java::awt::Component * lastItem;
  jint hgap;
  jint vgap;
  static const jint MIN = 0;
  static const jint MAX = 1;
  static const jint PREF = 2;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_BorderLayout__
