X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/817670e45489f4a0f596b9b4fb2a792181bf8212..a9102b3671a45d116d781b0c8e90d2e9a84fbdcb:/src/common/fldlgcmn.cpp diff --git a/src/common/fldlgcmn.cpp b/src/common/fldlgcmn.cpp index fc6f7366ff..0dbf1be3a9 100644 --- a/src/common/fldlgcmn.cpp +++ b/src/common/fldlgcmn.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "filedlg.h" #endif @@ -30,6 +30,115 @@ #if wxUSE_FILEDLG +//---------------------------------------------------------------------------- +// wxFileDialogBase +//---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxFileDialogBase, wxDialog) + +void wxFileDialogBase::Init() +{ + m_filterIndex = m_dialogStyle = 0; + m_parent = NULL; +} + +bool wxFileDialogBase::Create(wxWindow *parent, + const wxString& message, + const wxString& defaultDir, + const wxString& defaultFile, + const wxString& wildCard, + long style, + const wxPoint& WXUNUSED(pos)) +{ + m_message = message; + m_dir = defaultDir; + m_fileName = defaultFile; + m_wildCard = wildCard; + + m_parent = parent; + m_dialogStyle = style; + m_filterIndex = 0; + + if ( wildCard.empty() || wildCard == wxFileSelectorDefaultWildcardStr ) + { + m_wildCard = wxString::Format(_("All files (%s)|%s"), + wxFileSelectorDefaultWildcardStr, + wxFileSelectorDefaultWildcardStr); + } + else // have wild card + { + // convert m_wildCard from "*.bar" to "bar files (*.bar)|*.bar" + if ( m_wildCard.Find(wxT('|')) == wxNOT_FOUND ) + { + wxString::size_type nDot = m_wildCard.find(_T("*.")); + if ( nDot != wxString::npos ) + nDot++; + else + nDot = 0; + + m_wildCard = wxString::Format + ( + _("%s files (%s)|%s"), + wildCard.c_str() + nDot, + wildCard.c_str(), + wildCard.c_str() + ); + } + } + + return true; +} + +#if WXWIN_COMPATIBILITY_2_4 +// Parses the filterStr, returning the number of filters. +// Returns 0 if none or if there's a problem. +// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" +int wxFileDialogBase::ParseWildcard(const wxString& filterStr, + wxArrayString& descriptions, + wxArrayString& filters) +{ + return ::wxParseCommonDialogsFilter(filterStr, descriptions, filters); +} +#endif // WXWIN_COMPATIBILITY_2_4 + +wxString wxFileDialogBase::AppendExtension(const wxString &filePath, + const wxString &extensionList) +{ + // strip off path, to avoid problems with "path.bar/foo" + wxString fileName = filePath.AfterLast(wxFILE_SEP_PATH); + + // if fileName is of form "foo.bar" it's ok, return it + int idx_dot = fileName.Find(wxT('.'), true); + if ((idx_dot != wxNOT_FOUND) && (idx_dot < (int)fileName.Len() - 1)) + return filePath; + + // get the first extension from extensionList, or all of it + wxString ext = extensionList.BeforeFirst(wxT(';')); + + // if ext == "foo" or "foo." there's no extension + int idx_ext_dot = ext.Find(wxT('.'), true); + if ((idx_ext_dot == wxNOT_FOUND) || (idx_ext_dot == (int)ext.Len() - 1)) + return filePath; + else + ext = ext.AfterLast(wxT('.')); + + // if ext == "*" or "bar*" or "b?r" or " " then its not valid + if ((ext.Find(wxT('*')) != wxNOT_FOUND) || + (ext.Find(wxT('?')) != wxNOT_FOUND) || + (ext.Strip(wxString::both).empty())) + return filePath; + + // if fileName doesn't have a '.' then add one + if (filePath.Last() != wxT('.')) + ext = wxT(".") + ext; + + return filePath + ext; +} + +//---------------------------------------------------------------------------- +// wxFileDialog convenience functions +//---------------------------------------------------------------------------- + wxString wxFileSelector(const wxChar *title, const wxChar *defaultDir, const wxChar *defaultFileName, @@ -67,41 +176,28 @@ wxString wxFileSelector(const wxChar *title, wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y)); - if( wxStrlen(defaultExtension) != 0 ) - { - int filterFind = 0, - filterIndex = 0; - for( unsigned int i = 0; i < filter2.Len(); i++ ) - { - if( filter2.GetChar(i) == wxT('|') ) + // if filter is of form "All files (*)|*|..." set correct filter index + if((wxStrlen(defaultExtension) != 0) && (filter2.Find(wxT('|')) != wxNOT_FOUND)) { - // save the start index of the new filter - unsigned int is = i++; + int filterIndex = 0; - // find the end of the filter - for( ; i < filter2.Len(); i++ ) + wxArrayString descriptions, filters; + // don't care about errors, handled already by wxFileDialog + (void)wxParseCommonDialogsFilter(filter2, descriptions, filters); + for (size_t n=0; n 0 && is+1 < filter2.Len() ) - { - if( filter2.Mid(is+1,i-is-1).Contains(defaultExtension) ) + if (filters[n].Contains(defaultExtension)) { - filterFind = filterIndex; + filterIndex = n; break; } } - filterIndex++; - } + if (filterIndex > 0) + fileDialog.SetFilterIndex(filterIndex); } - fileDialog.SetFilterIndex(filterFind); - } - wxString filename; if ( fileDialog.ShowModal() == wxID_OK ) { @@ -111,45 +207,9 @@ wxString wxFileSelector(const wxChar *title, return filename; } - -/* -wxString wxFileSelector( const wxChar *title, - const wxChar *defaultDir, - const wxChar *defaultFileName, - const wxChar *defaultExtension, - const wxChar *filter, - int flags, - wxWindow *parent, - int x, - int y ) -{ - wxString filter2; - if ( defaultExtension && !filter ) - filter2 = wxString(wxT("*.")) + wxString(defaultExtension) ; - else if ( filter ) - filter2 = filter; - - wxString defaultDirString; - if (defaultDir) - defaultDirString = defaultDir; - - wxString defaultFilenameString; - if (defaultFileName) - defaultFilenameString = defaultFileName; - - wxFileDialog fileDialog( parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y) ); - - if ( fileDialog.ShowModal() == wxID_OK ) - { - return fileDialog.GetPath(); - } - else - { - return wxEmptyString; - } -} -*/ - +//---------------------------------------------------------------------------- +// wxFileSelectorEx +//---------------------------------------------------------------------------- wxString wxFileSelectorEx(const wxChar *title, const wxChar *defaultDir, @@ -163,10 +223,10 @@ wxString wxFileSelectorEx(const wxChar *title, { wxFileDialog fileDialog(parent, - title ? title : wxT(""), - defaultDir ? defaultDir : wxT(""), - defaultFileName ? defaultFileName : wxT(""), - filter ? filter : wxT(""), + title ? title : wxEmptyString, + defaultDir ? defaultDir : wxEmptyString, + defaultFileName ? defaultFileName : wxEmptyString, + filter ? filter : wxEmptyString, flags, wxPoint(x, y)); wxString filename; @@ -181,10 +241,10 @@ wxString wxFileSelectorEx(const wxChar *title, return filename; } +//---------------------------------------------------------------------------- +// wxDefaultFileSelector - Generic load/save dialog (for internal use only) +//---------------------------------------------------------------------------- - -// Generic file load/save dialog (for internal use only) -// see wx[Load/Save]FileSelector static wxString wxDefaultFileSelector(bool load, const wxChar *what, const wxChar *extension, @@ -217,77 +277,28 @@ static wxString wxDefaultFileSelector(bool load, load ? wxOPEN : wxSAVE, parent); } -// Generic file load dialog +//---------------------------------------------------------------------------- +// wxLoadFileSelector +//---------------------------------------------------------------------------- + WXDLLEXPORT wxString wxLoadFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent) { - return wxDefaultFileSelector(TRUE, what, extension, default_name, parent); + return wxDefaultFileSelector(true, what, extension, default_name, parent); } -// Generic file save dialog +//---------------------------------------------------------------------------- +// wxSaveFileSelector +//---------------------------------------------------------------------------- + WXDLLEXPORT wxString wxSaveFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent) { - return wxDefaultFileSelector(FALSE, what, extension, default_name, parent); -} - - -// Parses the filterStr, returning the number of filters. -// Returns 0 if none or if there's a problem. -// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" - -int wxParseFileFilter(const wxString& filterStr, - wxArrayString& descriptions, - wxArrayString& filters) -{ - descriptions.Clear(); - filters.Clear(); - - wxString str(filterStr); - - wxString description, filter; - for ( int pos = 0; pos != wxNOT_FOUND; ) - { - pos = str.Find(wxT('|')); - if ( pos == wxNOT_FOUND ) - { - // if there are no '|'s at all in the string just take the entire - // string as filter - if ( filters.IsEmpty() ) - { - description.Add(wxEmptyString); - filters.Add(filterStr); - } - else - { - wxFAIL_MSG( _T("missing '|' in the wildcard string!") ); - } - - break; - } - - description = str.Left(pos); - str = str.Mid(pos + 1); - pos = str.Find(wxT('|')); - if ( pos == wxNOT_FOUND ) - { - filter = str; - } - else - { - filter = str.Left(pos); - str = str.Mid(pos + 1); - } - - descriptions.Add(description); - filters.Add(filter); - } - - return filters.GetCount(); + return wxDefaultFileSelector(false, what, extension, default_name, parent); } #endif // wxUSE_FILEDLG