#pragma hdrstop
#endif
+#if wxUSE_FILEDLG
+
#ifndef WX_PRECOMP
#include "wx/utils.h"
#include "wx/msgdlg.h"
#include "wx/tokenzr.h"
+#ifndef OFN_EXPLORER
+ #define OFN_EXPLORER 0x00080000
+#endif
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
- long style, const wxPoint& pos)
+ long style, const wxPoint& WXUNUSED(pos))
{
m_message = message;
m_dialogStyle = style;
msw_flags |= OFN_HIDEREADONLY;
if ( m_dialogStyle & wxFILE_MUST_EXIST )
msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+
if (m_dialogStyle & wxMULTIPLE )
- msw_flags |=
-#if defined(OFN_EXPLORER)
- OFN_EXPLORER |
-#endif // OFN_EXPLORER
- OFN_ALLOWMULTISELECT;
+ {
+ // OFN_EXPLORER must always be specified with OFN_ALLOWMULTISELECT
+ msw_flags |= OFN_EXPLORER | OFN_ALLOWMULTISELECT;
+ }
+
+ // if wxCHANGE_DIR flag is not given we shouldn't change the CWD which the
+ // standard dialog does by default
if ( !(m_dialogStyle & wxCHANGE_DIR) )
+ {
msw_flags |= OFN_NOCHANGEDIR;
+ }
+
+ if ( m_dialogStyle & wxOVERWRITE_PROMPT )
+ {
+ msw_flags |= OFN_OVERWRITEPROMPT;
+ }
OPENFILENAME of;
wxZeroMemory(of);
of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; // Windows 3.0 and 3.1
// Convert forward slashes to backslashes (file selector doesn't like
- // forward slashes)
- size_t i = 0;
- size_t len = m_dir.Length();
- for (i = 0; i < len; i++)
- if (m_dir[i] == wxT('/'))
- m_dir[i] = wxT('\\');
+ // 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 i, len = m_dir.length();
+ dir.reserve(len);
+ for ( i = 0; i < len; i++ )
+ {
+ wxChar ch = m_dir[i];
+ switch ( ch )
+ {
+ case _T('/'):
+ // convert to backslash
+ ch = _T('\\');
+
+ // fall through
+
+ case _T('\\'):
+ while ( i < len - 1 )
+ {
+ wxChar chNext = m_dir[i + 1];
+ if ( chNext != _T('\\') && chNext != _T('/') )
+ break;
+
+ // ignore the next one
+ i++;
+ }
+ // fall through
- of.lpstrInitialDir = m_dir.c_str();
+ default:
+ // normal char
+ dir += ch;
+ }
+ }
+
+ of.lpstrInitialDir = dir.c_str();
of.Flags = msw_flags;
: (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 )
{
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);
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;
m_fileNames.Add(m_fileName);
m_dir = wxPathOnly(fileNameBuffer);
}
-
-
- //=== Simulating the wxOVERWRITE_PROMPT >>============================
-
- if ( (m_dialogStyle & wxOVERWRITE_PROMPT) &&
- ::wxFileExists( fileNameBuffer ) )
- {
- wxString messageText;
- messageText.Printf(_("Replace file '%s'?"), fileNameBuffer);
-
- if ( wxMessageBox(messageText, m_message, wxYES_NO ) != wxYES )
- {
- success = FALSE;
- }
- }
-
}
else
{
const wxChar *default_name,
wxWindow *parent)
{
- wxString prompt;
- wxString str;
- if (load) str = _("Load %s file");
- else str = _("Save %s file");
- prompt.Printf(str, what);
+ wxString prompt;
+ wxString str;
+ if (load)
+ str = _("Load %s file");
+ else
+ str = _("Save %s file");
+ prompt.Printf(str, what);
- const wxChar *ext = extension;
- if (*ext == wxT('.'))
- ext++;
+ const wxChar *ext = extension;
+ if (*ext == wxT('.'))
+ ext++;
- wxString wild;
- wild.Printf(wxT("*.%s"), ext);
+ wxString wild;
+ wild.Printf(wxT("*.%s"), ext);
- return wxFileSelector (prompt, NULL, default_name, ext, wild, 0, parent);
+ return wxFileSelector(prompt, NULL, default_name, ext, wild,
+ load ? wxOPEN : wxSAVE, parent);
}
// Generic file load dialog
return wxDefaultFileSelector(FALSE, what, extension, default_name, parent);
}
+#endif // wxUSE_FILEDLG