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

#ifndef __javax_swing_plaf_metal_MetalToggleButtonUI__
#define __javax_swing_plaf_metal_MetalToggleButtonUI__

#pragma interface

#include <javax/swing/plaf/basic/BasicToggleButtonUI.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Color;
        class Graphics;
        class Rectangle;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class AbstractButton;
        class JComponent;
      namespace plaf
      {
          class ComponentUI;
        namespace metal
        {
            class MetalToggleButtonUI;
        }
      }
    }
  }
}

class javax::swing::plaf::metal::MetalToggleButtonUI : public ::javax::swing::plaf::basic::BasicToggleButtonUI
{

public:
  static ::javax::swing::plaf::ComponentUI * createUI(::javax::swing::JComponent *);
  MetalToggleButtonUI();
public: // actually protected
  virtual ::java::awt::Color * getFocusColor();
  virtual ::java::awt::Color * getSelectColor();
  virtual ::java::awt::Color * getDisabledTextColor();
public:
  virtual void installDefaults(::javax::swing::AbstractButton *);
public: // actually protected
  virtual void paintButtonPressed(::java::awt::Graphics *, ::javax::swing::AbstractButton *);
  virtual void paintText(::java::awt::Graphics *, ::javax::swing::JComponent *, ::java::awt::Rectangle *, ::java::lang::String *);
  virtual void paintFocus(::java::awt::Graphics *, ::javax::swing::AbstractButton *, ::java::awt::Rectangle *, ::java::awt::Rectangle *, ::java::awt::Rectangle *);
public:
  virtual void update(::java::awt::Graphics *, ::javax::swing::JComponent *);
public: // actually protected
  ::java::awt::Color * __attribute__((aligned(__alignof__( ::javax::swing::plaf::basic::BasicToggleButtonUI)))) focusColor;
  ::java::awt::Color * selectColor;
  ::java::awt::Color * disabledTextColor;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_metal_MetalToggleButtonUI__
