From: Vadim Zeitlin Date: Wed, 5 May 2010 12:45:09 +0000 (+0000) Subject: Pop event handler from wxDVC edit control before destroying it. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/66c02e6e33fe3afee6b67a7e060a695787515650 Pop event handler from wxDVC edit control before destroying it. This fixes the assert in wxWindow dtor checking that all event handlers pushed on the window were removed. Also fix a memory leak by not creating an unnecessary object of wxKillRef class. In fact remove this class entirely. Closes #11732. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64216 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dvrenderers.h b/include/wx/dvrenderers.h index 34939a685e..c05c109522 100644 --- a/include/wx/dvrenderers.h +++ b/include/wx/dvrenderers.h @@ -154,6 +154,9 @@ public: wxControl *GetEditorCtrl() { return m_editorCtrl; } protected: + // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl + void DestroyEditControl(); + wxString m_variantType; wxDataViewColumn *m_owner; wxWeakRef m_editorCtrl; diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index de0608121e..beccdb2b51 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -589,18 +589,6 @@ const wxDataViewCtrl* wxDataViewRendererBase::GetView() const return const_cast(this)->GetOwner()->GetOwner(); } -class wxKillRef: public wxWindowRef -{ -public: - wxKillRef( wxWindow *win ) : wxWindowRef( win ) { } - virtual void OnObjectDestroy() - { - get()->PopEventHandler( true ); - m_pobj = NULL; - delete this; - } -}; - bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect ) { wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner(); @@ -627,8 +615,6 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la if(!m_editorCtrl) return false; - (void) new wxKillRef( m_editorCtrl.get() ); - wxDataViewEditorCtrlEvtHandler *handler = new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this ); @@ -651,6 +637,18 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la return true; } +void wxDataViewRendererBase::DestroyEditControl() +{ + // Hide the control immediately but don't delete it yet as there could be + // some pending messages for it. + m_editorCtrl->Hide(); + + wxEvtHandler * const handler = m_editorCtrl->PopEventHandler(); + + wxPendingDelete.Append(handler); + wxPendingDelete.Append(m_editorCtrl); +} + void wxDataViewRendererBase::CancelEditing() { if (!m_editorCtrl) @@ -658,8 +656,7 @@ void wxDataViewRendererBase::CancelEditing() GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); - m_editorCtrl->Hide(); - wxPendingDelete.Append( m_editorCtrl ); + DestroyEditControl(); } bool wxDataViewRendererBase::FinishEditing() @@ -674,8 +671,7 @@ bool wxDataViewRendererBase::FinishEditing() dv_ctrl->GetMainWindow()->SetFocus(); - m_editorCtrl->Hide(); - wxPendingDelete.Append( m_editorCtrl ); + DestroyEditControl(); if (!Validate(value)) return false;