// // FileChooser.h // #ifndef _FILE_CHOOSER_H #define _FILE_CHOOSER_H #pragma warning(disable : 4275) #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CFileChooser; class CFileChooserEdit; class CFilterEntry { public: CFilterEntry() { } CFilterEntry(LPCTSTR text, LPCTSTR ext) : m_text(text), m_ext(ext) { } CString m_text; CString m_ext; }; #define FC_UNDEFINED 0x00000000 #define FC_FORWRITE 0x00000001 #define FC_AUTOCOMPLETION 0x00000002 // Put "*.ext" to edit initially if no file with default // extensions was found in the initial directory #define FC_WILDCARD_DEFAULT 0x00000004 // Set "description (*.ext)" to FileDialog filter #define FC_WILDCARD_DESC 0x00000008 // prefill the path edit with default file name #define FC_PREPARE_DEFAULT 0x00000010 // supress file existance check #define FC_PATH_CHECK 0x00000020 // Check if entered filename with any of default extensions // are available in the current directory. If yes, choose it #define FC_CHECK_FILENAME_ONLY 0x00000040 #define FC_DIRECTORY_ONLY 0x00000080 #define FC_HIDEREADONLY 0x00000100 #define FC_COMMANDLINE 0x00000200 #define FC_DEFAULT\ FC_AUTOCOMPLETION | FC_WILDCARD_DESC | FC_WILDCARD_DEFAULT | FC_PATH_CHECK #define FC_DEFAULT_READ\ FC_DEFAULT | FC_HIDEREADONLY #define FC_DEFAULT_WRITE\ FC_DEFAULT | FC_FORWRITE #define FC_SUCCESS 0x00000000 #define FC_FILE_DOES_NOT_EXIST 0x00000001 #define FC_FILENAME_IS_DIRECTORY 0x00000002 #define FC_FILENAME_IS_FILE 0x00000003 #define FC_TEXT_IS_INVALID 0x00000004 #define FC_WRONG_FORMAT 0x00000005 #define FC_NO_CLOSING_QUOTE 0x00000006 class _EXPORT CFileChooser : public CWindowImpl { friend class CFileChooserEdit; friend class CFileChooserButton; public: CFileChooser() : m_pParent(NULL), m_bDoReplaceFile(FALSE), m_bEditDirty(FALSE), m_bTextValid(TRUE), m_bDialogActive(FALSE), m_dwStyle(FC_UNDEFINED), m_ofn_Flags(0), m_edit(NULL), m_button(NULL) { } ~CFileChooser(); BEGIN_MSG_MAP_EX(CFileChooser) END_MSG_MAP() BOOL Init(CWindow * pParent, DWORD dwStyle, UINT idEdit, UINT idButton); DWORD GetStyle() const { return m_dwStyle; } DWORD SetStyle(DWORD dwStyle) { DWORD dw = m_dwStyle; m_dwStyle = dwStyle; return dw; } BOOL StyleBitSet(DWORD bit) { return 0 != (m_dwStyle & bit); } BOOL OpenForRead() { return !StyleBitSet(FC_FORWRITE); } void AddStyle(DWORD dwStyle) { m_dwStyle |= dwStyle; } void RemoveStyle(DWORD dwStyle) { m_dwStyle &= ~dwStyle; } void SetOfnFlags(DWORD flags) { m_ofn_Flags = flags; } DWORD GetOfnFlags() { return m_ofn_Flags; } void SetDialogTitle(LPCTSTR strTitle) { m_strTitle = strTitle; } DWORD GetFileName(CString& str); void SetPath(const CString& str); void AddExtension(LPCTSTR text, LPCTSTR ext); void AddExtension(HINSTANCE hInst, UINT idText, UINT idExt); int BrowseForFolderCallback(HWND hwnd, UINT uMsg, LPARAM lParam); protected: void OnBrowseBtn(); void CreateFilter(CString& strFilter, CString& strDefExt); void CreateDefaultPathForRead(); BOOL BrowseForFile(CString& strPath, CString& strFile); BOOL BrowseForFolder(CString& strPath); BOOL OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); void OnPaste(); void OnSetEditFocus(); void OnKillEditFocus(); BOOL HasEditFocus(); BOOL IsValidChar(UINT nChar, BOOL bExcludeWildcards = FALSE); BOOL IsValidPath(LPCTSTR); void SetCompactedPath(LPCTSTR path); void SetPathToEdit(LPCTSTR path); int ExtractPath(LPTSTR path); int ExtractArgs(LPTSTR buf); void GetText(LPTSTR buf); int GetFilterIndex(const CString& fileName); protected: DWORD m_ofn_Flags; CWindow * m_pParent; CFileChooserEdit * m_edit; CFileChooserButton * m_button; DWORD m_dwStyle; CString m_strPath; LPTSTR m_pPathTemp; CString m_strTitle; std::list m_ext; BOOL m_bDoReplaceFile; BOOL m_bEditDirty; BOOL m_bTextValid; BOOL m_bDialogActive; }; #endif //_FILE_CHOOSER_H