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
This commit is contained in:
@@ -154,6 +154,9 @@ public:
|
|||||||
wxControl *GetEditorCtrl() { return m_editorCtrl; }
|
wxControl *GetEditorCtrl() { return m_editorCtrl; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl
|
||||||
|
void DestroyEditControl();
|
||||||
|
|
||||||
wxString m_variantType;
|
wxString m_variantType;
|
||||||
wxDataViewColumn *m_owner;
|
wxDataViewColumn *m_owner;
|
||||||
wxWeakRef<wxControl> m_editorCtrl;
|
wxWeakRef<wxControl> m_editorCtrl;
|
||||||
|
@@ -589,18 +589,6 @@ const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
|
|||||||
return const_cast<wxDataViewRendererBase*>(this)->GetOwner()->GetOwner();
|
return const_cast<wxDataViewRendererBase*>(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 )
|
bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
|
||||||
{
|
{
|
||||||
wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
|
wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
|
||||||
@@ -627,8 +615,6 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
|
|||||||
if(!m_editorCtrl)
|
if(!m_editorCtrl)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
(void) new wxKillRef( m_editorCtrl.get() );
|
|
||||||
|
|
||||||
wxDataViewEditorCtrlEvtHandler *handler =
|
wxDataViewEditorCtrlEvtHandler *handler =
|
||||||
new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
|
new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
|
||||||
|
|
||||||
@@ -651,6 +637,18 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
|
|||||||
return true;
|
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()
|
void wxDataViewRendererBase::CancelEditing()
|
||||||
{
|
{
|
||||||
if (!m_editorCtrl)
|
if (!m_editorCtrl)
|
||||||
@@ -658,8 +656,7 @@ void wxDataViewRendererBase::CancelEditing()
|
|||||||
|
|
||||||
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
|
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
|
||||||
|
|
||||||
m_editorCtrl->Hide();
|
DestroyEditControl();
|
||||||
wxPendingDelete.Append( m_editorCtrl );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDataViewRendererBase::FinishEditing()
|
bool wxDataViewRendererBase::FinishEditing()
|
||||||
@@ -674,8 +671,7 @@ bool wxDataViewRendererBase::FinishEditing()
|
|||||||
|
|
||||||
dv_ctrl->GetMainWindow()->SetFocus();
|
dv_ctrl->GetMainWindow()->SetFocus();
|
||||||
|
|
||||||
m_editorCtrl->Hide();
|
DestroyEditControl();
|
||||||
wxPendingDelete.Append( m_editorCtrl );
|
|
||||||
|
|
||||||
if (!Validate(value))
|
if (!Validate(value))
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user