From af6ad984611ccf8af3e9a470aede2bbe9931e8e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 15 Jul 2006 15:13:04 +0000 Subject: [PATCH] fixed crashes in wxFile/DirPickerCtrl::GetPath() due to incorrect casting in multiple inheritance hierarchy and incorrect casting to wxFilePickerWidget in wxFileDirPickerCtrlBase git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40100 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/filepicker.h | 66 +++++++++++++++++++------------- include/wx/generic/filepickerg.h | 2 + src/common/filepickercmn.cpp | 21 ++++++---- 3 files changed, 55 insertions(+), 34 deletions(-) diff --git a/include/wx/filepicker.h b/include/wx/filepicker.h index 8ca38a6c17..5aebbe6f6f 100644 --- a/include/wx/filepicker.h +++ b/include/wx/filepicker.h @@ -46,6 +46,9 @@ public: wxString GetPath() const { return m_path; } virtual void SetPath(const wxString &str) { m_path=str; } + // returns the picker widget cast to wxControl + virtual wxControl *AsControl() = 0; + protected: virtual void UpdateDialogPath(wxDialog *) = 0; virtual void UpdatePathFromDialog(wxDialog *) = 0; @@ -88,7 +91,7 @@ protected: // ---------------------------------------------------------------------------- -// wxFileDirPickerWidgetBase +// wxFileDirPickerCtrlBase // ---------------------------------------------------------------------------- class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase @@ -96,6 +99,7 @@ class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase public: wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {} +protected: // NB: no default values since this function will never be used // directly by the user and derived classes wouldn't use them bool CreateBase(wxWindow *parent, @@ -111,8 +115,7 @@ public: public: // public API - wxString GetPath() const - { return ((wxFileDirPickerWidgetBase*)m_picker)->GetPath(); } + wxString GetPath() const; void SetPath(const wxString &str); public: // internal functions @@ -123,9 +126,6 @@ public: // internal functions // event handler for our picker void OnFileDirChange(wxFileDirPickerEvent &); - virtual bool CreatePicker(wxWindow *parent, const wxString& path, - const wxString& message, const wxString& wildcard) = 0; - // Returns TRUE if the current path is a valid one // (i.e. a valid file for a wxFilePickerWidget or a valid // folder for a wxDirPickerWidget). @@ -140,10 +140,21 @@ public: // internal functions // Returns the filtered value currently placed in the text control (if present). virtual wxString GetTextCtrlValue() const = 0; +protected: + // creates the picker control + virtual + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) = 0; + protected: // true if the next UpdateTextCtrl() call is to ignore bool m_bIgnoreNextTextCtrlUpdate; + + // m_picker object as wxFileDirPickerWidgetBase interface + wxFileDirPickerWidgetBase *m_pickerIface; }; #endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL @@ -206,17 +217,6 @@ public: public: // overrides - bool CreatePicker(wxWindow *parent, const wxString& path, - const wxString& message, const wxString& wildcard) - { - m_picker = new wxFilePickerWidget(parent, wxID_ANY, - wxFilePickerWidgetLabel, - path, message, wildcard, - wxDefaultPosition, wxDefaultSize, - GetPickerStyle(GetWindowStyle())); - return true; - } - // return true if the given path is valid for this control bool CheckPath(const wxString& path) const; @@ -230,6 +230,18 @@ public: // overrides { return wxEVT_COMMAND_FILEPICKER_CHANGED; } protected: + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) + { + return new wxFilePickerWidget(parent, wxID_ANY, + wxFilePickerWidgetLabel, + path, message, wildcard, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + // extracts the style for our picker from wxFileDirPickerCtrlBase's style long GetPickerStyle(long style) const { @@ -297,15 +309,6 @@ public: public: // overrides - bool CreatePicker(wxWindow *parent, const wxString& path, - const wxString& message, const wxString& WXUNUSED(wildcard)) - { - m_picker = new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel, - path, message, wxDefaultPosition, wxDefaultSize, - GetPickerStyle(GetWindowStyle())); - return true; - } - bool CheckPath(const wxString &path) const; wxString GetTextCtrlValue() const; @@ -317,6 +320,17 @@ public: // overrides { return wxEVT_COMMAND_DIRPICKER_CHANGED; } protected: + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& WXUNUSED(wildcard)) + { + return new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel, + path, message, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + // extracts the style for our picker from wxFileDirPickerCtrlBase's style long GetPickerStyle(long style) const { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); } diff --git a/include/wx/generic/filepickerg.h b/include/wx/generic/filepickerg.h index 3d150f7758..ee1e83910b 100644 --- a/include/wx/generic/filepickerg.h +++ b/include/wx/generic/filepickerg.h @@ -48,6 +48,8 @@ public: virtual ~wxGenericFileDirButton() {} + virtual wxControl *AsControl() { return this; } + public: // overrideable virtual wxDialog *CreateDialog() = 0; diff --git a/src/common/filepickercmn.cpp b/src/common/filepickercmn.cpp index 06931b3b56..53514e3643 100644 --- a/src/common/filepickercmn.cpp +++ b/src/common/filepickercmn.cpp @@ -45,8 +45,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileDirPickerEvent, wxCommandEvent) // wxFileDirPickerCtrlBase // ---------------------------------------------------------------------------- -#define M_PICKER ((wxFilePickerWidget*)m_picker) - bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, const wxString &path, const wxString &message, const wxString &wildcard, @@ -54,7 +52,7 @@ bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, long style, const wxValidator& validator, const wxString &name ) { - wxASSERT_MSG(path.empty() || 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)) @@ -74,8 +72,10 @@ bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, _T("wxFLP_OVERWRITE_PROMPT can't be used with wxFLP_OPEN") ); // create a wxFilePickerWidget or a wxDirPickerWidget... - if (!CreatePicker(this, path, message, wildcard)) + m_pickerIface = CreatePicker(this, path, message, wildcard); + if ( !m_pickerIface ) return false; + m_picker = m_pickerIface->AsControl(); // complete sizer creation wxPickerBase::PostCreation(); @@ -91,9 +91,14 @@ bool wxFileDirPickerCtrlBase::CreateBase( wxWindow *parent, wxWindowID id, return true; } +wxString wxFileDirPickerCtrlBase::GetPath() const +{ + return m_pickerIface->GetPath(); +} + void wxFileDirPickerCtrlBase::SetPath(const wxString &path) { - M_PICKER->SetPath(path); + m_pickerIface->SetPath(path); UpdateTextCtrlFromPicker(); } @@ -115,9 +120,9 @@ void wxFileDirPickerCtrlBase::UpdatePickerFromTextCtrl() if (!CheckPath(newpath)) return; // invalid user input - if (M_PICKER->GetPath() != newpath) + if (m_pickerIface->GetPath() != newpath) { - M_PICKER->SetPath(newpath); + m_pickerIface->SetPath(newpath); // update current working directory, if necessary // NOTE: the path separator is required because if newpath is "C:" @@ -140,7 +145,7 @@ void wxFileDirPickerCtrlBase::UpdateTextCtrlFromPicker() // which will trigger a unneeded UpdateFromTextCtrl(); thus before using // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag... m_bIgnoreNextTextCtrlUpdate = true; - m_text->SetValue(M_PICKER->GetPath()); + m_text->SetValue(m_pickerIface->GetPath()); }