X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ce7b1e43fdf835a77a78765fe73de707b89e85f..f5bed7a885024108682c32c74567cdf7bf2ed13b:/src/common/filepickercmn.cpp diff --git a/src/common/filepickercmn.cpp b/src/common/filepickercmn.cpp index ddd28f6c94..06931b3b56 100644 --- a/src/common/filepickercmn.cpp +++ b/src/common/filepickercmn.cpp @@ -27,6 +27,11 @@ #if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL #include "wx/filepicker.h" +#include "wx/filename.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif // ============================================================================ // implementation @@ -55,9 +60,26 @@ bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, style, validator, name)) return false; + if (!HasFlag(wxFLP_OPEN) && !HasFlag(wxFLP_SAVE)) + m_windowStyle |= wxFLP_OPEN; // wxFD_OPEN is the default + + // check that the styles are not contradictory + wxASSERT_MSG( !(HasFlag(wxFLP_SAVE) && HasFlag(wxFLP_OPEN)), + _T("can't specify both wxFLP_SAVE and wxFLP_OPEN at once") ); + + wxASSERT_MSG( !HasFlag(wxFLP_SAVE) || !HasFlag(wxFLP_FILE_MUST_EXIST), + _T("wxFLP_FILE_MUST_EXIST can't be used with wxFLP_SAVE" ) ); + + wxASSERT_MSG( !HasFlag(wxFLP_OPEN) || !HasFlag(wxFLP_OVERWRITE_PROMPT), + _T("wxFLP_OVERWRITE_PROMPT can't be used with wxFLP_OPEN") ); + // create a wxFilePickerWidget or a wxDirPickerWidget... if (!CreatePicker(this, path, message, wildcard)) return false; + + // complete sizer creation + wxPickerBase::PostCreation(); + m_picker->Connect(GetEventType(), wxFileDirPickerEventHandler(wxFileDirPickerCtrlBase::OnFileDirChange), NULL, this); @@ -89,9 +111,7 @@ void wxFileDirPickerCtrlBase::UpdatePickerFromTextCtrl() // remove the eventually present path-separator from the end of the textctrl // string otherwise we would generate a wxFileDirPickerEvent when changing // from e.g. /home/user to /home/user/ and we want to avoid it ! - wxString newpath(m_text->GetValue()); - if (!newpath.empty() && wxFileName::IsPathSeparator(newpath.Last())) - newpath.RemoveLast(); + wxString newpath(GetTextCtrlValue()); if (!CheckPath(newpath)) return; // invalid user input @@ -103,7 +123,7 @@ void wxFileDirPickerCtrlBase::UpdatePickerFromTextCtrl() // NOTE: the path separator is required because if newpath is "C:" // then no change would happen if (IsCwdToUpdate()) - wxSetWorkingDirectory(newpath + wxFileName::GetPathSeparator()); + wxSetWorkingDirectory(newpath); // fire an event wxFileDirPickerEvent event(GetEventType(), this, GetId(), newpath); @@ -141,9 +161,48 @@ void wxFileDirPickerCtrlBase::OnFileDirChange(wxFileDirPickerEvent &ev) #endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrl +// ---------------------------------------------------------------------------- + #if wxUSE_FILEPICKERCTRL + IMPLEMENT_DYNAMIC_CLASS(wxFilePickerCtrl, wxPickerBase) -#endif + +bool wxFilePickerCtrl::CheckPath(const wxString& path) const +{ + // if wxFLP_SAVE was given or wxFLP_FILE_MUST_EXIST has NOT been given we + // must accept any path + return HasFlag(wxFLP_SAVE) || + !HasFlag(wxFLP_FILE_MUST_EXIST) || + wxFileName::FileExists(path); +} + +wxString wxFilePickerCtrl::GetTextCtrlValue() const +{ + // filter it through wxFileName to remove any spurious path separator + return wxFileName(m_text->GetValue()).GetFullPath(); +} + +#endif // wxUSE_FILEPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxDirPickerCtrl +// ---------------------------------------------------------------------------- + #if wxUSE_DIRPICKERCTRL IMPLEMENT_DYNAMIC_CLASS(wxDirPickerCtrl, wxPickerBase) -#endif + +bool wxDirPickerCtrl::CheckPath(const wxString& path) const +{ + // if wxDIRP_DIR_MUST_EXIST has NOT been given we must accept any path + return !HasFlag(wxDIRP_DIR_MUST_EXIST) || wxFileName::DirExists(path); +} + +wxString wxDirPickerCtrl::GetTextCtrlValue() const +{ + // filter it through wxFileName to remove any spurious path separator + return wxFileName::DirName(m_text->GetValue()).GetPath(); +} + +#endif // wxUSE_DIRPICKERCTRL