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

#ifndef __javax_swing_JSlider__
#define __javax_swing_JSlider__

#pragma interface

#include <javax/swing/JComponent.h>
#include <gcj/array.h>

extern "Java"
{
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class BoundedRangeModel;
        class JSlider;
      namespace event
      {
          class ChangeEvent;
          class ChangeListener;
      }
      namespace plaf
      {
          class SliderUI;
      }
    }
  }
}

class javax::swing::JSlider : public ::javax::swing::JComponent
{

public:
  JSlider();
  JSlider(jint);
  JSlider(jint, jint);
  JSlider(jint, jint, jint);
  JSlider(jint, jint, jint, jint);
  JSlider(::javax::swing::BoundedRangeModel *);
  virtual jint getValue();
  virtual void setValue(jint);
  virtual ::javax::swing::plaf::SliderUI * getUI();
  virtual void setUI(::javax::swing::plaf::SliderUI *);
  virtual void updateUI();
  virtual ::java::lang::String * getUIClassID();
public: // actually protected
  virtual ::javax::swing::event::ChangeListener * createChangeListener();
public:
  virtual void addChangeListener(::javax::swing::event::ChangeListener *);
  virtual void removeChangeListener(::javax::swing::event::ChangeListener *);
public: // actually protected
  virtual void fireStateChanged();
public:
  virtual JArray< ::javax::swing::event::ChangeListener * > * getChangeListeners();
  virtual ::javax::swing::BoundedRangeModel * getModel();
  virtual void setModel(::javax::swing::BoundedRangeModel *);
  virtual jint getMinimum();
  virtual void setMinimum(jint);
  virtual jint getMaximum();
  virtual void setMaximum(jint);
  virtual jboolean getValueIsAdjusting();
  virtual void setValueIsAdjusting(jboolean);
  virtual jint getExtent();
  virtual void setExtent(jint);
  virtual jint getOrientation();
  virtual void setOrientation(jint);
  virtual ::java::util::Dictionary * getLabelTable();
  virtual void setLabelTable(::java::util::Dictionary *);
public: // actually protected
  virtual void updateLabelUIs();
public:
  virtual ::java::util::Hashtable * createStandardLabels(jint);
  virtual ::java::util::Hashtable * createStandardLabels(jint, jint);
  virtual jboolean getInverted();
  virtual void setInverted(jboolean);
  virtual jint getMajorTickSpacing();
  virtual void setMajorTickSpacing(jint);
  virtual jint getMinorTickSpacing();
  virtual void setMinorTickSpacing(jint);
  virtual jboolean getSnapToTicks();
  virtual void setSnapToTicks(jboolean);
  virtual jboolean getPaintTicks();
  virtual void setPaintTicks(jboolean);
  virtual jboolean getPaintTrack();
  virtual void setPaintTrack(jboolean);
  virtual jboolean getPaintLabels();
  virtual void setPaintLabels(jboolean);
public: // actually protected
  virtual ::java::lang::String * paramString();
public:
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
private:
  static const jlong serialVersionUID = -1441275936141218479LL;
  jboolean __attribute__((aligned(__alignof__( ::javax::swing::JComponent)))) paintTicks;
  jboolean paintTrack;
  jboolean paintLabels;
  ::java::util::Dictionary * labelTable;
public: // actually protected
  ::javax::swing::BoundedRangeModel * sliderModel;
  jint majorTickSpacing;
  jint minorTickSpacing;
  jboolean snapToTicks;
  jint orientation;
private:
  jboolean isInverted;
public: // actually protected
  ::javax::swing::event::ChangeListener * changeListener;
  ::javax::swing::event::ChangeEvent * changeEvent;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JSlider__
