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

#ifndef __javax_swing_plaf_basic_BasicOptionPaneUI$ButtonAreaLayout__
#define __javax_swing_plaf_basic_BasicOptionPaneUI$ButtonAreaLayout__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Component;
        class Container;
        class Dimension;
    }
  }
  namespace javax
  {
    namespace swing
    {
      namespace plaf
      {
        namespace basic
        {
            class BasicOptionPaneUI$ButtonAreaLayout;
        }
      }
    }
  }
}

class javax::swing::plaf::basic::BasicOptionPaneUI$ButtonAreaLayout : public ::java::lang::Object
{

public:
  BasicOptionPaneUI$ButtonAreaLayout(jboolean, jint);
  virtual void addLayoutComponent(::java::lang::String *, ::java::awt::Component *);
  virtual jboolean getCentersChildren();
  virtual jint getPadding();
  virtual jboolean getSyncAllWidths();
  virtual void layoutContainer(::java::awt::Container *);
private:
  jint buttonRowLength(::java::awt::Container *);
public:
  virtual ::java::awt::Dimension * minimumLayoutSize(::java::awt::Container *);
  virtual ::java::awt::Dimension * preferredLayoutSize(::java::awt::Container *);
  virtual void removeLayoutComponent(::java::awt::Component *);
  virtual void setCentersChildren(jboolean);
  virtual void setPadding(jint);
  virtual void setSyncAllWidths(jboolean);
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::java::lang::Object)))) centersChildren;
  jint padding;
  jboolean syncAllWidths;
private:
  jint widthOfWidestButton;
  jint tallestButton;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicOptionPaneUI$ButtonAreaLayout__
