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

#ifndef __javax_swing_plaf_basic_BasicTabbedPaneUI$TabbedPaneLayout__
#define __javax_swing_plaf_basic_BasicTabbedPaneUI$TabbedPaneLayout__

#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 BasicTabbedPaneUI;
            class BasicTabbedPaneUI$TabbedPaneLayout;
        }
      }
    }
  }
}

class javax::swing::plaf::basic::BasicTabbedPaneUI$TabbedPaneLayout : public ::java::lang::Object
{

public:
  BasicTabbedPaneUI$TabbedPaneLayout(::javax::swing::plaf::basic::BasicTabbedPaneUI *);
  virtual void addLayoutComponent(::java::lang::String *, ::java::awt::Component *);
  virtual void calculateLayoutInfo();
public: // actually protected
  virtual ::java::awt::Dimension * calculateSize(jboolean);
  virtual void calculateTabRects(jint, jint);
public:
  virtual void layoutContainer(::java::awt::Container *);
  virtual ::java::awt::Dimension * minimumLayoutSize(::java::awt::Container *);
public: // actually protected
  virtual void normalizeTabRuns(jint, jint, jint, jint);
  virtual void padSelectedTab(jint, jint);
  virtual void padTabRun(jint, jint, jint, jint);
public:
  virtual ::java::awt::Dimension * preferredLayoutSize(::java::awt::Container *);
public: // actually protected
  virtual jint preferredTabAreaHeight(jint, jint);
  virtual jint preferredTabAreaWidth(jint, jint);
  virtual void rotateTabRuns(jint, jint);
public:
  virtual void removeLayoutComponent(::java::awt::Component *);
public: // actually package-private
  ::javax::swing::plaf::basic::BasicTabbedPaneUI * __attribute__((aligned(__alignof__( ::java::lang::Object)))) this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicTabbedPaneUI$TabbedPaneLayout__
