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

#ifndef __javax_swing_plaf_basic_BasicTableHeaderUI__
#define __javax_swing_plaf_basic_BasicTableHeaderUI__

#pragma interface

#include <javax/swing/plaf/TableHeaderUI.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Cursor;
        class Dimension;
        class Graphics;
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class CellRendererPane;
        class JComponent;
      namespace border
      {
          class Border;
      }
      namespace event
      {
          class MouseInputListener;
      }
      namespace plaf
      {
          class ComponentUI;
        namespace basic
        {
            class BasicTableHeaderUI;
        }
      }
      namespace table
      {
          class JTableHeader;
      }
    }
  }
}

class javax::swing::plaf::basic::BasicTableHeaderUI : public ::javax::swing::plaf::TableHeaderUI
{

public:
  static ::javax::swing::plaf::ComponentUI * createUI(::javax::swing::JComponent *);
public: // actually protected
  virtual ::javax::swing::event::MouseInputListener * createMouseInputListener();
public:
  BasicTableHeaderUI();
public: // actually protected
  virtual void installDefaults();
  virtual void installKeyboardActions();
  virtual void installListeners();
public:
  virtual void installUI(::javax::swing::JComponent *);
public: // actually protected
  virtual void uninstallDefaults();
  virtual void uninstallKeyboardActions();
  virtual void uninstallListeners();
public:
  virtual void uninstallUI(::javax::swing::JComponent *);
  virtual void paint(::java::awt::Graphics *, ::javax::swing::JComponent *);
  virtual ::java::awt::Dimension * getPreferredSize(::javax::swing::JComponent *);
public: // actually package-private
  static void access$0(::javax::swing::plaf::basic::BasicTableHeaderUI *, ::java::awt::Cursor *);
  static ::java::awt::Cursor * access$1(::javax::swing::plaf::basic::BasicTableHeaderUI *);
  static jint COLUMN_BOUNDARY_TOLERANCE;
public: // actually protected
  ::javax::swing::table::JTableHeader * __attribute__((aligned(__alignof__( ::javax::swing::plaf::TableHeaderUI)))) header;
  ::javax::swing::event::MouseInputListener * mouseInputListener;
  ::javax::swing::CellRendererPane * rendererPane;
private:
  ::javax::swing::border::Border * cellBorder;
  ::java::awt::Cursor * originalCursor;
public: // actually package-private
  ::java::awt::Rectangle * draggingHeaderRect;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicTableHeaderUI__
