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

#ifndef __javax_swing_plaf_metal_MetalInternalFrameTitlePane__
#define __javax_swing_plaf_metal_MetalInternalFrameTitlePane__

#pragma interface

#include <javax/swing/plaf/basic/BasicInternalFrameTitlePane.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class LayoutManager;
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class Icon;
        class JButton;
        class JInternalFrame;
        class JLabel;
        class JMenu;
      namespace plaf
      {
        namespace metal
        {
            class MetalInternalFrameTitlePane;
        }
      }
    }
  }
}

class javax::swing::plaf::metal::MetalInternalFrameTitlePane : public ::javax::swing::plaf::basic::BasicInternalFrameTitlePane
{

public:
  MetalInternalFrameTitlePane(::javax::swing::JInternalFrame *);
public: // actually protected
  virtual void installDefaults();
  virtual void uninstallDefaults();
  virtual void createButtons();
  virtual void addSystemMenuItems(::javax::swing::JMenu *);
  virtual void showSystemMenu();
  virtual void addSubComponents();
  virtual ::java::awt::LayoutManager * createLayout();
public:
  virtual void paintPalette(::java::awt::Graphics *);
  virtual void paintComponent(::java::awt::Graphics *);
  virtual void setPalette(jboolean);
public: // actually protected
  virtual ::java::beans::PropertyChangeListener * createPropertyChangeListener();
public: // actually package-private
  static ::javax::swing::JInternalFrame * access$0(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::JButton * access$1(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::Icon * access$2(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::JButton * access$3(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::Icon * access$4(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::JButton * access$5(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
  static ::javax::swing::Icon * access$6(::javax::swing::plaf::metal::MetalInternalFrameTitlePane *);
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::javax::swing::plaf::basic::BasicInternalFrameTitlePane)))) isPalette;
  ::javax::swing::Icon * paletteCloseIcon;
  jint paletteTitleHeight;
public: // actually package-private
  ::javax::swing::JLabel * title;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_metal_MetalInternalFrameTitlePane__
