#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)
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);
// 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
// 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);
#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