X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/os2/filedlg.cpp diff --git a/src/os2/filedlg.cpp b/src/os2/filedlg.cpp index aee711ce99..d6d93809f3 100644 --- a/src/os2/filedlg.cpp +++ b/src/os2/filedlg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: filedlg.cpp +// Name: src/os2/filedlg.cpp // Purpose: wxFileDialog // Author: David Webster // Modified by: @@ -16,15 +16,18 @@ #pragma hdrstop #endif +#if wxUSE_FILEDLG + +#include "wx/filedlg.h" + #ifndef WX_PRECOMP - #include - #include "wx/defs.h" #include "wx/utils.h" #include "wx/msgdlg.h" - #include "wx/dialog.h" - #include "wx/filedlg.h" + #include "wx/filename.h" #include "wx/intl.h" #include "wx/log.h" + #include "wx/app.h" + #include "wx/math.h" #endif #define INCL_PM @@ -32,162 +35,294 @@ #include "wx/os2/private.h" -#include #include #include -IMPLEMENT_CLASS(wxFileDialog, wxDialog) - -wxString wxFileSelector( const char* title - ,const char* defaultDir - ,const char* defaultFileName - ,const char* defaultExtension - ,const char* filter - ,int flags - ,wxWindow* parent - ,int x - ,int y - ) +#include "wx/tokenzr.h" +#include "wx/modalhook.h" + +#define wxMAXPATH 1024 +#define wxMAXFILE 1024 +#define wxMAXEXT 5 + +#ifndef MAXPATH +# define MAXPATH 400 +#endif + +#ifndef MAXDRIVE +# define MAXDRIVE 3 +#endif + +#ifndef MAXFILE +# define MAXFILE 9 +#endif + +#ifndef MAXEXT +# define MAXEXT 5 +#endif + +IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) + +// ---------------------------------------------------------------------------- +// CLASS wxFileDialog +// ---------------------------------------------------------------------------- + +wxFileDialog::wxFileDialog ( + wxWindow* pParent +, const wxString& rsMessage +, const wxString& rsDefaultDir +, const wxString& rsDefaultFileName +, const wxString& rsWildCard +, long lStyle +, const wxPoint& rPos, + const wxSize& sz, + const wxString& name +) + :wxFileDialogBase(pParent, rsMessage, rsDefaultDir, rsDefaultFileName, rsWildCard, lStyle, rPos, sz, name) + { - // If there's a default extension specified but no filter, we create a suitable - // filter. - - wxString filter2(""); - if ( defaultExtension && !filter ) - filter2 = wxString("*.") + wxString(defaultExtension) ; - else if ( filter ) - filter2 = filter; - - wxString defaultDirString; - if (defaultDir) - defaultDirString = defaultDir; - else - defaultDirString = ""; + // NB: all style checks are done by wxFileDialogBase::Create - wxString defaultFilenameString; - if (defaultFileName) - defaultFilenameString = defaultFileName; - else - defaultFilenameString = ""; + m_filterIndex = 1; +} // end of wxFileDialog::wxFileDialog - wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y)); +void wxFileDialog::GetPaths ( + wxArrayString& rasPaths +) const +{ + wxString sDir(m_dir); + size_t nCount = m_fileNames.GetCount(); + + rasPaths.Empty(); + if (m_dir.Last() != wxT('\\')) + sDir += wxT('\\'); - if ( fileDialog.ShowModal() == wxID_OK ) + for ( size_t n = 0; n < nCount; n++ ) { - return fileDialog.GetPath(); + rasPaths.Add(sDir + m_fileNames[n]); } - else - return wxEmptyString; -} - -# ifndef MAXPATH -# define MAXPATH 400 -# endif - -# ifndef MAXDRIVE -# define MAXDRIVE 3 -# endif - -# ifndef MAXFILE -# define MAXFILE 9 -# endif - -# ifndef MAXEXT -# define MAXEXT 5 -# endif - -wxString wxFileSelectorEx( const char* title - ,const char* defaultDir - ,const char* defaultFileName - ,int* defaultFilterIndex - ,const char* filter - ,int flags - ,wxWindow* parent - ,int x - ,int y - ) +} // end of wxFileDialog::GetPaths + +int wxFileDialog::ShowModal() { - wxFileDialog fileDialog(parent, title ? title : "", defaultDir ? defaultDir : "", - defaultFileName ? defaultFileName : "", filter ? filter : "", flags, wxPoint(x, y)); + WX_HOOK_MODAL_DIALOG(); + + wxString sTheFilter; + wxString sFilterBuffer; + wxChar* pzFilterBuffer; + static wxChar zFileNameBuffer[wxMAXPATH]; // the file-name + HWND hWnd = 0; + wxChar zTitleBuffer[wxMAXFILE + 1 + wxMAXEXT]; // the file-name, without path + wxString sDir; + size_t i; + size_t nLen = m_dir.length(); + int nCount = 0; + FILEDLG vFileDlg; + ULONG lFlags = 0L; + + memset(&vFileDlg, '\0', sizeof(FILEDLG)); + if (m_parent) + hWnd = (HWND) m_parent->GetHWND(); + if (!hWnd && wxTheApp->GetTopWindow()) + hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND(); - if ( fileDialog.ShowModal() == wxID_OK ) + + *zFileNameBuffer = wxT('\0'); + *zTitleBuffer = wxT('\0'); + + if (m_windowStyle & wxFD_SAVE) + lFlags = FDS_SAVEAS_DIALOG; + else + lFlags = FDS_OPEN_DIALOG; + + if (m_windowStyle & wxFD_SAVE) + lFlags |= FDS_SAVEAS_DIALOG; + if (m_windowStyle & wxFD_MULTIPLE) + lFlags |= FDS_OPEN_DIALOG | FDS_MULTIPLESEL; + + vFileDlg.cbSize = sizeof(FILEDLG); + vFileDlg.fl = lFlags; + vFileDlg.pszTitle = (PSZ)zTitleBuffer; + + // + // 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 + // + sDir.reserve(nLen); + for ( i = 0; i < nLen; i++ ) { - *defaultFilterIndex = fileDialog.GetFilterIndex(); - return fileDialog.GetPath(); + wxChar ch = m_dir[i]; + + switch (ch) + { + case wxT('/'): + // + // Convert to backslash + // + ch = wxT('\\'); + + // + // Fall through + // + case wxT('\\'): + while (i < nLen - 1) + { + wxChar chNext = m_dir[i + 1]; + + if (chNext != wxT('\\') && chNext != wxT('/')) + break; + + // + // Ignore the next one, unless it is at the start of a UNC path + // + if (i > 0) + i++; + else + break; + } + + // + // Fall through + // + + default: + // + // Normal char + sDir += ch; + } } + if ( wxStrlen(m_wildCard) == 0 ) + sTheFilter = wxEmptyString; else - return wxEmptyString; -} - -wxFileDialog::wxFileDialog( wxWindow* parent - ,const wxString& message - ,const wxString& defaultDir - ,const wxString& defaultFileName - ,const wxString& wildCard - ,long style - ,const wxPoint& pos - ) -{ - m_message = message; - m_dialogStyle = style; - m_parent = parent; - m_path = ""; - m_fileName = defaultFileName; - m_dir = defaultDir; - m_wildCard = wildCard; - m_filterIndex = 1; -} + sTheFilter = m_wildCard; -int wxFileDialog::ShowModal() -{ - // TODO - return wxID_CANCEL; -} - -// Generic file load/save dialog -static wxString wxDefaultFileSelector( bool load - ,const char* what - ,const char* extension - ,const char* default_name - ,wxWindow* parent - ) -{ - char *ext = (char *)extension; - - char prompt[50]; - wxString str; - if (load) - str = "Load %s file"; - else - str = "Save %s file"; - sprintf(prompt, wxGetTranslation(str), what); - - if (*ext == '.') ext++; - char wild[60]; - sprintf(wild, "*.%s", ext); - - return wxFileSelector (prompt, NULL, default_name, ext, wild, 0, parent); -} - -// Generic file load dialog -wxString wxLoadFileSelector( const char* what - ,const char* extension - ,const char* default_name - ,wxWindow* parent - ) -{ - return wxDefaultFileSelector(TRUE, what, extension, default_name, parent); -} + wxStrtok(sTheFilter.wchar_str(), wxT("|"), &pzFilterBuffer); + while(pzFilterBuffer != NULL) + { + if (nCount > 0 && !(nCount % 2)) + sDir += wxT(";"); + if (nCount % 2) + { + sDir += pzFilterBuffer; + } + wxStrtok(NULL, wxT("|"), &pzFilterBuffer); + nCount++; + } + if (nCount == 0) + sDir += m_fileName; + if (sDir.empty()) + sDir = wxT("*.*"); + wxStrcpy((wxChar*)vFileDlg.szFullFile, sDir); + sFilterBuffer = sDir; + hWnd = ::WinFileDlg( HWND_DESKTOP + ,GetHwndOf(m_parent) + ,&vFileDlg + ); + if (hWnd && vFileDlg.lReturn == DID_OK) + { + m_fileNames.Empty(); + if ((m_windowStyle & wxFD_MULTIPLE ) && vFileDlg.ulFQFCount > 1) + { + for (int i = 0; i < (int)vFileDlg.ulFQFCount; i++) + { + if (i == 0) + { + m_dir = wxPathOnly(wxString((const wxChar*)*vFileDlg.papszFQFilename[0])); + m_path = (const wxChar*)*vFileDlg.papszFQFilename[0]; + } + m_fileName = wxFileNameFromPath(wxString((const wxChar*)*vFileDlg.papszFQFilename[i])); + m_fileNames.Add(m_fileName); + } + ::WinFreeFileDlgList(vFileDlg.papszFQFilename); + } + else if (!(m_windowStyle & wxFD_SAVE)) + { + m_path = (wxChar*)vFileDlg.szFullFile; + m_fileName = wxFileNameFromPath(wxString((const wxChar*)vFileDlg.szFullFile)); + m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile); + } + else // save file + { + const wxChar* pzExtension = NULL; -// Generic file save dialog -wxString wxSaveFileSelector( const char* what - ,const char* extension - ,const char* default_name - ,wxWindow* parent - ) -{ - return wxDefaultFileSelector(FALSE, what, extension, default_name, parent); -} + wxStrcpy(zFileNameBuffer, (const wxChar*)vFileDlg.szFullFile); + + int nIdx = wxStrlen(zFileNameBuffer) - 1; + wxString sExt; + wxFileName::SplitPath( zFileNameBuffer + ,&m_path + ,&m_fileName + ,&sExt + ); + if (zFileNameBuffer[nIdx] == wxT('.') || sExt.empty()) + { + zFileNameBuffer[nIdx] = 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") + // + pzExtension = sFilterBuffer.c_str(); + + for( int i = 0; i < (int)sFilterBuffer.length(); i++ ) + { + // + // Get extension + // + pzExtension = wxStrrchr(pzExtension, wxT('.')); + if ( pzExtension && + !wxStrrchr(pzExtension, wxT('*')) && + !wxStrrchr(pzExtension, wxT('?')) && + pzExtension[1] && + pzExtension[1] != wxT(' ') + ) // != "blabla. " + { + // + // Now concat extension to the fileName: + // + m_path = wxString(zFileNameBuffer) + pzExtension; + } + } + } + else + { + m_path = (wxChar*)vFileDlg.szFullFile; + } + m_fileName = wxFileNameFromPath((const wxChar*)vFileDlg.szFullFile); + m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile); + + // + // === Simulating the wxFD_OVERWRITE_PROMPT >>============================ + // + if ((m_windowStyle & wxFD_OVERWRITE_PROMPT) && + (m_windowStyle & wxFD_SAVE) && + (wxFileExists(m_path.c_str()))) + { + wxString sMessageText; + + sMessageText.Printf( _("File '%s' already exists.\nDo you want to replace it?") + ,m_path.c_str() + ); + if (wxMessageBox( sMessageText + ,wxT("Save File As") + ,wxYES_NO | wxICON_EXCLAMATION + ) != wxYES) + { + return wxID_CANCEL; + } + } + } + return wxID_OK; + } + return wxID_CANCEL; +} // end of wxFileDialog::ShowModal +#endif // wxUSE_FILEDLG