fix reference counting problems with wxGridCellWithAttr (re-#9567)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54199 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-06-13 21:37:58 +00:00
parent af4d748440
commit 6f292345cf
2 changed files with 27 additions and 13 deletions

View File

@@ -360,6 +360,12 @@ GridFrame::GridFrame()
grid->SetCellAlignment(7, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); grid->SetCellAlignment(7, 1, wxALIGN_CENTRE, wxALIGN_CENTRE);
grid->SetCellValue(7, 1, _T("Big box!")); grid->SetCellValue(7, 1, _T("Big box!"));
// this does exactly nothing except testing that SetAttr() handles NULL
// attributes and does reference counting correctly
grid->SetAttr(11, 11, NULL);
grid->SetAttr(11, 11, new wxGridCellAttr);
grid->SetAttr(11, 11, NULL);
wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
topSizer->Add( grid, topSizer->Add( grid,
1, 1,

View File

@@ -70,6 +70,24 @@ struct wxGridCellWithAttr
wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_) wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_)
: coords(row, col), attr(attr_) : coords(row, col), attr(attr_)
{ {
wxASSERT( attr );
}
wxGridCellWithAttr(const wxGridCellWithAttr& other)
: coords(other.coords),
attr(other.attr)
{
attr->IncRef();
}
wxGridCellWithAttr& operator=(const wxGridCellWithAttr& other)
{
coords = other.coords;
attr->DecRef();
attr = other.attr;
attr->IncRef();
return *this;
} }
~wxGridCellWithAttr() ~wxGridCellWithAttr()
@@ -79,10 +97,6 @@ struct wxGridCellWithAttr
wxGridCellCoords coords; wxGridCellCoords coords;
wxGridCellAttr *attr; wxGridCellAttr *attr;
// Cannot do this:
// DECLARE_NO_COPY_CLASS(wxGridCellWithAttr)
// without rewriting the macros, which require a public copy constructor.
}; };
WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr, wxGridCellWithAttrArray, WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr, wxGridCellWithAttrArray,
@@ -2597,11 +2611,8 @@ void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col)
} }
//else: nothing to do //else: nothing to do
} }
else else // we already have an attribute for this cell
{ {
// free the old attribute
m_attrs[(size_t)n].attr->DecRef();
if ( attr ) if ( attr )
{ {
// change the attribute // change the attribute
@@ -2654,8 +2665,6 @@ void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows )
else else
{ {
// ...or remove the attribute // ...or remove the attribute
// No need to DecRef the attribute itself since this is
// done be wxGridCellWithAttr's destructor!
m_attrs.RemoveAt(n); m_attrs.RemoveAt(n);
n--; n--;
count--; count--;
@@ -2690,8 +2699,6 @@ void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols )
else else
{ {
// ...or remove the attribute // ...or remove the attribute
// No need to DecRef the attribute itself since this is
// done be wxGridCellWithAttr's destructor!
m_attrs.RemoveAt(n); m_attrs.RemoveAt(n);
n--; n--;
count--; count--;
@@ -3168,6 +3175,7 @@ void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col)
{ {
if ( m_attrProvider ) if ( m_attrProvider )
{ {
if ( attr )
attr->SetKind(wxGridCellAttr::Cell); attr->SetKind(wxGridCellAttr::Cell);
m_attrProvider->SetAttr(attr, row, col); m_attrProvider->SetAttr(attr, row, col);
} }