From 66c02e6e33fe3afee6b67a7e060a695787515650 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 5 May 2010 12:45:09 +0000 Subject: [PATCH] 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 --- include/wx/dvrenderers.h | 3 +++ src/common/datavcmn.cpp | 32 ++++++++++++++------------------ 2 files changed, 17 insertions(+), 18 deletions(-) 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; -- 2.45.2