X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bdc72a22686ac141e9bc4559a1171d017fdcb094..2a31049201e9c1ff9f515eb9d144ae392f4b4e5a:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 5bb0d8f862..b74816ce5b 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -61,15 +61,48 @@ static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, L // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) - IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) -#endif // USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) // ============================================================================ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wxListEvent +// ---------------------------------------------------------------------------- + +void wxListEvent::CopyObject(wxObject& object_dest) const +{ + wxListEvent *obj = (wxListEvent *)&object_dest; + + wxNotifyEvent::CopyObject(object_dest); + + obj->m_code = m_code; + obj->m_itemIndex = m_itemIndex; + obj->m_oldItemIndex = m_oldItemIndex; + obj->m_col = m_col; + obj->m_cancelled = m_cancelled; + obj->m_pointDrag = m_pointDrag; + obj->m_item.m_mask = m_item.m_mask; + obj->m_item.m_itemId = m_item.m_itemId; + obj->m_item.m_col = m_item.m_col; + obj->m_item.m_state = m_item.m_state; + obj->m_item.m_stateMask = m_item.m_stateMask; + obj->m_item.m_text = m_item.m_text; + obj->m_item.m_image = m_item.m_image; + obj->m_item.m_data = m_item.m_data; + obj->m_item.m_format = m_item.m_format; + obj->m_item.m_width = m_item.m_width; + + if ( m_item.HasAttributes() ) + { + obj->m_item.SetTextColour(m_item.GetTextColour()); + obj->m_item.SetBackgroundColour(m_item.GetBackgroundColour()); + obj->m_item.SetFont(m_item.GetFont()); + } +} + // ---------------------------------------------------------------------------- // wxListCtrl construction // ---------------------------------------------------------------------------- @@ -93,7 +126,10 @@ bool wxListCtrl::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { +#if wxUSE_VALIDATORS SetValidator(validator); +#endif // wxUSE_VALIDATORS + SetName(name); int x = pos.x; @@ -204,7 +240,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 +593,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 +1082,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 +1303,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 +1316,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( m_hasAnyAttr ) { - wxListItemAttr *attr = (wxListItemAttr *)hdr->lParam; - delete attr; + delete (wxListItemAttr *)m_attrs.Delete(hdr->iItem); } } break; @@ -1457,14 +1474,14 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) break; #endif // 0 -#ifdef NM_CUSTOMDRAW +#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; 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,34 +1490,72 @@ 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(); + } - ::SelectObject(nmcd.hdc, - (HFONT)((wxFont &)attr->GetFont()). - GetResourceHandle()); - lplvcd->clrText = - wxColourToRGB(attr->GetTextColour()); - lplvcd->clrTextBk = - wxColourToRGB(attr->GetBackgroundColour()); + if ( attr->HasBackgroundColour() ) + { + colBack = attr->GetBackgroundColour(); + } + else + { + colBack = GetBackgroundColour(); + } - // if we wanted to set colours for individual - // columns (subitems), we would have returned - // CDRF_NOTIFYSUBITEMREDRAW from here - *result = CDRF_NEWFONT; + // 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); + + *result = CDRF_NEWFONT; + } + else + { + *result = CDRF_DODEFAULT; + } + + lplvcd->clrText = wxColourToRGB(colText); + lplvcd->clrTextBk = wxColourToRGB(colBack); return TRUE; } + + default: + *result = CDRF_DODEFAULT; + return TRUE; } } break; -#endif // NM_CUSTOMDRAW +#endif // _WIN32_IE >= 0x300 default: return wxControl::MSWOnNotify(idCtrl, lParam, result); @@ -1582,6 +1637,29 @@ wxListItem::wxListItem() m_attr = NULL; } +void wxListItem::Clear() +{ + m_mask = 0; + m_itemId = 0; + m_col = 0; + m_state = 0; + m_stateMask = 0; + m_image = 0; + m_data = 0; + m_format = wxLIST_FORMAT_CENTRE; + m_width = 0; + m_text = wxEmptyString; + + if (m_attr) delete m_attr; + m_attr = NULL; +} + +void wxListItem::ClearAttributes() +{ + if (m_attr) delete m_attr; + m_attr = NULL; +} + static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& lvItem, HWND getFullInfo) { info.m_data = lvItem.lParam;