X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0627d0917bc2e34724055f72e6c36787a7de642f..a4a162522b875bc7cb23f1d165703f71bd7010f7:/src/msw/filedlg.cpp diff --git a/src/msw/filedlg.cpp b/src/msw/filedlg.cpp index 89bf4ae96c..4f0d03e243 100644 --- a/src/msw/filedlg.cpp +++ b/src/msw/filedlg.cpp @@ -398,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 ) { @@ -424,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); @@ -448,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;