1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxGenericDirCtrl class 
   4 //              Builds on wxDirCtrl class written by Robert Roebling for the 
   5 //              wxFile application, modified by Harm van der Heijden. 
   6 //              Further modified for Windows. 
   7 // Author:      Robert Roebling, Harm van der Heijden, Julian Smart et al 
  11 // Copyright:   (c) Robert Roebling, Harm van der Heijden, Julian Smart 
  12 // Licence:     wxWindows licence 
  13 ///////////////////////////////////////////////////////////////////////////// 
  15 #ifndef _WX_DIRCTRL_H_ 
  16 #define _WX_DIRCTRL_H_ 
  20 #include "wx/treectrl.h" 
  21 #include "wx/dialog.h" 
  22 #include "wx/dirdlg.h" 
  23 #include "wx/choice.h" 
  25 //----------------------------------------------------------------------------- 
  27 //----------------------------------------------------------------------------- 
  29 class WXDLLIMPEXP_FWD_CORE wxTextCtrl
; 
  30 class WXDLLIMPEXP_FWD_BASE wxHashTable
; 
  32 //----------------------------------------------------------------------------- 
  33 // Extra styles for wxGenericDirCtrl 
  34 //----------------------------------------------------------------------------- 
  38     // Only allow directory viewing/selection, no files 
  39     wxDIRCTRL_DIR_ONLY       
= 0x0010, 
  40     // When setting the default path, select the first file in the directory 
  41     wxDIRCTRL_SELECT_FIRST   
= 0x0020, 
  42 #if WXWIN_COMPATIBILITY_2_8 
  43     // Unused, for compatibility only 
  44     wxDIRCTRL_SHOW_FILTERS   
= 0x0040, 
  45 #endif // WXWIN_COMPATIBILITY_2_8 
  46     // Use 3D borders on internal controls 
  47     wxDIRCTRL_3D_INTERNAL    
= 0x0080, 
  49     wxDIRCTRL_EDIT_LABELS    
= 0x0100, 
  50     // Allow multiple selection 
  51     wxDIRCTRL_MULTIPLE       
= 0x0200 
  54 //----------------------------------------------------------------------------- 
  56 //----------------------------------------------------------------------------- 
  58 class WXDLLIMPEXP_CORE wxDirItemData 
: public wxTreeItemData
 
  61     wxDirItemData(const wxString
& path
, const wxString
& name
, bool isDir
); 
  62     virtual ~wxDirItemData(){} 
  63     void SetNewDirName(const wxString
& path
); 
  65     bool HasSubDirs() const; 
  66     bool HasFiles(const wxString
& spec 
= wxEmptyString
) const; 
  68     wxString m_path
, m_name
; 
  74 //----------------------------------------------------------------------------- 
  76 //----------------------------------------------------------------------------- 
  78 class WXDLLIMPEXP_FWD_CORE wxDirFilterListCtrl
; 
  80 class WXDLLIMPEXP_CORE wxGenericDirCtrl
: public wxControl
 
  84     wxGenericDirCtrl(wxWindow 
*parent
, const wxWindowID id 
= wxID_ANY
, 
  85               const wxString 
&dir 
= wxDirDialogDefaultFolderStr
, 
  86               const wxPoint
& pos 
= wxDefaultPosition
, 
  87               const wxSize
& size 
= wxDefaultSize
, 
  88               long style 
= wxDIRCTRL_3D_INTERNAL
, 
  89               const wxString
& filter 
= wxEmptyString
, 
  90               int defaultFilter 
= 0, 
  91               const wxString
& name 
= wxTreeCtrlNameStr 
) 
  94         Create(parent
, id
, dir
, pos
, size
, style
, filter
, defaultFilter
, name
); 
  97     bool Create(wxWindow 
*parent
, const wxWindowID id 
= wxID_ANY
, 
  98               const wxString 
&dir 
= wxDirDialogDefaultFolderStr
, 
  99               const wxPoint
& pos 
= wxDefaultPosition
, 
 100               const wxSize
& size 
= wxDefaultSize
, 
 101               long style 
= wxDIRCTRL_3D_INTERNAL
, 
 102               const wxString
& filter 
= wxEmptyString
, 
 103               int defaultFilter 
= 0, 
 104               const wxString
& name 
= wxTreeCtrlNameStr 
); 
 108     virtual ~wxGenericDirCtrl(); 
 110     void OnExpandItem(wxTreeEvent 
&event 
); 
 111     void OnCollapseItem(wxTreeEvent 
&event 
); 
 112     void OnBeginEditItem(wxTreeEvent 
&event 
); 
 113     void OnEndEditItem(wxTreeEvent 
&event 
); 
 114     void OnSize(wxSizeEvent 
&event 
); 
 116     // Try to expand as much of the given path as possible. 
 117     virtual bool ExpandPath(const wxString
& path
); 
 119     virtual bool CollapsePath(const wxString
& path
); 
 123     virtual inline wxString 
GetDefaultPath() const { return m_defaultPath
; } 
 124     virtual void SetDefaultPath(const wxString
& path
) { m_defaultPath 
= path
; } 
 126     // Get dir or filename 
 127     virtual wxString 
GetPath() const; 
 128     virtual void GetPaths(wxArrayString
& paths
) const; 
 130     // Get selected filename path only (else empty string). 
 131     // I.e. don't count a directory as a selection 
 132     virtual wxString 
GetFilePath() const; 
 133     virtual void GetFilePaths(wxArrayString
& paths
) const; 
 134     virtual void SetPath(const wxString
& path
); 
 136     virtual void SelectPath(const wxString
& path
, bool select 
= true); 
 137     virtual void SelectPaths(const wxArrayString
& paths
); 
 139     virtual void ShowHidden( bool show 
); 
 140     virtual bool GetShowHidden() { return m_showHidden
; } 
 142     virtual wxString 
GetFilter() const { return m_filter
; } 
 143     virtual void SetFilter(const wxString
& filter
); 
 145     virtual int GetFilterIndex() const { return m_currentFilter
; } 
 146     virtual void SetFilterIndex(int n
); 
 148     virtual wxTreeItemId 
GetRootId() { return m_rootId
; } 
 150     virtual wxTreeCtrl
* GetTreeCtrl() const { return m_treeCtrl
; } 
 151     virtual wxDirFilterListCtrl
* GetFilterListCtrl() const { return m_filterListCtrl
; } 
 153     virtual void UnselectAll(); 
 156     virtual void SetupSections(); 
 158     // Find the child that matches the first part of 'path'. 
 159     // E.g. if a child path is "/usr" and 'path' is "/usr/include" 
 160     // then the child for /usr is returned. 
 161     // If the path string has been used (we're at the leaf), done is set to true 
 162     virtual wxTreeItemId 
FindChild(wxTreeItemId parentId
, const wxString
& path
, bool& done
); 
 164     // Resize the components of the control 
 165     virtual void DoResize(); 
 167     // Collapse & expand the tree, thus re-creating it from scratch: 
 168     virtual void ReCreateTree(); 
 170     // Collapse the entire tree 
 171     virtual void CollapseTree(); 
 173     // overridden base class methods 
 174     virtual void SetFocus(); 
 177     virtual void ExpandRoot(); 
 178     virtual void ExpandDir(wxTreeItemId parentId
); 
 179     virtual void CollapseDir(wxTreeItemId parentId
); 
 180     virtual const wxTreeItemId 
AddSection(const wxString
& path
, const wxString
& name
, int imageId 
= 0); 
 181     virtual wxTreeItemId 
AppendItem (const wxTreeItemId 
& parent
, 
 182                 const wxString 
& text
, 
 183                 int image 
= -1, int selectedImage 
= -1, 
 184                 wxTreeItemData 
* data 
= NULL
); 
 185     //void FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames); 
 186     virtual wxTreeCtrl
* CreateTreeCtrl(wxWindow 
*parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long treeStyle
); 
 188     // Extract description and actual filter from overall filter string 
 189     bool ExtractWildcard(const wxString
& filterStr
, int n
, wxString
& filter
, wxString
& description
); 
 193     wxTreeItemId    m_rootId
; 
 194     wxString        m_defaultPath
; // Starting path 
 195     long            m_styleEx
; // Extended style 
 196     wxString        m_filter
;  // Wildcards in same format as per wxFileDialog 
 197     int             m_currentFilter
; // The current filter index 
 198     wxString        m_currentFilterStr
; // Current filter string 
 199     wxTreeCtrl
*     m_treeCtrl
; 
 200     wxDirFilterListCtrl
* m_filterListCtrl
; 
 203     DECLARE_EVENT_TABLE() 
 204     DECLARE_DYNAMIC_CLASS(wxGenericDirCtrl
) 
 205     wxDECLARE_NO_COPY_CLASS(wxGenericDirCtrl
); 
 208 //----------------------------------------------------------------------------- 
 209 // wxDirFilterListCtrl 
 210 //----------------------------------------------------------------------------- 
 212 class WXDLLIMPEXP_CORE wxDirFilterListCtrl
: public wxChoice
 
 215     wxDirFilterListCtrl() { Init(); } 
 216     wxDirFilterListCtrl(wxGenericDirCtrl
* parent
, const wxWindowID id 
= wxID_ANY
, 
 217               const wxPoint
& pos 
= wxDefaultPosition
, 
 218               const wxSize
& size 
= wxDefaultSize
, 
 222         Create(parent
, id
, pos
, size
, style
); 
 225     bool Create(wxGenericDirCtrl
* parent
, const wxWindowID id 
= wxID_ANY
, 
 226               const wxPoint
& pos 
= wxDefaultPosition
, 
 227               const wxSize
& size 
= wxDefaultSize
, 
 232     virtual ~wxDirFilterListCtrl() {} 
 235     void FillFilterList(const wxString
& filter
, int defaultFilter
); 
 238     void OnSelFilter(wxCommandEvent
& event
); 
 241     wxGenericDirCtrl
*    m_dirCtrl
; 
 243     DECLARE_EVENT_TABLE() 
 244     DECLARE_CLASS(wxDirFilterListCtrl
) 
 245     wxDECLARE_NO_COPY_CLASS(wxDirFilterListCtrl
); 
 248 #if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXPM__) 
 249     #define wxDirCtrl wxGenericDirCtrl 
 252 // Symbols for accessing individual controls 
 253 #define wxID_TREECTRL          7000 
 254 #define wxID_FILTERLISTCTRL    7001 
 256 #endif // wxUSE_DIRDLG 
 258 //------------------------------------------------------------------------- 
 259 // wxFileIconsTable - use wxTheFileIconsTable which is created as necessary 
 260 //------------------------------------------------------------------------- 
 262 #if wxUSE_DIRDLG || wxUSE_FILEDLG || wxUSE_FILECTRL 
 264 class WXDLLIMPEXP_FWD_CORE wxImageList
; 
 266 class WXDLLIMPEXP_CORE wxFileIconsTable
 
 285     int GetIconID(const wxString
& extension
, const wxString
& mime 
= wxEmptyString
); 
 286     wxImageList 
*GetSmallImageList(); 
 289     void Create();  // create on first use 
 291     wxImageList 
*m_smallImageList
; 
 292     wxHashTable 
*m_HashTable
; 
 295 // The global fileicons table 
 296 extern WXDLLIMPEXP_DATA_CORE(wxFileIconsTable 
*) wxTheFileIconsTable
; 
 298 #endif // wxUSE_DIRDLG || wxUSE_FILEDLG || wxUSE_FILECTRL