///////////////////////////////////////////////////////////////////////////// // Name: filebrws.h // Purpose: A file browser widget with tree and/or list control views // Author: John Labenski // Created: 07/01/02 // Copyright: John Labenski, 2002 // License: wxWidgets ///////////////////////////////////////////////////////////////////////////// #ifndef __WX_FILEBROWSER_H__ #define __WX_FILEBROWSER_H__ #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "filebrws.h" #endif #include "wx/listctrl.h" #include "wx/dirctrl.h" #include "wx/filedlg.h" #include "wx/textdlg.h" #include "wx/generic/filedlgg.h" #include "wx/things/thingdef.h" class WXDLLEXPORT wxCheckBox; class WXDLLEXPORT wxComboBox; class WXDLLEXPORT wxTreeEvent; class WXDLLEXPORT wxSplitterWindow; class WXDLLEXPORT wxGenericDirCtrl; class WXDLLEXPORT wxListCtrl; class WXDLLEXPORT wxListEvent; class WXDLLEXPORT wxToolBar; class WXDLLEXPORT wxBitmapButton; class WXDLLEXPORT wxConfigBase; class WXDLLEXPORT wxFileCtrl; class WXDLLEXPORT wxFileName; class WXDLLIMPEXP_THINGS wxFileBrowser; #include "wx/dynarray.h" WX_DECLARE_OBJARRAY_WITH_DECL(wxFileData, wxArrayFileData, class WXDLLIMPEXP_THINGS); //---------------------------------------------------------------------------- // MultilineTextDialog : wxTextEntryDialog for multiple lines //---------------------------------------------------------------------------- class WXDLLIMPEXP_THINGS MultilineTextDialog : public wxTextEntryDialog { public: MultilineTextDialog(wxWindow *parent, const wxString& message, const wxString& caption = wxGetTextFromUserPromptStr, const wxString& value = wxEmptyString, long style = 0, const wxPoint& pos = wxDefaultPosition); }; //---------------------------------------------------------------------------- // wxFileBrowserEvent : events for the wxFileBrowser //---------------------------------------------------------------------------- // wxEVT_FILEBROWSER_FILE_SELECTED - a file has been selected (single click) // wxEVT_FILEBROWSER_FILE_ACTIVATED - a file has been double clicked or enter pressed // wxEVT_FILEBROWSER_DIR_SELECTED - a dir has been selected (single click) // wxEVT_FILEBROWSER_DIR_ACTIVATED - a dir has been double clicked or enter pressed BEGIN_DECLARE_EVENT_TYPES() DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_THINGS, wxEVT_FILEBROWSER_FILE_SELECTED, wxEVT_USER_FIRST + 1000) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_THINGS, wxEVT_FILEBROWSER_FILE_ACTIVATED, wxEVT_USER_FIRST + 1001) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_THINGS, wxEVT_FILEBROWSER_DIR_SELECTED, wxEVT_USER_FIRST + 1002) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_THINGS, wxEVT_FILEBROWSER_DIR_ACTIVATED, wxEVT_USER_FIRST + 1003) END_DECLARE_EVENT_TYPES() class WXDLLIMPEXP_THINGS wxFileBrowserEvent : public wxCommandEvent { public: wxFileBrowserEvent( wxEventType commandType = wxEVT_NULL, wxFileBrowser *fileBrowser = NULL, wxWindowID id = wxID_ANY ); wxFileBrowserEvent( const wxFileBrowserEvent &event ) : wxCommandEvent(event) {} // Get the full path + filename wxString GetFilePath() const { return GetString(); } void SetFilePath(const wxString &filepath) { SetString(filepath); } virtual wxEvent *Clone() const { return new wxFileBrowserEvent(*this); } private: DECLARE_ABSTRACT_CLASS(wxFileBrowserEvent) }; typedef void (wxEvtHandler::*wxFileBrowserEventFunction)(wxFileBrowserEvent&); #define wxFileBrowserEventHandler(func) \ (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFileBrowserEventFunction, &func) #define wx__DECLARE_FILEBROWSEREVT(evt, id, fn) wx__DECLARE_EVT1( evt, id, wxFileBrowserEventHandler(fn)) #define EVT_FILEBROWSER_FILE_SELECTED(id, fn) wx__DECLARE_FILEBROWSEREVT( wxEVT_FILEBROWSER_FILE_SELECTED, id, fn ) #define EVT_FILEBROWSER_FILE_ACTIVATED(id, fn) wx__DECLARE_FILEBROWSEREVT( wxEVT_FILEBROWSER_FILE_ACTIVATED, id, fn ) #define EVT_FILEBROWSER_DIR_SELECTED(id, fn) wx__DECLARE_FILEBROWSEREVT( wxEVT_FILEBROWSER_DIR_SELECTED, id, fn ) #define EVT_FILEBROWSER_DIR_ACTIVATED(id, fn) wx__DECLARE_FILEBROWSEREVT( wxEVT_FILEBROWSER_DIR_ACTIVATED, id, fn ) //---------------------------------------------------------------------------- // wxFileBrowser //---------------------------------------------------------------------------- enum wxFileBrowserStyles_Type { // note: these are wxListCtrl styles to allow normal wxWindow styles to work wxFILEBROWSER_TREE = wxLC_SORT_DESCENDING, // treectrl view wxFILEBROWSER_LIST = wxLC_LIST, // listctrl view wxFILEBROWSER_DETAILS = wxLC_REPORT, // listctrl details view wxFILEBROWSER_SMALL_ICON = wxLC_SMALL_ICON, // listctrl icon view wxFILEBROWSER_LARGE_ICON = wxLC_ICON, // NOT IMPL listctrl large icon wxFILEBROWSER_PREVIEW = wxLC_SORT_ASCENDING, // NOT implemented wxFILEBROWSER_SPLIT_VERTICAL = wxLC_NO_HEADER, // tree and listctrl are // split vertically else horizontal wxFILEBROWSER_SHOW_FOLDERS = wxLC_NO_SORT_HEADER, // when showing listview also show // the folders in the treectrl wxFILEBROWSER_VIEW_MASK = wxFILEBROWSER_TREE|wxFILEBROWSER_LIST|wxFILEBROWSER_DETAILS|wxFILEBROWSER_SMALL_ICON|wxFILEBROWSER_LARGE_ICON|wxFILEBROWSER_PREVIEW, wxFILEBROWSER_STYLE_MASK = wxFILEBROWSER_VIEW_MASK|wxFILEBROWSER_SPLIT_VERTICAL|wxFILEBROWSER_SHOW_FOLDERS }; class WXDLLIMPEXP_THINGS wxFileBrowser : public wxControl { public : wxFileBrowser() : wxControl() { Init(); } wxFileBrowser( wxWindow* parent, const wxWindowID id, const wxString& dir = wxDirDialogDefaultFolderStr, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxFILEBROWSER_DETAILS, const wxString& filter = wxFileSelectorDefaultWildcardStr, int defaultFilter = 0, const wxString& name = wxT("wxFileBrowser")) : wxControl() { Init(); Create(parent, id, dir, pos, size, style, filter, defaultFilter, name); } virtual ~wxFileBrowser(); bool Create( wxWindow* parent, const wxWindowID id, const wxString& dir = wxDirDialogDefaultFolderStr, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxFILEBROWSER_DETAILS, const wxString& filter = wxFileSelectorDefaultWildcardStr, int defaultFilter = 0, const wxString& name = wxT("wxFileBrowser") ); // Get the current dir (not file), optionally add a trailing platform dependent '/' or '\' wxString GetPath(bool add_wxFILE_SEP_PATH = false) const; // Go to a directory, returns sucess bool SetPath(const wxString &dirName); // go to a dir or send an EVT_FILEBROWSER_FILE_ACTIVATED if a filename bool OpenFilePath(const wxString &filePath); // Go to a higher directory, returns sucess bool CanGoUpDir() const; bool GoUpDir(); // Go to your "Home" folder "~/" in unix, "My Documents" in MSW bool GoToHomeDir(); // Go forwards and backwards through the recent dir history bool CanGoPathHistoryForward(); bool CanGoPathHistoryBackward(); bool GoPathHistoryForward(); bool GoPathHistoryBackward(); // Add a new path to the history paths at the current index void AddPathHistory(const wxString& path); // Set the file filter to one of the filter combobox items bool SetFilter(int comboItem); // Set all the file filters, deleting previous and select one bool SetFilters(const wxString &filters, int select = 0); // Add or set the file filter, "All Files (*)|*", it must have a "|" in it bool AddFilter(const wxString &filter); // Get the current file filter wxString GetFilter() const { return m_filter; } // Get the wild card used for the filter wxString GetWild() const { return m_filter.AfterLast(wxT('|')); } // Set how the files are displayed - see enum wxFileBrowserStyles_Type void SetBrowserStyle(long style); long GetBrowserStyle() const { return m_browser_style; } bool HasBrowserStyle(int style_mask) const { return (m_browser_style & style_mask) != 0; } // Show or hide hidden files void ShowHidden(bool show_hidden); bool GetShowHidden() const { return m_show_hidden; } // When showing the files in a listctrl also show the folders in the treectrl // also don't let them unsplit it void ShowFolders(bool show_folders); bool GetShowFolders() const { return HasBrowserStyle(wxFILEBROWSER_SHOW_FOLDERS); } // When splitting, split vertically or horizontally void SplitVertical(bool split_vertically); bool GetSplitVertical() const { return HasBrowserStyle(wxFILEBROWSER_SPLIT_VERTICAL); } // ----------------------------------------------------------------------- // implementation // utility function, returns the dir part of the filepath w/ trailing wxFILE_SEP_PATH bool GetPathFromFilePath(const wxString &filepath, wxString &path) const; // Delete all selected items in the wxFileCtrl bool DeleteSelectedListItems(bool ask_ok = true); // Store a list of selected items that you'll copy/cut when you paste them bool CopyCutSelectedListItems(bool copy_them); // Paste the stored CopyCutSelectedListItems - based on CopyCutSelectedListItems list bool PasteCopyCutSelectedListItems(); // Get a list of all the selected items in the list control wxArrayInt GetSelectedListItems() const; // Get the wxFileData items that are selected in the list control wxArrayFileData GetSelectedListFileData() const; // Get the currently focused list item or NULL if none selected wxFileData *GetFocusedListItem() const; // Create a wxFileData from a wxFileName wxFileData CreateFileData(const wxFileName& fileName) const; // Get the last or currently focused path + filename wxString GetLastFocusedFilePath(); // Show a simple dialog that contains the properties of the file/dir void ShowPropertiesDialog(const wxFileData &fileData) const; // returns a string with the name of a program to run the file wxString GetOpenWithFileCmd(wxFileData* fd) const; // Get a pointer to the path history combo, can change its contents wxComboBox *GetPathCombo() const { return m_pathCombo; } // Get a pointer to the filter combo // don't delete selections less than the # of filters passed in // ie. check for items with GetClientData() !NULL wxComboBox *GetFilterCombo() const { return m_filterCombo; } // Can this file be read/opened? bool CanRead(const wxString& filePath) const; // Can this file be written to, deleted, moved, cut... bool CanWrite(const wxString& filePath) const; // Update the menu/toolbar items void UpdateMenu(wxMenu *menu); void UpdateToolBar(wxToolBar *toolBar); // Update the state of the toolbar and menu items void UpdateItems(); #if wxUSE_CONFIG // Load the recent paths/filters, max = 20 void LoadConfig(wxConfigBase& config, bool paths=true, bool filters=true, const wxString &configPath = wxT("/wxFileBrowser")); // Save the recent paths, filters, if n_xxx < 0 then don't save it void SaveConfig(wxConfigBase& config, int n_paths=10, int n_filters=10, const wxString &configPath = wxT("/wxFileBrowser")); #endif // wxUSE_CONFIG protected : void OnSize( wxSizeEvent& event ); void DoSize(); virtual wxSize DoGetBestSize() const; // toolbar tools events void OnViewButtons(wxCommandEvent &event); void OnPathCombo(wxCommandEvent &event); void OnPathComboEnter(wxCommandEvent &event); void OnFilterCombo(wxCommandEvent &event); void OnFilterComboEnter(wxCommandEvent &event); // wxDirCtrl events - a wxTreeCtrl void OnTreeItemSelection(wxTreeEvent &event); void OnTreeItemActivation(wxTreeEvent &event); void OnTreeRightClick(wxTreeEvent& event); // wxFileCtrl events - a wxListCtrl void OnListColClick(wxListEvent &event); void OnListItemActivated(wxListEvent &event); void OnListItemSelected(wxListEvent &event); void OnListRightClick(wxListEvent &event); void OnTreeMenu(wxCommandEvent &event); void OnListMenu(wxCommandEvent &event); void OnIdle( wxIdleEvent &event ); //for delayed set path from combo void OnSetPath( wxCommandEvent &event ); void OnSetFilter( wxCommandEvent &event ); // (re)inserts the item at pos, deleting it if it existed after pos // keeps recent items at top bool InsertComboItem(wxComboBox *combo, const wxString &item, int pos = 0) const; // Send an event, returns false if event.Veto() called bool DoSendEvent(wxFileBrowserEvent &event) const; int FBStyleToLCStyle(int fb_style) const; // wxFileBrowserStyles_Type to wxLC_XXX int FBStyleToMenuID(int fb_style) const; // wxFileBrowserStyles_Type menu id int MenuIDToFBStyle(int menuID) const; // menu id to wxFileBrowserStyles_Type // Windows wxToolBar *m_viewToolBar; wxToolBar *m_pathToolBar; wxBitmapButton *m_viewButton; wxComboBox *m_filterCombo; wxComboBox *m_pathCombo; wxSplitterWindow *m_splitterWin; wxGenericDirCtrl *m_dirCtrl; wxFileCtrl *m_fileCtrl; wxMenu *m_listMenu; // popup menu in listctrl wxMenu *m_treeMenu; // popup menu in treectrl wxMenu *m_viewMenu; // popup menu in for changing view // data wxString m_filter; // current filter wxString m_path; // current path wxString m_lastFocusedFilePath; // path + filename of last focused item wxArrayString m_pathHistory; // recently used paths int m_path_history_index; // current index in recently used paths wxArrayFileData m_copycutFiles; // list of names when copying or cutting bool m_last_copy; // last CopyCutSelectedListItems was a copy, else cut int m_init_filters; // # of filters initially passed in bool m_ignore_tree_event; // temporarily ignore m_dirCtrl events long m_browser_style; int m_filterComboSelection; // last selection of the filter/path combo int m_pathComboSelection; bool m_show_hidden; // show hidden files private : void Init(); DECLARE_EVENT_TABLE() DECLARE_DYNAMIC_CLASS(wxFileBrowser) }; #endif // __WX_FILEBROWSER_H__