X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/731330ec4c570f1c000a8b39fc27f136e7ab1d11..06b2f04bb7da4bcabf73574a189ace1cbe1ec71b:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 580f1db4de..fc5c4e9a87 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -70,6 +70,24 @@ struct wxGridCellWithAttr wxGridCellWithAttr(int row, int col, wxGridCellAttr *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() @@ -79,10 +97,6 @@ struct wxGridCellWithAttr wxGridCellCoords coords; 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, @@ -2590,14 +2604,15 @@ void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col) int n = FindIndex(row, col); if ( n == wxNOT_FOUND ) { - // add the attribute - m_attrs.Add(new wxGridCellWithAttr(row, col, attr)); + if ( attr ) + { + // add the attribute + m_attrs.Add(new wxGridCellWithAttr(row, col, attr)); + } + //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 ) { // change the attribute @@ -2650,8 +2665,6 @@ void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows ) else { // ...or remove the attribute - // No need to DecRef the attribute itself since this is - // done be wxGridCellWithAttr's destructor! m_attrs.RemoveAt(n); n--; count--; @@ -2686,8 +2699,6 @@ void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols ) else { // ...or remove the attribute - // No need to DecRef the attribute itself since this is - // done be wxGridCellWithAttr's destructor! m_attrs.RemoveAt(n); n--; count--; @@ -3164,7 +3175,8 @@ void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col) { if ( m_attrProvider ) { - attr->SetKind(wxGridCellAttr::Cell); + if ( attr ) + attr->SetKind(wxGridCellAttr::Cell); m_attrProvider->SetAttr(attr, row, col); } else