X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec376c8fd9ff813392030426acd2317c6fa6527e..f5bed7a885024108682c32c74567cdf7bf2ed13b:/src/common/filepickercmn.cpp diff --git a/src/common/filepickercmn.cpp b/src/common/filepickercmn.cpp index 949ee2c8c3..06931b3b56 100644 --- a/src/common/filepickercmn.cpp +++ b/src/common/filepickercmn.cpp @@ -24,16 +24,19 @@ #pragma hdrstop #endif -#include "wx/filepicker.h" +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL +#include "wx/filepicker.h" +#include "wx/filename.h" +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif // ============================================================================ // implementation // ============================================================================ -#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL - DEFINE_EVENT_TYPE(wxEVT_COMMAND_FILEPICKER_CHANGED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DIRPICKER_CHANGED) IMPLEMENT_DYNAMIC_CLASS(wxFileDirPickerEvent, wxCommandEvent) @@ -51,15 +54,32 @@ bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, long style, const wxValidator& validator, const wxString &name ) { - wxASSERT_MSG(path.IsEmpty() || CheckPath(path), wxT("Invalid initial path !")); + wxASSERT_MSG(path.empty() || CheckPath(path), wxT("Invalid initial path !")); if (!wxPickerBase::CreateBase(parent, id, path, pos, size, 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); @@ -91,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 @@ -105,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); @@ -143,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