X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..c2ef70ec8aae8e28bfc82d59c0519d06234dd4ec:/src/generic/filedlgg.cpp?ds=sidebyside diff --git a/src/generic/filedlgg.cpp b/src/generic/filedlgg.cpp index bc72174e98..edc98c38be 100644 --- a/src/generic/filedlgg.cpp +++ b/src/generic/filedlgg.cpp @@ -20,14 +20,22 @@ #pragma hdrstop #endif -#ifndef __UNIX__ -#error wxFileDialog currently only supports unix +#if wxUSE_FILEDLG + +#if !defined(__UNIX__) && !defined(__DOS__) +#error wxFileDialog currently only supports Unix and DOS #endif +#include "wx/checkbox.h" +#include "wx/textctrl.h" +#include "wx/choice.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" #include "wx/filedlg.h" #include "wx/debug.h" #include "wx/log.h" #include "wx/intl.h" +#include "wx/listctrl.h" #include "wx/msgdlg.h" #include "wx/sizer.h" #include "wx/bmpbuttn.h" @@ -44,11 +52,19 @@ #include #include -#include -#include -#ifndef __VMS -# include + +#ifdef __UNIX__ + #include + #include + #ifndef __VMS + # include + #endif +#endif + +#ifdef __WATCOMC__ + #include #endif + # include #include @@ -61,6 +77,88 @@ #include "wx/generic/deffile.xpm" #include "wx/generic/exefile.xpm" +//----------------------------------------------------------------------------- +// wxFileData +//----------------------------------------------------------------------------- + +class wxFileData : public wxObject +{ +private: + wxString m_name; + wxString m_fileName; + long m_size; + int m_hour; + int m_minute; + int m_year; + int m_month; + int m_day; + wxString m_permissions; + bool m_isDir; + bool m_isLink; + bool m_isExe; + +public: + wxFileData() { } + wxFileData( const wxString &name, const wxString &fname ); + wxString GetName() const; + wxString GetFullName() const; + wxString GetHint() const; + wxString GetEntry( int num ); + bool IsDir(); + bool IsLink(); + bool IsExe(); + long GetSize(); + void MakeItem( wxListItem &item ); + void SetNewName( const wxString &name, const wxString &fname ); + +private: + DECLARE_DYNAMIC_CLASS(wxFileData); +}; + +//----------------------------------------------------------------------------- +// wxFileCtrl +//----------------------------------------------------------------------------- + +class wxFileCtrl : public wxListCtrl +{ +private: + wxString m_dirName; + bool m_showHidden; + wxString m_wild; + +public: + wxFileCtrl(); + wxFileCtrl( wxWindow *win, + wxWindowID id, + const wxString &dirName, + const wxString &wild, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_LIST, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxT("filelist") ); + void ChangeToListMode(); + void ChangeToReportMode(); + void ChangeToIconMode(); + void ShowHidden( bool show = TRUE ); + long Add( wxFileData *fd, wxListItem &item ); + void Update(); + virtual void StatusbarText( wxChar *WXUNUSED(text) ) {}; + void MakeDir(); + void GoToParentDir(); + void GoToHomeDir(); + void GoToDir( const wxString &dir ); + void SetWild( const wxString &wild ); + void GetDir( wxString &dir ); + void OnListDeleteItem( wxListEvent &event ); + void OnListDeleteAllItems( wxListEvent &event ); + void OnListEndLabelEdit( wxListEvent &event ); + +private: + DECLARE_DYNAMIC_CLASS(wxFileCtrl); + DECLARE_EVENT_TABLE() +}; + // ---------------------------------------------------------------------------- // private classes - icons list management // ---------------------------------------------------------------------------- @@ -210,6 +308,7 @@ static wxImage CutEmptyBorders(const wxImage& img) int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) { +#if wxUSE_MIMETYPE if (!extension.IsEmpty()) { wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable.Get(extension); @@ -241,6 +340,14 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) } m_HashTable.Put(extension, new wxFileIconEntry(id)); return id; + +#else // !wxUSE_MIMETYPE + + if (extension == wxT("exe")) + return FI_EXECUTABLE; + else + return FI_UNKNOWN; +#endif // wxUSE_MIMETYPE/!wxUSE_MIMETYPE } @@ -275,7 +382,7 @@ wxFileData::wxFileData( const wxString &name, const wxString &fname ) struct stat buff; stat( m_fileName.fn_str(), &buff ); -#if !defined( __EMX__ ) && !defined(__VMS) +#if defined(__UNIX__) && (!defined( __EMX__ ) && !defined(__VMS)) struct stat lbuff; lstat( m_fileName.fn_str(), &lbuff ); m_isLink = S_ISLNK( lbuff.st_mode ); @@ -565,19 +672,25 @@ void wxFileCtrl::Update() f = wxFindNextFile(); } - res = m_dirName + wxT("/") + m_wild; - f = wxFindFirstFile( res.GetData(), wxFILE ); - while (!f.IsEmpty()) + // Tokenize the wildcard string, so we can handle more than 1 + // search pattern in a wildcard. + wxStringTokenizer tokenWild( m_wild, ";" ); + while ( tokenWild.HasMoreTokens() ) { - res = wxFileNameFromPath( f ); - fd = new wxFileData( res, f ); - wxString s = fd->GetName(); - if (m_showHidden || (s[0u] != wxT('.'))) + res = m_dirName + wxT("/") + tokenWild.GetNextToken(); + f = wxFindFirstFile( res.GetData(), wxFILE ); + while (!f.IsEmpty()) { - Add( fd, item ); - item.m_itemId++; + res = wxFileNameFromPath( f ); + fd = new wxFileData( res, f ); + wxString s = fd->GetName(); + if (m_showHidden || (s[0u] != wxT('.'))) + { + Add( fd, item ); + item.m_itemId++; + } + f = wxFindNextFile(); } - f = wxFindNextFile(); } SortItems( ListCompare, 0 ); @@ -646,6 +759,9 @@ void wxFileCtrl::GoToParentDir() { if (m_dirName != wxT("/")) { + size_t len = m_dirName.Len(); + if (m_dirName[len-1] == wxT('/')) + m_dirName.Remove( len-1, 1 ); wxString fname( wxFileNameFromPath(m_dirName) ); m_dirName = wxPathOnly( m_dirName ); if (m_dirName.IsEmpty()) m_dirName = wxT("/"); @@ -806,12 +922,17 @@ wxFileDialog::wxFileDialog(wxWindow *parent, m_dialogStyle |= wxOPEN; m_dir = defaultDir; - if ((m_dir.IsEmpty()) || (m_dir == wxT("."))) + if ((m_dir.empty()) || (m_dir == wxT("."))) { char buf[200]; m_dir = getcwd( buf, sizeof(buf) ); } - m_path = defaultDir; + + size_t len = m_dir.Len(); + if ((len > 1) && (m_dir[len-1] == wxT('/'))) + m_dir.Remove( len-1, 1 ); + + m_path = m_dir; m_path += wxT("/"); m_path += defaultFile; m_fileName = defaultFile; @@ -894,10 +1015,10 @@ wxFileDialog::wxFileDialog(wxWindow *parent, if (m_dialogStyle & wxMULTIPLE) m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition, - wxSize(440,180), s_lastViewStyle | wxSUNKEN_BORDER ); + wxSize(540,200), s_lastViewStyle | wxSUNKEN_BORDER ); else m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition, - wxSize(440,180), s_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL ); + wxSize(540,200), s_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL ); m_list -> ShowHidden(s_lastShowHidden); mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 ); @@ -1097,6 +1218,18 @@ void wxFileDialog::HandleAction( const wxString &fn ) SetPath( filename ); + // change to the directory where the user went if asked + if ( m_dialogStyle & wxCHANGE_DIR ) + { + wxString cwd; + wxSplitPath(filename, &cwd, NULL, NULL); + + if ( cwd != wxGetWorkingDirectory() ) + { + wxSetWorkingDirectory(cwd); + } + } + wxCommandEvent event; wxDialog::OnOK(event); } @@ -1262,19 +1395,17 @@ wxString wxFileSelector( const wxChar *title, } } -wxString wxLoadFileSelector( const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent ) +wxString wxLoadFileSelector( const wxChar *what, const wxChar *ext, const wxChar *default_name, wxWindow *parent ) { - wxChar *ext = (wxChar *)extension; + wxString prompt = wxString::Format(_("Load %s file"), what); - wxChar prompt[50]; - wxString str = _("Load %s file"); - wxSprintf(prompt, str, what); + if (*ext == wxT('.')) + ext++; - if (*ext == wxT('.')) ext++; - wxChar wild[60]; - wxSprintf(wild, wxT("*.%s"), ext); + wxString wild = wxString::Format(_T("*.%s"), ext); - return wxFileSelector (prompt, (const wxChar *) NULL, default_name, ext, wild, 0, parent); + return wxFileSelector(prompt, (const wxChar *) NULL, default_name, + ext, wild, 0, parent); } wxString wxSaveFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name, @@ -1282,15 +1413,15 @@ wxString wxSaveFileSelector(const wxChar *what, const wxChar *extension, const w { wxChar *ext = (wxChar *)extension; - wxChar prompt[50]; - wxString str = _("Save %s file"); - wxSprintf(prompt, str, what); + wxString prompt = wxString::Format(_("Save %s file"), what); - if (*ext == wxT('.')) ext++; - wxChar wild[60]; - wxSprintf(wild, wxT("*.%s"), ext); + if (*ext == wxT('.')) + ext++; - return wxFileSelector (prompt, (const wxChar *) NULL, default_name, ext, wild, 0, parent); + wxString wild = wxString::Format(_T("*.%s"), ext); + + return wxFileSelector(prompt, (const wxChar *) NULL, default_name, + ext, wild, 0, parent); } @@ -1310,3 +1441,5 @@ public: }; IMPLEMENT_DYNAMIC_CLASS(wxFileDialogGenericModule, wxModule) + +#endif // wxUSE_FILEDLG