Don't leak associations in wxCocoaDataViewControl
Fix ClearColumns() to release associations between m_OutlineView and native Cocoa control when re-creating the latter. Previously it only created a new association, but left the old one with no-deleted native control in the map. Fixes #17485.
This commit is contained in:
@@ -343,6 +343,7 @@ public :
|
|||||||
FindBestFromWXWidget(WXWidget control);
|
FindBestFromWXWidget(WXWidget control);
|
||||||
|
|
||||||
static void RemoveAssociations( wxWidgetImpl* impl);
|
static void RemoveAssociations( wxWidgetImpl* impl);
|
||||||
|
static void RemoveAssociation(WXWidget control);
|
||||||
|
|
||||||
static void Associate( WXWidget control, wxWidgetImpl *impl );
|
static void Associate( WXWidget control, wxWidgetImpl *impl );
|
||||||
|
|
||||||
|
@@ -2084,6 +2084,7 @@ bool wxCocoaDataViewControl::ClearColumns()
|
|||||||
// as there is a bug in NSOutlineView version (OSX 10.5.6 #6555162) the
|
// as there is a bug in NSOutlineView version (OSX 10.5.6 #6555162) the
|
||||||
// columns cannot be deleted if there is an outline column in the view;
|
// columns cannot be deleted if there is an outline column in the view;
|
||||||
// therefore, the whole view is deleted and newly constructed:
|
// therefore, the whole view is deleted and newly constructed:
|
||||||
|
RemoveAssociation(m_OutlineView); // undo InitOutlineView's association
|
||||||
[m_OutlineView release];
|
[m_OutlineView release];
|
||||||
m_OutlineView = [[wxCocoaOutlineView alloc] init];
|
m_OutlineView = [[wxCocoaOutlineView alloc] init];
|
||||||
[((NSScrollView*) GetWXWidget()) setDocumentView:m_OutlineView];
|
[((NSScrollView*) GetWXWidget()) setDocumentView:m_OutlineView];
|
||||||
|
@@ -2739,6 +2739,13 @@ void wxWidgetImpl::RemoveAssociations(wxWidgetImpl* impl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxWidgetImpl::RemoveAssociation(WXWidget control)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( control != NULL, wxT("attempt to remove a NULL WXWidget from control map") );
|
||||||
|
|
||||||
|
wxWinMacControlList.erase(control);
|
||||||
|
}
|
||||||
|
|
||||||
wxIMPLEMENT_ABSTRACT_CLASS(wxWidgetImpl, wxObject);
|
wxIMPLEMENT_ABSTRACT_CLASS(wxWidgetImpl, wxObject);
|
||||||
|
|
||||||
wxWidgetImpl::wxWidgetImpl( wxWindowMac* peer , bool isRootControl, bool isUserPane )
|
wxWidgetImpl::wxWidgetImpl( wxWindowMac* peer , bool isRootControl, bool isUserPane )
|
||||||
|
Reference in New Issue
Block a user