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

#ifndef __javax_swing_plaf_basic_BasicFileChooserUI__
#define __javax_swing_plaf_basic_BasicFileChooserUI__

#pragma interface

#include <javax/swing/plaf/FileChooserUI.h>
extern "Java"
{
  namespace java
  {
    namespace awt
    {
      namespace event
      {
          class MouseListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace swing
    {
        class Action;
        class Icon;
        class JButton;
        class JComponent;
        class JFileChooser;
        class JList;
        class JPanel;
        class JTextField;
      namespace event
      {
          class ListSelectionListener;
      }
      namespace filechooser
      {
          class FileFilter;
          class FileView;
      }
      namespace plaf
      {
          class ComponentUI;
        namespace basic
        {
            class BasicDirectoryModel;
            class BasicFileChooserUI;
            class BasicFileChooserUI$ApproveSelectionAction;
            class BasicFileChooserUI$CancelSelectionAction;
            class BasicFileChooserUI$ChangeToParentDirectoryAction;
            class BasicFileChooserUI$GoHomeAction;
            class BasicFileChooserUI$NewFolderAction;
            class BasicFileChooserUI$UpdateAction;
        }
      }
    }
  }
}

class javax::swing::plaf::basic::BasicFileChooserUI : public ::javax::swing::plaf::FileChooserUI
{

public: // actually package-private
  virtual void closeDialog();
public:
  BasicFileChooserUI(::javax::swing::JFileChooser *);
  static ::javax::swing::plaf::ComponentUI * createUI(::javax::swing::JComponent *);
  virtual void installUI(::javax::swing::JComponent *);
  virtual void uninstallUI(::javax::swing::JComponent *);
public: // actually package-private
  virtual void boxEntries();
public:
  virtual void installComponents(::javax::swing::JFileChooser *);
  virtual void uninstallComponents(::javax::swing::JFileChooser *);
public: // actually protected
  virtual void installListeners(::javax::swing::JFileChooser *);
  virtual void uninstallListeners(::javax::swing::JFileChooser *);
  virtual void installDefaults(::javax::swing::JFileChooser *);
  virtual void uninstallDefaults(::javax::swing::JFileChooser *);
  virtual void installIcons(::javax::swing::JFileChooser *);
  virtual void uninstallIcons(::javax::swing::JFileChooser *);
  virtual void installStrings(::javax::swing::JFileChooser *);
  virtual void uninstallStrings(::javax::swing::JFileChooser *);
  virtual void createModel();
public:
  virtual ::javax::swing::plaf::basic::BasicDirectoryModel * getModel();
  virtual ::java::beans::PropertyChangeListener * createPropertyChangeListener(::javax::swing::JFileChooser *);
  virtual ::java::lang::String * getFileName();
  virtual ::java::lang::String * getDirectoryName();
  virtual void setFileName(::java::lang::String *);
  virtual void setDirectoryName(::java::lang::String *);
  virtual void rescanCurrentDirectory(::javax::swing::JFileChooser *);
  virtual void ensureFileIsVisible(::javax::swing::JFileChooser *, ::java::io::File *);
  virtual ::javax::swing::JFileChooser * getFileChooser();
  virtual ::javax::swing::JPanel * getAccessoryPanel();
public: // actually protected
  virtual ::javax::swing::JButton * getApproveButton(::javax::swing::JFileChooser *);
public:
  virtual ::java::lang::String * getApproveButtonToolTipText(::javax::swing::JFileChooser *);
  virtual void clearIconCache();
  virtual ::javax::swing::event::ListSelectionListener * createListSelectionListener(::javax::swing::JFileChooser *);
public: // actually protected
  virtual ::java::awt::event::MouseListener * createDoubleClickListener(::javax::swing::JFileChooser *, ::javax::swing::JList *);
  virtual jboolean isDirectorySelected();
  virtual void setDirectorySelected(jboolean);
  virtual ::java::io::File * getDirectory();
  virtual void setDirectory(::java::io::File *);
public:
  virtual ::javax::swing::filechooser::FileFilter * getAcceptAllFileFilter(::javax::swing::JFileChooser *);
  virtual ::javax::swing::filechooser::FileView * getFileView(::javax::swing::JFileChooser *);
  virtual ::java::lang::String * getDialogTitle(::javax::swing::JFileChooser *);
  virtual jint getApproveButtonMnemonic(::javax::swing::JFileChooser *);
  virtual ::java::lang::String * getApproveButtonText(::javax::swing::JFileChooser *);
  virtual ::javax::swing::Action * getNewFolderAction();
  virtual ::javax::swing::Action * getGoHomeAction();
  virtual ::javax::swing::Action * getChangeToParentDirectoryAction();
  virtual ::javax::swing::Action * getApproveSelectionAction();
  virtual ::javax::swing::Action * getCancelSelectionAction();
  virtual ::javax::swing::Action * getUpdateAction();
public: // actually package-private
  static ::java::io::File * access$0(::javax::swing::plaf::basic::BasicFileChooserUI *);
  static void access$1(::javax::swing::plaf::basic::BasicFileChooserUI *, ::java::io::File *);
public: // actually protected
  jint __attribute__((aligned(__alignof__( ::javax::swing::plaf::FileChooserUI)))) cancelButtonMnemonic;
  ::java::lang::String * cancelButtonText;
  ::java::lang::String * cancelButtonToolTipText;
  ::javax::swing::Icon * computerIcon;
  ::javax::swing::Icon * detailsViewIcon;
  ::javax::swing::Icon * directoryIcon;
  jint directoryOpenButtonMnemonic;
  ::java::lang::String * directoryOpenButtonText;
  ::java::lang::String * directoryOpenButtonToolTipText;
  ::javax::swing::Icon * fileIcon;
  ::javax::swing::Icon * floppyDriveIcon;
  ::javax::swing::Icon * hardDriveIcon;
  jint helpButtonMnemonic;
  ::java::lang::String * helpButtonText;
  ::java::lang::String * helpButtonToolTipText;
  ::javax::swing::Icon * homeFolderIcon;
  ::javax::swing::Icon * listViewIcon;
  ::javax::swing::Icon * newFolderIcon;
  jint openButtonMnemonic;
  ::java::lang::String * openButtonText;
  ::java::lang::String * openButtonToolTipText;
  jint saveButtonMnemonic;
  ::java::lang::String * saveButtonText;
  ::java::lang::String * saveButtonToolTipText;
  jint updateButtonMnemonic;
  ::java::lang::String * updateButtonText;
  ::java::lang::String * updateButtonToolTipText;
  ::javax::swing::Icon * upFolderIcon;
public: // actually package-private
  ::javax::swing::JFileChooser * filechooser;
  ::javax::swing::plaf::basic::BasicDirectoryModel * model;
  ::javax::swing::filechooser::FileFilter * acceptAll;
  ::javax::swing::filechooser::FileView * fv;
  ::javax::swing::JButton * accept;
  ::javax::swing::JPanel * accessoryPanel;
  ::java::beans::PropertyChangeListener * propertyChangeListener;
  ::java::lang::String * acceptAllFileFilterText;
  ::java::lang::String * dirDescText;
  ::java::lang::String * fileDescText;
  jboolean dirSelected;
  ::java::io::File * currDir;
  ::javax::swing::JPanel * bottomPanel;
  ::javax::swing::JPanel * closePanel;
  ::javax::swing::JTextField * entry;
  ::java::lang::String * parentPath;
private:
  ::javax::swing::plaf::basic::BasicFileChooserUI$ApproveSelectionAction * approveSelectionAction;
  ::javax::swing::plaf::basic::BasicFileChooserUI$CancelSelectionAction * cancelSelectionAction;
  ::javax::swing::plaf::basic::BasicFileChooserUI$GoHomeAction * goHomeAction;
  ::javax::swing::plaf::basic::BasicFileChooserUI$ChangeToParentDirectoryAction * changeToParentDirectoryAction;
  ::javax::swing::plaf::basic::BasicFileChooserUI$NewFolderAction * newFolderAction;
  ::javax::swing::plaf::basic::BasicFileChooserUI$UpdateAction * updateAction;
  ::java::io::File * selectedDir;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_plaf_basic_BasicFileChooserUI__
