X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99d1b93d89f1ccc192c28319bab20837d6586645..5ed738a766bb06539893bd424759e75926c43e15:/src/msw/filedlg.cpp diff --git a/src/msw/filedlg.cpp b/src/msw/filedlg.cpp index c69ed436ec..4f0d03e243 100644 --- a/src/msw/filedlg.cpp +++ b/src/msw/filedlg.cpp @@ -287,10 +287,11 @@ int wxFileDialog::ShowModal() // Convert forward slashes to backslashes (file selector doesn't like // forward slashes) and also squeeze multiple consecutive slashes into one // as it doesn't like two backslashes in a row neither - wxString dir; - size_t len = m_dir.length(); + + wxString dir; + size_t i, len = m_dir.length(); dir.reserve(len); - for ( size_t i = 0; i < len; i++ ) + for ( i = 0; i < len; i++ ) { wxChar ch = m_dir[i]; switch ( ch ) @@ -397,7 +398,30 @@ int wxFileDialog::ShowModal() : (GetOpenFileName(&of) != 0); } } -#endif + +#if wxUSE_UNICODE_MSLU && defined(OFN_EXPLORER) + // VS: there's a bug in unicows.dll - when multiple files are selected, + // of.nFileOffset doesn't point to the first filename but rather to + // the last component of directory name. This bug is known to MSLU + // developers, but they are not going to fix it: "this is a true + // limitation, that we have decided to live with" and "working + // harder on this case just did not seem worth the effort"... + // + // Our only option is to try to fix it ourselves: + + if ( (m_dialogStyle & wxMULTIPLE) && + (fileNameBuffer[of.nFileOffset-1] != wxT('\0')) && + wxGetOsVersion() == wxWIN95 /*using unicows.dll*/) + { + if ( wxDirExists(fileNameBuffer) ) + { + // 1st component is dir => multiple files selected + of.nFileOffset = wxStrlen(fileNameBuffer)+1; + } + } +#endif // wxUSE_UNICODE_MSLU + +#endif // __WIN32__ if ( success ) { @@ -423,7 +447,7 @@ int wxFileDialog::ShowModal() i += wxStrlen(&fileNameBuffer[i]) + 1; } #else - wxStringTokenizer toke(fileNameBuffer, " \t\r\n"); + wxStringTokenizer toke(fileNameBuffer, _T(" \t\r\n")); m_dir = toke.GetNextToken(); m_fileName = toke.GetNextToken(); m_fileNames.Add(m_fileName); @@ -447,9 +471,21 @@ int wxFileDialog::ShowModal() m_filterIndex = (int)of.nFilterIndex - 1; - if ( !of.nFileExtension || (of.nFileExtension && fileNameBuffer[ of.nFileExtension-1] != wxT('.')) ) - { // user has typed an filename - // without an extension: + if ( !of.nFileExtension || + (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) ) + { + // User has typed a filename without an extension: + + // A filename can end in a "." here ("abc."), this means it + // does not have an extension. Because later on a "." with + // the default extension is appended we remove the "." if + // filename ends with one (We don't want files called + // "abc..ext") + int idx = wxStrlen(fileNameBuffer) - 1; + if ( fileNameBuffer[idx] == wxT('.') ) + { + fileNameBuffer[idx] = wxT('\0'); + } int maxFilter = (int)(of.nFilterIndex*2L-1L); extension = filterBuffer;