X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc42eb7afcb5c2c5da6178617e8a2b8c3a1a6c6e..097aeb99031e36e4306926d652e4bcccda8b71cb:/src/msw/filedlg.cpp diff --git a/src/msw/filedlg.cpp b/src/msw/filedlg.cpp index 0bc3273b38..805374a8e9 100644 --- a/src/msw/filedlg.cpp +++ b/src/msw/filedlg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: filedlg.cpp +// Name: src/msw/filedlg.cpp // Purpose: wxFileDialog // Author: Julian Smart // Modified by: @@ -9,6 +9,14 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ #pragma implementation "filedlg.h" #endif @@ -27,10 +35,11 @@ #include "wx/filedlg.h" #include "wx/intl.h" #include "wx/log.h" - - #include "wx/msw/private.h" + #include "wx/app.h" #endif +#include "wx/msw/private.h" + #if !defined(__WIN32__) || defined(__SALFORDC__) || defined(__WXWINE__) #include #endif @@ -41,8 +50,34 @@ #include "wx/tokenzr.h" +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#ifdef __WIN32__ +# define wxMAXPATH 4096 +#else +# define wxMAXPATH 1024 +#endif + +# define wxMAXFILE 1024 + +# define wxMAXEXT 5 + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + IMPLEMENT_CLASS(wxFileDialog, wxDialog) +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + wxString wxFileSelector(const wxChar *title, const wxChar *defaultDir, const wxChar *defaultFileName, @@ -83,7 +118,7 @@ wxString wxFileSelector(const wxChar *title, flags, wxPoint(x, y)); if( wxStrlen(defaultExtension) != 0 ) { - int filterFind = 1, + int filterFind = 0, filterIndex = 0; for( unsigned int i = 0; i < filter2.Len(); i++ ) @@ -92,7 +127,6 @@ wxString wxFileSelector(const wxChar *title, { // save the start index of the new filter unsigned int is = i++; - filterIndex++; // find the end of the filter for( ; i < filter2.Len(); i++ ) @@ -104,46 +138,27 @@ wxString wxFileSelector(const wxChar *title, if( i-is-1 > 0 && is+1 < filter2.Len() ) { if( filter2.Mid(is+1,i-is-1).Contains(defaultExtension) ) -// if( filter2.Mid(is+1,i-is-1) == defaultExtension ) { filterFind = filterIndex; break; } } + + filterIndex++; } } fileDialog.SetFilterIndex(filterFind); } + wxString filename; if ( fileDialog.ShowModal() == wxID_OK ) { - wxStrcpy(wxBuffer, (const wxChar *)fileDialog.GetPath()); - return wxBuffer; + filename = fileDialog.GetPath(); } - else - return wxGetEmptyString(); -} - -# if __BORLANDC__ -# include // for MAXPATH etc. ( Borland 3.1 ) -# endif - -# ifndef MAXPATH -# define MAXPATH 400 -# endif - -# ifndef MAXDRIVE -# define MAXDRIVE 3 -# endif - -# ifndef MAXFILE -# define MAXFILE 9 -# endif -# ifndef MAXEXT -# define MAXEXT 5 -# endif + return filename; +} wxString wxFileSelectorEx(const wxChar *title, @@ -157,17 +172,23 @@ wxString wxFileSelectorEx(const wxChar *title, int y) { - wxFileDialog fileDialog(parent, title ? title : wxT(""), defaultDir ? defaultDir : wxT(""), - defaultFileName ? defaultFileName : wxT(""), filter ? filter : wxT(""), flags, wxPoint(x, y)); + wxFileDialog fileDialog(parent, + title ? title : wxT(""), + defaultDir ? defaultDir : wxT(""), + defaultFileName ? defaultFileName : wxT(""), + filter ? filter : wxT(""), + flags, wxPoint(x, y)); + wxString filename; if ( fileDialog.ShowModal() == wxID_OK ) { - *defaultFilterIndex = fileDialog.GetFilterIndex(); - wxStrcpy(wxBuffer, (const wxChar *)fileDialog.GetPath()); - return wxBuffer; + if ( defaultFilterIndex ) + *defaultFilterIndex = fileDialog.GetFilterIndex(); + + filename = fileDialog.GetPath(); } - else - return wxGetEmptyString(); + + return filename; } wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, @@ -183,7 +204,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, m_fileName = defaultFileName; m_dir = defaultDir; m_wildCard = wildCard; - m_filterIndex = 1; + m_filterIndex = 0; } void wxFileDialog::GetPaths(wxArrayString& paths) const @@ -205,9 +226,11 @@ int wxFileDialog::ShowModal() { HWND hWnd = 0; if (m_parent) hWnd = (HWND) m_parent->GetHWND(); + if (!hWnd && wxTheApp->GetTopWindow()) + hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND(); - static wxChar fileNameBuffer [ MAXPATH ]; // the file-name - wxChar titleBuffer [ MAXFILE+1+MAXEXT ]; // the file-name, without path + static wxChar fileNameBuffer [ wxMAXPATH ]; // the file-name + wxChar titleBuffer [ wxMAXFILE+1+wxMAXEXT ]; // the file-name, without path *fileNameBuffer = wxT('\0'); *titleBuffer = wxT('\0'); @@ -225,22 +248,23 @@ int wxFileDialog::ShowModal() OFN_ALLOWMULTISELECT; OPENFILENAME of; - memset(&of, 0, sizeof(OPENFILENAME)); - - of.lpstrCustomFilter = NULL; // system should not save custom filter - of.nMaxCustFilter = 0L; - - of.nFileOffset = 0; // 0-based pointer to filname in lpstFile - of.nFileExtension = 0; // 0-based pointer to extension in lpstrFile - of.lpstrDefExt = NULL; // no default extension - + wxZeroMemory(of); + + // the OPENFILENAME struct has been extended in newer version of + // comcdlg32.dll, but as we don't use the extended fields anyhow, set + // the struct size to the old value - otherwise, the programs compiled + // with new headers will not work with the old libraries +#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) + of.lStructSize = sizeof(OPENFILENAME) - + (sizeof(void *) + 2*sizeof(DWORD)); +#else // old headers of.lStructSize = sizeof(OPENFILENAME); +#endif + of.hwndOwner = hWnd; of.lpstrTitle = WXSTRINGCAST m_message; - - of.lpstrFileTitle = titleBuffer; - of.nMaxFileTitle = MAXFILE + 1 + MAXEXT; // Windows 3.0 and 3.1 + of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; // Windows 3.0 and 3.1 // Convert forward slashes to backslashes (file selector doesn't like // forward slashes) @@ -297,16 +321,38 @@ int wxFileDialog::ShowModal() //=== Setting defaultFileName >>========================================= - wxStrncpy( fileNameBuffer, (const wxChar *)m_fileName, MAXPATH-1 ); - fileNameBuffer[ MAXPATH-1 ] = wxT('\0'); + wxStrncpy( fileNameBuffer, (const wxChar *)m_fileName, wxMAXPATH-1 ); + fileNameBuffer[ wxMAXPATH-1 ] = wxT('\0'); of.lpstrFile = fileNameBuffer; // holds returned filename - of.nMaxFile = MAXPATH; + of.nMaxFile = wxMAXPATH; //== Execute FileDialog >>================================================= - bool success = (m_dialogStyle & wxSAVE) ? (GetSaveFileName(&of) != 0) + bool success = (m_dialogStyle & wxSAVE ? GetSaveFileName(&of) + : GetOpenFileName(&of)) != 0; + + DWORD errCode = CommDlgExtendedError(); + +#ifdef __WIN32__ + if (!success && (errCode == CDERR_STRUCTSIZE)) + { + // The struct size has changed so try a smaller or bigger size + + int oldStructSize = of.lStructSize; + of.lStructSize = oldStructSize - (sizeof(void *) + 2*sizeof(DWORD)); + success = (m_dialogStyle & wxSAVE) ? (GetSaveFileName(&of) != 0) : (GetOpenFileName(&of) != 0); + errCode = CommDlgExtendedError(); + + if (!success && (errCode == CDERR_STRUCTSIZE)) + { + of.lStructSize = oldStructSize + (sizeof(void *) + 2*sizeof(DWORD)); + success = (m_dialogStyle & wxSAVE) ? (GetSaveFileName(&of) != 0) + : (GetOpenFileName(&of) != 0); + } + } +#endif if ( success ) { @@ -356,7 +402,7 @@ int wxFileDialog::ShowModal() m_filterIndex = (int)of.nFilterIndex - 1; - if ( of.nFileExtension && fileNameBuffer[ of.nFileExtension-1] != wxT('.') ) + if ( !of.nFileExtension || (of.nFileExtension && fileNameBuffer[ of.nFileExtension-1] != wxT('.')) ) { // user has typed an filename // without an extension: @@ -378,8 +424,8 @@ int wxFileDialog::ShowModal() m_fileName = wxString(fileNameBuffer) + extension; int len = wxStrlen( fileNameBuffer ); - wxStrncpy( fileNameBuffer + len, extension, MAXPATH - len ); - fileNameBuffer[ MAXPATH -1 ] = wxT('\0'); + wxStrncpy( fileNameBuffer + len, extension, wxMAXPATH - len ); + fileNameBuffer[ wxMAXPATH -1 ] = wxT('\0'); } }