ChangeLog Move the custom draw item notifications down into DrawLargeItem. --- dlls/comctl32/listview.c.N3 Thu Oct 10 12:32:11 2002 +++ dlls/comctl32/listview.c Thu Oct 10 13:19:55 2002 @@ -3211,9 +3211,10 @@ * TRUE: if item is focused * FALSE: otherwise */ -static void LISTVIEW_DrawLargeItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem) +static void LISTVIEW_DrawLargeItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, DWORD cdmode) { WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' }; + DWORD cditemmode = CDRF_DODEFAULT; RECT rcIcon, rcLabel, *lprcFocus; LVITEMW lvItem; UINT uFormat; @@ -3236,6 +3237,10 @@ if (!LISTVIEW_GetItemMeasures(infoPtr, nItem, NULL, NULL, &rcIcon, &rcLabel)) return; + if (cdmode & CDRF_NOTIFYITEMDRAW) + cditemmode = notify_customdrawitem (infoPtr, hdc, nItem, 0, CDDS_ITEMPREPAINT); + if (cditemmode & CDRF_SKIPDEFAULT) goto postpaint; + /* Set the item to the boundary box for now */ TRACE("rcIcon=%s, rcLabel=%s\n", debugrect(&rcIcon), debugrect(&rcLabel)); @@ -3261,7 +3266,7 @@ if ((infoPtr->bEditing && lprcFocus) || !lvItem.pszText || !lstrlenW(lvItem.pszText)) { if(lprcFocus) SetRectEmpty(lprcFocus); - return; + goto postpaint; } select_text_attr(infoPtr, hdc, lvItem.state & LVIS_SELECTED, &ta); @@ -3287,6 +3292,10 @@ if(lprcFocus) *lprcFocus = rcLabel; set_text_attr(hdc, &ta); + +postpaint: + if (cditemmode & CDRF_NOTIFYPOSTPAINT) + notify_customdrawitem(infoPtr, hdc, nItem, 0, CDDS_ITEMPOSTPAINT); } /*** @@ -3562,7 +3571,6 @@ */ static void LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode) { - DWORD cditemmode = CDRF_DODEFAULT; POINT Origin, Position; RECT rcItem; ITERATOR i; @@ -3578,31 +3586,15 @@ if (LISTVIEW_GetItemState(infoPtr, i.nItem, LVIS_FOCUSED)) continue; - if (cdmode & CDRF_NOTIFYITEMDRAW) - cditemmode = notify_customdrawitem (infoPtr, hdc, i.nItem, 0, CDDS_ITEMPREPAINT); - if (cditemmode & CDRF_SKIPDEFAULT) continue; - if (!LISTVIEW_GetItemListOrigin(infoPtr, i.nItem, &Position)) continue; - LISTVIEW_DrawLargeItem(infoPtr, hdc, i.nItem); - - if (cditemmode & CDRF_NOTIFYPOSTPAINT) - notify_customdrawitem(infoPtr, hdc, i.nItem, 0, CDDS_ITEMPOSTPAINT); + LISTVIEW_DrawLargeItem(infoPtr, hdc, i.nItem, cdmode); } iterator_destroy(&i); /* draw the focused item last, in case it's oversized */ - if (!LISTVIEW_GetItemMeasures(infoPtr, infoPtr->nFocusedItem, &rcItem, 0, 0, 0)) return; - if (!RectVisible(hdc, &rcItem)) return; - - if (cdmode & CDRF_NOTIFYITEMDRAW) - cditemmode = notify_customdrawitem (infoPtr, hdc, infoPtr->nFocusedItem, 0, CDDS_ITEMPREPAINT); - if (cditemmode & CDRF_SKIPDEFAULT) - return; - - LISTVIEW_DrawLargeItem(infoPtr, hdc, infoPtr->nFocusedItem); - - if (cditemmode & CDRF_NOTIFYPOSTPAINT) - notify_customdrawitem(infoPtr, hdc, i.nItem, 0, CDDS_ITEMPOSTPAINT); + if (LISTVIEW_GetItemMeasures(infoPtr, infoPtr->nFocusedItem, &rcItem, 0, 0, 0) && + RectVisible(hdc, &rcItem)) + LISTVIEW_DrawLargeItem(infoPtr, hdc, infoPtr->nFocusedItem, cdmode); } /***