Fix ListView Bugs

Robert Shearman R.J.Shearman at warwick.ac.uk
Fri May 16 06:02:56 CDT 2003


Fixes two bugs.
1. Regression. The colour used for the background of text that wasn't
selected wasn't being set properly any more, as it had been moved into
notify_prepaint. This patch moves it back to where it was before and the
text background appears correctly.
2. Don't clear the item header when column 0 is inserted - it would clear
anything already set in the header, such as information set by InsertItem

ChangeLog:
- Make selected text appear correctly now
- Don't clear header for subitem 0 when column 0 is inserted

Rob
-------------- next part --------------
Index: wine/dlls/comctl32/listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.351
diff -u -r1.351 listview.c
--- wine/dlls/comctl32/listview.c	13 May 2003 00:30:10 -0000	1.351
+++ wine/dlls/comctl32/listview.c	16 May 2003 09:02:28 -0000
@@ -881,42 +881,9 @@
     return result;
 }
 
-static DWORD notify_prepaint (LISTVIEW_INFO *infoPtr, HDC hdc, NMLVCUSTOMDRAW *lpnmlvcd)
+static inline DWORD notify_prepaint (LISTVIEW_INFO *infoPtr, HDC hdc, NMLVCUSTOMDRAW *lpnmlvcd)
 {
-    BOOL isSelected = lpnmlvcd->nmcd.uItemState & CDIS_SELECTED;
-    DWORD cditemmode = notify_customdraw(infoPtr, CDDS_PREPAINT, lpnmlvcd);
-
-    if (cditemmode & CDRF_SKIPDEFAULT) return cditemmode;
-
-    /* apprently, for selected items, we have to override the returned values */
-    if (isSelected)
-    {
-	if (infoPtr->bFocus)
-	{
-	    lpnmlvcd->clrTextBk = comctl32_color.clrHighlight;
-	    lpnmlvcd->clrText   = comctl32_color.clrHighlightText;
-        }
-	else if (infoPtr->dwStyle & LVS_SHOWSELALWAYS)
-	{
-	    lpnmlvcd->clrTextBk = comctl32_color.clr3dFace;
-	    lpnmlvcd->clrText   = comctl32_color.clrBtnText;
-	}
-    }
-
-    /* Set the text attributes */
-    if (lpnmlvcd->clrTextBk != CLR_NONE)
-    {
-	SetBkMode(hdc, OPAQUE);
-	if (lpnmlvcd->clrTextBk == CLR_DEFAULT)
-	    SetBkColor(hdc, infoPtr->clrTextBkDefault);
-	else
-	    SetBkColor(hdc,lpnmlvcd->clrTextBk);
-    }
-    else
-	SetBkMode(hdc, TRANSPARENT);
-    SetTextColor(hdc, lpnmlvcd->clrText);
-
-    return cditemmode;
+    return notify_customdraw(infoPtr, CDDS_PREPAINT, lpnmlvcd);
 }
 
 static inline DWORD notify_postpaint (LISTVIEW_INFO *infoPtr, NMLVCUSTOMDRAW *lpnmlvcd)
@@ -3570,6 +3537,23 @@
         cditemmode = notify_prepaint (infoPtr, hdc, &nmlvcd);
     if (cditemmode & CDRF_SKIPDEFAULT) goto postpaint;
 
+    if (cditemmode & CDRF_SKIPDEFAULT) return cditemmode;
+
+    /* apprently, for selected items, we have to override the returned values */
+    if (lvItem.state & LVIS_SELECTED)
+    {
+	if (infoPtr->bFocus)
+	{
+	    nmlvcd.clrTextBk = comctl32_color.clrHighlight;
+	    nmlvcd.clrText   = comctl32_color.clrHighlightText;
+        }
+	else if (infoPtr->dwStyle & LVS_SHOWSELALWAYS)
+	{
+	    nmlvcd.clrTextBk = comctl32_color.clr3dFace;
+	    nmlvcd.clrText   = comctl32_color.clrBtnText;
+	}
+    }
+
     /* in full row select, subitems, will just use main item's colors */
     if (nSubItem && uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
 	nmlvcd.clrTextBk = CLR_NONE;
@@ -3597,6 +3581,19 @@
     /* Don't bother painting item being edited */
     if (infoPtr->hwndEdit && nItem == infoPtr->nEditLabelItem && nSubItem == 0) goto postpaint;
 
+    /* Set the text attributes */
+    if (nmlvcd.clrTextBk != CLR_NONE)
+    {
+	SetBkMode(hdc, OPAQUE);
+	if (nmlvcd.clrTextBk == CLR_DEFAULT)
+	    SetBkColor(hdc, infoPtr->clrTextBkDefault);
+	else
+	    SetBkColor(hdc,nmlvcd.clrTextBk);
+    }
+    else
+	SetBkMode(hdc, TRANSPARENT);
+    SetTextColor(hdc, nmlvcd.clrText);
+
     /* draw the selection background, if we're drawing the main item */
     if (nSubItem == 0)
     {
@@ -6278,7 +6275,6 @@
 		lpSubItem = lpNewItems[nItem];
 		lpSubItem->hdr = lpMainItem->hdr;
 		lpSubItem->iSubItem = 1;
-		ZeroMemory(&lpMainItem->hdr, sizeof(lpMainItem->hdr));
 		lpMainItem->iSubItem = 0;
 		DPA_InsertPtr(hdpaSubItems, 1, lpSubItem);
     	    }


More information about the wine-patches mailing list