X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/efaa0436fbf19a51d16fcd13fe9a764ec1bfc6de..abd474ea63667f727940a009cc3e0b23ba9f418f:/src/common/fldlgcmn.cpp diff --git a/src/common/fldlgcmn.cpp b/src/common/fldlgcmn.cpp index 01e9facb94..17ff42633b 100644 --- a/src/common/fldlgcmn.cpp +++ b/src/common/fldlgcmn.cpp @@ -1,24 +1,26 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/fldlgcmn.cpp +// Name: src/common/fldlgcmn.cpp // Purpose: wxFileDialog common functions // Author: John Labenski // Modified by: // Created: 14.06.03 (extracted from src/*/filedlg.cpp) -// RCS-ID: +// RCS-ID: $Id$ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "filedlg.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" +#if wxUSE_FILEDLG + +#include "wx/filedlg.h" +#include "wx/dirdlg.h" +#include "wx/filename.h" #ifndef WX_PRECOMP #include "wx/string.h" @@ -26,9 +28,15 @@ #include "wx/window.h" #endif // WX_PRECOMP -#include "wx/filedlg.h" - -#if wxUSE_FILEDLG +extern WXDLLEXPORT_DATA(const char) wxFileDialogNameStr[] = "filedlg"; +extern WXDLLEXPORT_DATA(const char) wxFileSelectorPromptStr[] = "Select a file"; +extern WXDLLEXPORT_DATA(const char) wxFileSelectorDefaultWildcardStr[] = +#if defined(__WXMSW__) || defined(__OS2__) + "*.*" +#else // Unix/Mac + "*" +#endif + ; //---------------------------------------------------------------------------- // wxFileDialogBase @@ -36,84 +44,89 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileDialogBase, wxDialog) -wxFileDialogBase::wxFileDialogBase(wxWindow *parent, - const wxString& message, - const wxString& defaultDir, - const wxString& defaultFile, - const wxString& wildCard, - long style, - const wxPoint& WXUNUSED(pos)) +void wxFileDialogBase::Init() +{ + m_filterIndex = 0; + m_windowStyle = 0; + m_extraControl = NULL; + m_extraControlCreator = NULL; +} + +bool wxFileDialogBase::Create(wxWindow *parent, + const wxString& message, + const wxString& defaultDir, + const wxString& defaultFile, + const wxString& wildCard, + long style, + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(sz), + const wxString& WXUNUSED(name)) { - m_parent = parent; m_message = message; m_dir = defaultDir; m_fileName = defaultFile; - if (wildCard.IsEmpty()) m_wildCard = wxFileSelectorDefaultWildcardStr; - m_dialogStyle = style; - m_path = wxT(""); + m_wildCard = wildCard; + + m_parent = parent; + m_windowStyle = style; m_filterIndex = 0; - // convert m_wildCard from "*.bar" to "Files (*.bar)|*.bar" - if ( m_wildCard.Find(wxT('|')) == wxNOT_FOUND ) - { - m_wildCard = wxString::Format(_("Files (%s)|%s"), - m_wildCard.c_str(), m_wildCard.c_str()); - } -} + if (!HasFdFlag(wxFD_OPEN) && !HasFdFlag(wxFD_SAVE)) + m_windowStyle |= wxFD_OPEN; // wxFD_OPEN is the default -// Parses the filterStr, returning the number of filters. -// Returns 0 if none or if there's a problem. -// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" + // check that the styles are not contradictory + wxASSERT_MSG( !(HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OPEN)), + wxT("can't specify both wxFD_SAVE and wxFD_OPEN at once") ); -int wxFileDialogBase::ParseWildcard(const wxString& filterStr, - wxArrayString& descriptions, - wxArrayString& filters) -{ - descriptions.Clear(); - filters.Clear(); + wxASSERT_MSG( !HasFdFlag(wxFD_SAVE) || + (!HasFdFlag(wxFD_MULTIPLE) && !HasFdFlag(wxFD_FILE_MUST_EXIST)), + wxT("wxFD_MULTIPLE or wxFD_FILE_MUST_EXIST can't be used with wxFD_SAVE" ) ); - wxString str(filterStr); + wxASSERT_MSG( !HasFdFlag(wxFD_OPEN) || !HasFdFlag(wxFD_OVERWRITE_PROMPT), + wxT("wxFD_OVERWRITE_PROMPT can't be used with wxFD_OPEN") ); - wxString description, filter; - for ( int pos = 0; pos != wxNOT_FOUND; ) + if ( wildCard.empty() || wildCard == wxFileSelectorDefaultWildcardStr ) + { + m_wildCard = wxString::Format(_("All files (%s)|%s"), + wxFileSelectorDefaultWildcardStr, + wxFileSelectorDefaultWildcardStr); + } + else // have wild card { - pos = str.Find(wxT('|')); - if ( pos == wxNOT_FOUND ) + // convert m_wildCard from "*.bar" to "bar files (*.bar)|*.bar" + if ( m_wildCard.Find(wxT('|')) == wxNOT_FOUND ) { - // if there are no '|'s at all in the string just take the entire - // string as filter - if ( filters.IsEmpty() ) - { - descriptions.Add(filterStr); - filters.Add(filterStr); - } + wxString::size_type nDot = m_wildCard.find(wxT("*.")); + if ( nDot != wxString::npos ) + nDot++; else - { - wxFAIL_MSG( _T("missing '|' in the wildcard string!") ); - } - - break; + nDot = 0; + + m_wildCard = wxString::Format + ( + _("%s files (%s)|%s"), + wildCard.c_str() + nDot, + wildCard.c_str(), + wildCard.c_str() + ); } + } - description = str.Left(pos); - str = str.Mid(pos + 1); - pos = str.Find(wxT('|')); - if ( pos == wxNOT_FOUND ) - { - filter = str; - } - else - { - filter = str.Left(pos); - str = str.Mid(pos + 1); - } + return true; +} - descriptions.Add(description); - filters.Add(filter); - } +#if WXWIN_COMPATIBILITY_2_6 +long wxFileDialogBase::GetStyle() const +{ + return GetWindowStyle(); +} - return filters.GetCount(); +void wxFileDialogBase::SetStyle(long style) +{ + SetWindowStyle(style); } +#endif // WXWIN_COMPATIBILITY_2_6 + wxString wxFileDialogBase::AppendExtension(const wxString &filePath, const wxString &extensionList) @@ -122,16 +135,16 @@ wxString wxFileDialogBase::AppendExtension(const wxString &filePath, wxString fileName = filePath.AfterLast(wxFILE_SEP_PATH); // if fileName is of form "foo.bar" it's ok, return it - int idx_dot = fileName.Find(wxT('.'), TRUE); - if ((idx_dot != wxNOT_FOUND) && (idx_dot < (int)fileName.Len() - 1)) + int idx_dot = fileName.Find(wxT('.'), true); + if ((idx_dot != wxNOT_FOUND) && (idx_dot < (int)fileName.length() - 1)) return filePath; // get the first extension from extensionList, or all of it wxString ext = extensionList.BeforeFirst(wxT(';')); // if ext == "foo" or "foo." there's no extension - int idx_ext_dot = ext.Find(wxT('.'), TRUE); - if ((idx_ext_dot == wxNOT_FOUND) || (idx_ext_dot == (int)ext.Len() - 1)) + int idx_ext_dot = ext.Find(wxT('.'), true); + if ((idx_ext_dot == wxNOT_FOUND) || (idx_ext_dot == (int)ext.length() - 1)) return filePath; else ext = ext.AfterLast(wxT('.')); @@ -139,7 +152,7 @@ wxString wxFileDialogBase::AppendExtension(const wxString &filePath, // if ext == "*" or "bar*" or "b?r" or " " then its not valid if ((ext.Find(wxT('*')) != wxNOT_FOUND) || (ext.Find(wxT('?')) != wxNOT_FOUND) || - (ext.Strip(wxString::both).IsEmpty())) + (ext.Strip(wxString::both).empty())) return filePath; // if fileName doesn't have a '.' then add one @@ -149,20 +162,70 @@ wxString wxFileDialogBase::AppendExtension(const wxString &filePath, return filePath + ext; } +bool wxFileDialogBase::SetExtraControlCreator(ExtraControlCreatorFunction creator) +{ + wxCHECK_MSG( !m_extraControlCreator, false, + "wxFileDialog::SetExtraControl() called second time" ); + + m_extraControlCreator = creator; + return SupportsExtraControl(); +} + +bool wxFileDialogBase::CreateExtraControl() +{ + if (!m_extraControlCreator || m_extraControl) + return false; + m_extraControl = (*m_extraControlCreator)(this); + return true; +} + +wxSize wxFileDialogBase::GetExtraControlSize() +{ + if ( !m_extraControlCreator ) + return wxDefaultSize; + + // create the extra control in an empty dialog just to find its size: this + // is not terribly efficient but we do need to know the size before + // creating the native dialog and this seems to be the only way + wxDialog dlg(NULL, wxID_ANY, ""); + return (*m_extraControlCreator)(&dlg)->GetSize(); +} + +void wxFileDialogBase::SetPath(const wxString& path) +{ + wxString ext; + wxFileName::SplitPath(path, &m_dir, &m_fileName, &ext); + if ( !ext.empty() ) + m_fileName << wxT('.') << ext; + m_path = path; +} + +void wxFileDialogBase::SetDirectory(const wxString& dir) +{ + m_dir = dir; + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); +} + +void wxFileDialogBase::SetFilename(const wxString& name) +{ + m_fileName = name; + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); +} + //---------------------------------------------------------------------------- // wxFileDialog convenience functions //---------------------------------------------------------------------------- -wxString wxFileSelector(const wxChar *title, - const wxChar *defaultDir, - const wxChar *defaultFileName, - const wxChar *defaultExtension, - const wxChar *filter, - int flags, - wxWindow *parent, - int x, int y) +wxString wxFileSelector(const wxString& title, + const wxString& defaultDir, + const wxString& defaultFileName, + const wxString& defaultExtension, + const wxString& filter, + int flags, + wxWindow *parent, + int x, int y) { - // The defaultExtension, if non-NULL, is + // The defaultExtension, if non-empty, is // appended to the filename if the user fails to type an extension. The new // implementation (taken from wxFileSelectorEx) appends the extension // automatically, by looking at the filter specification. In fact this @@ -174,43 +237,35 @@ wxString wxFileSelector(const wxChar *title, // suitable filter. wxString filter2; - if ( defaultExtension && !filter ) + if ( !defaultExtension.empty() && filter.empty() ) filter2 = wxString(wxT("*.")) + defaultExtension; - else if ( filter ) + else if ( !filter.empty() ) filter2 = filter; - wxString defaultDirString; - if (defaultDir) - defaultDirString = defaultDir; - - wxString defaultFilenameString; - if (defaultFileName) - defaultFilenameString = defaultFileName; - - wxFileDialog fileDialog(parent, title, defaultDirString, - defaultFilenameString, filter2, + wxFileDialog fileDialog(parent, title, defaultDir, + defaultFileName, filter2, flags, wxPoint(x, y)); - // if filter is of form "All files (*)|*|..." set correct filter index - if((wxStrlen(defaultExtension) != 0) && (filter2.Find(wxT('|')) != wxNOT_FOUND)) - { + // if filter is of form "All files (*)|*|..." set correct filter index + if ( !defaultExtension.empty() && filter2.find(wxT('|')) != wxString::npos ) + { int filterIndex = 0; wxArrayString descriptions, filters; // don't care about errors, handled already by wxFileDialog - (void)wxFileDialogBase::ParseWildcard(filter2, descriptions, filters); + (void)wxParseCommonDialogsFilter(filter2, descriptions, filters); for (size_t n=0; n 0) fileDialog.SetFilterIndex(filterIndex); - } + } wxString filename; if ( fileDialog.ShowModal() == wxID_OK ) @@ -225,22 +280,22 @@ wxString wxFileSelector(const wxChar *title, // wxFileSelectorEx //---------------------------------------------------------------------------- -wxString wxFileSelectorEx(const wxChar *title, - const wxChar *defaultDir, - const wxChar *defaultFileName, - int* defaultFilterIndex, - const wxChar *filter, - int flags, - wxWindow* parent, - int x, - int y) +wxString wxFileSelectorEx(const wxString& title, + const wxString& defaultDir, + const wxString& defaultFileName, + int* defaultFilterIndex, + const wxString& filter, + int flags, + wxWindow* parent, + int x, + int y) { wxFileDialog fileDialog(parent, - title ? title : wxT(""), - defaultDir ? defaultDir : wxT(""), - defaultFileName ? defaultFileName : wxT(""), - filter ? filter : wxT(""), + title, + defaultDir, + defaultFileName, + filter, flags, wxPoint(x, y)); wxString filename; @@ -260,9 +315,9 @@ wxString wxFileSelectorEx(const wxChar *title, //---------------------------------------------------------------------------- static wxString wxDefaultFileSelector(bool load, - const wxChar *what, - const wxChar *extension, - const wxChar *default_name, + const wxString& what, + const wxString& extension, + const wxString& default_name, wxWindow *parent) { wxString prompt; @@ -274,11 +329,13 @@ static wxString wxDefaultFileSelector(bool load, prompt.Printf(str, what); wxString wild; - const wxChar *ext = extension; - if ( ext ) + wxString ext; + if ( !extension.empty() ) { - if ( *ext == wxT('.') ) - ext++; + if ( extension[0u] == wxT('.') ) + ext = extension.substr(1); + else + ext = extension; wild.Printf(wxT("*.%s"), ext); } @@ -287,33 +344,51 @@ static wxString wxDefaultFileSelector(bool load, wild = wxFileSelectorDefaultWildcardStr; } - return wxFileSelector(prompt, NULL, default_name, ext, wild, - load ? wxOPEN : wxSAVE, parent); + return wxFileSelector(prompt, wxEmptyString, default_name, ext, wild, + load ? (wxFD_OPEN | wxFD_FILE_MUST_EXIST) : wxFD_SAVE, + parent); } //---------------------------------------------------------------------------- // wxLoadFileSelector //---------------------------------------------------------------------------- -WXDLLEXPORT wxString wxLoadFileSelector(const wxChar *what, - const wxChar *extension, - const wxChar *default_name, +WXDLLEXPORT wxString wxLoadFileSelector(const wxString& what, + const wxString& extension, + const wxString& default_name, wxWindow *parent) { - return wxDefaultFileSelector(TRUE, what, extension, default_name, parent); + return wxDefaultFileSelector(true, what, extension, default_name, parent); } //---------------------------------------------------------------------------- // wxSaveFileSelector //---------------------------------------------------------------------------- -WXDLLEXPORT wxString wxSaveFileSelector(const wxChar *what, - const wxChar *extension, - const wxChar *default_name, +WXDLLEXPORT wxString wxSaveFileSelector(const wxString& what, + const wxString& extension, + const wxString& default_name, wxWindow *parent) { - return wxDefaultFileSelector(FALSE, what, extension, default_name, parent); + return wxDefaultFileSelector(false, what, extension, default_name, parent); } -#endif // wxUSE_FILEDLG +//---------------------------------------------------------------------------- +// wxDirDialogBase +//---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 +long wxDirDialogBase::GetStyle() const +{ + return GetWindowStyle(); +} + +void wxDirDialogBase::SetStyle(long style) +{ + SetWindowStyle(style); +} +#endif // WXWIN_COMPATIBILITY_2_6 + + +#endif // wxUSE_FILEDLG