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
wxControl *GetEditorCtrl() { return m_editorCtrl; }
protected:
wxControl *GetEditorCtrl() { return m_editorCtrl; }
protected:
+ // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl
+ void DestroyEditControl();
+
wxString m_variantType;
wxDataViewColumn *m_owner;
wxWeakRef<wxControl> m_editorCtrl;
wxString m_variantType;
wxDataViewColumn *m_owner;
wxWeakRef<wxControl> m_editorCtrl;
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 )
{
wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
{
wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner();
if(!m_editorCtrl)
return false;
if(!m_editorCtrl)
return false;
- (void) new wxKillRef( m_editorCtrl.get() );
-
wxDataViewEditorCtrlEvtHandler *handler =
new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
wxDataViewEditorCtrlEvtHandler *handler =
new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
+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)
void wxDataViewRendererBase::CancelEditing()
{
if (!m_editorCtrl)
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
- m_editorCtrl->Hide();
- wxPendingDelete.Append( m_editorCtrl );
}
bool wxDataViewRendererBase::FinishEditing()
}
bool wxDataViewRendererBase::FinishEditing()
dv_ctrl->GetMainWindow()->SetFocus();
dv_ctrl->GetMainWindow()->SetFocus();
- m_editorCtrl->Hide();
- wxPendingDelete.Append( m_editorCtrl );
if (!Validate(value))
return false;
if (!Validate(value))
return false;