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

#ifndef __gnu_javax_print_PrinterDialog$GeneralPanel$CopiesAndSorted__
#define __gnu_javax_print_PrinterDialog$GeneralPanel$CopiesAndSorted__

#pragma interface

#include <javax/swing/JPanel.h>
extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace print
      {
          class PrinterDialog$GeneralPanel;
          class PrinterDialog$GeneralPanel$CopiesAndSorted;
      }
    }
  }
  namespace java
  {
    namespace awt
    {
      namespace event
      {
          class ActionEvent;
      }
    }
  }
  namespace javax
  {
    namespace swing
    {
        class JCheckBox;
        class JLabel;
        class JSpinner;
        class SpinnerNumberModel;
      namespace event
      {
          class ChangeEvent;
      }
    }
  }
}

class gnu::javax::print::PrinterDialog$GeneralPanel$CopiesAndSorted : public ::javax::swing::JPanel
{

public: // actually package-private
  PrinterDialog$GeneralPanel$CopiesAndSorted(::gnu::javax::print::PrinterDialog$GeneralPanel *);
public:
  void stateChanged(::javax::swing::event::ChangeEvent *);
  void actionPerformed(::java::awt::event::ActionEvent *);
public: // actually package-private
  void updateForSelectedService();
private:
  ::javax::swing::JCheckBox * __attribute__((aligned(__alignof__( ::javax::swing::JPanel)))) sort;
  ::javax::swing::JSpinner * copies;
  ::javax::swing::JLabel * copies_lb;
  ::javax::swing::SpinnerNumberModel * copiesModel;
public: // actually package-private
  ::gnu::javax::print::PrinterDialog$GeneralPanel * this$1;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_print_PrinterDialog$GeneralPanel$CopiesAndSorted__
