X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f0a56ab0c38aac05101593488c7e0972c36c38b7..9f7948af90ec2e3b907944e7d979f0863910c5c8:/src/os2/filedlg.cpp diff --git a/src/os2/filedlg.cpp b/src/os2/filedlg.cpp index 20e3c39cde..7e126680c3 100644 --- a/src/os2/filedlg.cpp +++ b/src/os2/filedlg.cpp @@ -9,150 +9,310 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/dialog.h" -#include "wx/filedlg.h" -#include "wx/intl.h" - -#if !USE_SHARED_LIBRARY -IMPLEMENT_CLASS(wxFileDialog, wxDialog) +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/msgdlg.h" + #include "wx/filedlg.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" #endif -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 - ) +#define INCL_PM +#include + +#include "wx/os2/private.h" + +#include +#include +#include + +#include "wx/tokenzr.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 +) + :wxFileDialogBase(pParent, rsMessage, rsDefaultDir, rsDefaultFileName, rsWildCard, lStyle, rPos) + { - // 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 = ""; + if ((m_dialogStyle & wxMULTIPLE) && (m_dialogStyle & wxSAVE)) + m_dialogStyle &= ~wxMULTIPLE; - wxString defaultFilenameString; - if (defaultFileName) - defaultFilenameString = defaultFileName; - else - defaultFilenameString = ""; + m_filterIndex = 1; +} // end of wxFileDialog::wxFileDialog + +void wxFileDialog::GetPaths ( + wxArrayString& rasPaths +) const +{ + wxString sDir(m_dir); + size_t nCount = m_fileNames.GetCount(); - wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y)); + rasPaths.Empty(); + if (m_dir.Last() != _T('\\')) + sDir += _T('\\'); - 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; -} - -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)); + 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(); + + + *zFileNameBuffer = wxT('\0'); + *zTitleBuffer = wxT('\0'); - if ( fileDialog.ShowModal() == wxID_OK ) + if (m_dialogStyle & wxSAVE) + lFlags = FDS_SAVEAS_DIALOG; + else + lFlags = FDS_OPEN_DIALOG; + + if ((m_dialogStyle & wxHIDE_READONLY) || (m_dialogStyle & wxSAVE)) + lFlags |= FDS_SAVEAS_DIALOG; + if (m_dialogStyle & wxMULTIPLE ) + lFlags |= FDS_OPEN_DIALOG | FDS_MULTIPLESEL; + + vFileDlg.cbSize = sizeof(FILEDLG); + vFileDlg.fl = lFlags; + vFileDlg.pszTitle = 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 _T('/'): + // + // Convert to backslash + // + ch = _T('\\'); + + // + // Fall through + // + case _T('\\'): + while (i < nLen - 1) + { + wxChar chNext = m_dir[i + 1]; + + if (chNext != _T('\\') && chNext != _T('/')) + 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 = ""; 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); -} + pzFilterBuffer = strtok((char*)sTheFilter.c_str(), "|"); + while(pzFilterBuffer != NULL) + { + if (nCount > 0 && !(nCount % 2)) + sDir += wxT(";"); + if (nCount % 2) + { + sDir += pzFilterBuffer; + } + pzFilterBuffer = strtok(NULL, "|"); + nCount++; + } + if (nCount == 0) + sDir += m_fileName; + if (sDir.IsEmpty()) + sDir = "*.*"; + wxStrcpy(vFileDlg.szFullFile, sDir.c_str()); + sFilterBuffer = sDir; + hWnd = ::WinFileDlg( HWND_DESKTOP + ,GetHwndOf(m_parent) + ,&vFileDlg + ); + if (hWnd && vFileDlg.lReturn == DID_OK) + { + m_fileNames.Empty(); + if ((m_dialogStyle & wxMULTIPLE ) && vFileDlg.ulFQFCount > 1) + { + for (int i = 0; i < vFileDlg.ulFQFCount; i++) + { + if (i == 0) + { + m_dir = wxPathOnly(wxString((const char*)*vFileDlg.papszFQFilename[0])); + m_path = (const char*)*vFileDlg.papszFQFilename[0]; + } + m_fileName = wxFileNameFromPath(wxString((const char*)*vFileDlg.papszFQFilename[i])); + m_fileNames.Add(m_fileName); + } + ::WinFreeFileDlgList(vFileDlg.papszFQFilename); + } + else if (!(m_dialogStyle & wxSAVE)) + { + m_path = vFileDlg.szFullFile; + m_fileName = wxFileNameFromPath(vFileDlg.szFullFile); + m_dir = wxPathOnly(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, vFileDlg.szFullFile); + int nIdx = wxStrlen(zFileNameBuffer) - 1; + wxString sExt; + + wxSplitPath( zFileNameBuffer + ,&m_path + ,&m_fileName + ,&sExt + ); + if (zFileNameBuffer[nIdx] == wxT('.') || sExt.IsEmpty()) + { + 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 < 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 = vFileDlg.szFullFile; + } + m_fileName = wxFileNameFromPath(vFileDlg.szFullFile); + m_dir = wxPathOnly(vFileDlg.szFullFile); + + // + // === Simulating the wxOVERWRITE_PROMPT >>============================ + // + if ((m_dialogStyle & wxOVERWRITE_PROMPT) && + (m_dialogStyle & wxSAVE) && + (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