X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bdc72a22686ac141e9bc4559a1171d017fdcb094..58b1642453c5858a4dd29425b065e9215cb8ec79:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 5bb0d8f862..3d4eb964bb 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -204,7 +204,15 @@ void wxListCtrl::UpdateStyle() wxListCtrl::~wxListCtrl() { - if (m_textCtrl) + if ( m_hasAnyAttr ) + { + for ( wxNode *node = m_attrs.Next(); node; node = m_attrs.Next() ) + { + delete (wxListItemAttr *)node->Data(); + } + } + + if ( m_textCtrl ) { m_textCtrl->UnsubclassWin(); m_textCtrl->SetHWND(0); @@ -549,20 +557,10 @@ bool wxListCtrl::SetItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { - // FIXME it should be... - wxASSERT_MSG( !info.GetData(), - _T("can't have custom attributes and client data") ); - - item.mask |= LVIF_PARAM; - item.lParam = (long)info.GetAttributes(); + m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); m_hasAnyAttr = TRUE; } - else if ( m_hasAnyAttr ) - { - item.mask |= LVIF_PARAM; - item.lParam = 0; - } item.cchTextMax = 0; bool ok = ListView_SetItem(GetHwnd(), &item) != 0; @@ -1048,20 +1046,10 @@ long wxListCtrl::InsertItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { - // FIXME it should be... - wxASSERT_MSG( !info.GetData(), - _T("can't have custom attributes and client data") ); - - item.mask |= LVIF_PARAM; - item.lParam = (long)info.GetAttributes(); + m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes())); m_hasAnyAttr = TRUE; } - else if ( m_hasAnyAttr ) - { - item.mask |= LVIF_PARAM; - item.lParam = 0; - } return (long) ListView_InsertItem(GetHwnd(), & item); } @@ -1279,16 +1267,10 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // return TRUE to suppress all additional LVN_DELETEITEM // notifications - this makes deleting all items from a list ctrl - // much faster (but we can't do it if we have any custom drawn - // items because we need to delete their attributes in - // LVN_DELETEITEM below) - if ( !m_hasAnyAttr ) - { - *result = TRUE; + // much faster + *result = TRUE; - return TRUE; - } - break; + return TRUE; case LVN_DELETEITEM: { @@ -1298,8 +1280,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( m_hasAnyAttr ) { - wxListItemAttr *attr = (wxListItemAttr *)hdr->lParam; - delete attr; + delete m_attrs.Delete(hdr->iItem); } } break; @@ -1464,7 +1445,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) NMCUSTOMDRAW& nmcd = lplvcd->nmcd; switch( nmcd.dwDrawStage ) { - case CDDS_PREPAINT : + case CDDS_PREPAINT: // if we've got any items with non standard attributes, // notify us before painting each item *result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW @@ -1473,30 +1454,68 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) case CDDS_ITEMPREPAINT: { - if ( !nmcd.lItemlParam ) + wxListItemAttr *attr = + (wxListItemAttr *)m_attrs.Get(nmcd.dwItemSpec); + + if ( !attr ) { // nothing to do for this item return CDRF_DODEFAULT; } - wxListItemAttr *attr = - (wxListItemAttr *)nmcd.lItemlParam; + HFONT hFont; + wxColour colText, colBack; + if ( attr->HasFont() ) + { + wxFont font = attr->GetFont(); + hFont = (HFONT)font.GetResourceHandle(); + } + else + { + hFont = 0; + } + + if ( attr->HasTextColour() ) + { + colText = attr->GetTextColour(); + } + else + { + colText = GetTextColour(); + } + + if ( attr->HasBackgroundColour() ) + { + colBack = attr->GetBackgroundColour(); + } + else + { + colBack = GetBackgroundColour(); + } + + // note that if we wanted to set colours for + // individual columns (subitems), we would have + // returned CDRF_NOTIFYSUBITEMREDRAW from here + if ( hFont ) + { + ::SelectObject(nmcd.hdc, hFont); - ::SelectObject(nmcd.hdc, - (HFONT)((wxFont &)attr->GetFont()). - GetResourceHandle()); - lplvcd->clrText = - wxColourToRGB(attr->GetTextColour()); - lplvcd->clrTextBk = - wxColourToRGB(attr->GetBackgroundColour()); + *result = CDRF_NEWFONT; + } + else + { + *result = CDRF_DODEFAULT; + } - // if we wanted to set colours for individual - // columns (subitems), we would have returned - // CDRF_NOTIFYSUBITEMREDRAW from here - *result = CDRF_NEWFONT; + lplvcd->clrText = wxColourToRGB(colText); + lplvcd->clrTextBk = wxColourToRGB(colBack); return TRUE; } + + default: + *result = CDRF_DODEFAULT; + return TRUE; } } break;