Listview K6

Dimitrie O. Paun dpaun at rogers.com
Fri Oct 4 10:43:45 CDT 2002


This one fixes a nasty little bug in OWNERDATA listviews.
Xnews should now refresh properly. Selection is still
borken, but that's the subject of a different patch.

Bug reports are always welcomed. ;)

ChangeLog
  Fix condition so we actually store the state in virtual listviews.
  Assorted code cleanups.

--- dlls/comctl32/listview.c.K5	Fri Oct  4 02:39:12 2002
+++ dlls/comctl32/listview.c	Fri Oct  4 11:38:11 2002
@@ -1236,7 +1236,7 @@
     LONG lStyle = infoPtr->dwStyle;
     UINT uView = lStyle & LVS_TYPEMASK;
     POINT Origin, Position, TopLeft;
-    RECT Icon, Boundary, Label;
+    RECT Icon, Boundary, Label, FullText;
     INT nIndent = 0;
 
     if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
@@ -1380,7 +1380,6 @@
       if (infoPtr->himlNormal != NULL)
       {
 	  INT nLabelWidth;
-	  RECT FullText;
 
 	  Label.left = TopLeft.x + Origin.x;
 	  Label.top = TopLeft.y + Origin.y + ICON_TOP_PADDING_HITABLE +
@@ -1404,10 +1403,6 @@
 	  InflateRect(&FullText, 2, 0);
 	  if (lprcLabel) *lprcLabel = Label;
 	  if (lprcText) *lprcText = FullText;
-	  TRACE("hwnd=%x, item=%d, label=(%d,%d)-(%d,%d), fulltext=(%d,%d)-(%d,%d)\n",
-		infoPtr->hwndSelf, nItem,
-		Label.left, Label.top, Label.right, Label.bottom,
-		FullText.left, FullText.top, FullText.right, FullText.bottom);
       }
       else return FALSE;
   }
@@ -1433,9 +1428,6 @@
 	  Label.right = nLeftPos + infoPtr->nItemWidth;
       if (lprcLabel) *lprcLabel = Label;
       if (lprcText) *lprcText = Label;
-      TRACE("hwnd=%x, item=%d, label=(%d,%d)-(%d,%d)\n",
-	    infoPtr->hwndSelf, nItem,
-	    Label.left, Label.top, Label.right, Label.bottom);
   }
   else /* LVS_LIST or LVS_REPORT */
   {
@@ -1461,7 +1453,8 @@
         if (lprcText) *lprcText = Label;
   }
   
-  TRACE("hwnd=%x, item=%d, label=%s\n", infoPtr->hwndSelf, nItem, debugrect(&Label));
+    TRACE("hwnd=%x, item=%d, label=%s, fulltext=%s\n",
+	  infoPtr->hwndSelf, nItem, debugrect(&Label), debugrect(lprcText));
   
     /***********************************************************/
     /* compute boundary box for the item (ala LVM_GETITEMRECT) */
@@ -2296,6 +2289,8 @@
 {
     LVITEMW lvItem;
 
+    TRACE("nItem=%d\n", nItem);
+    
     LISTVIEW_RemoveAllSelections(infoPtr);
 
     lvItem.state = LVIS_FOCUSED | LVIS_SELECTED;
@@ -2485,14 +2480,16 @@
     NMLISTVIEW nmlv;
     INT oldState;
 
-    /* a virtual livst view stores only state for the main item */
+    /* a virtual listview stores only the state for the main item */
     if (lpLVItem->iSubItem || !(lpLVItem->mask & LVIF_STATE)) return FALSE;
 
     oldState = LISTVIEW_GetItemState(infoPtr, lpLVItem->iItem, LVIS_FOCUSED | LVIS_SELECTED);
+    TRACE("oldState=%x, newState=%x, uCallbackMask=%x\n", 
+	  oldState, lpLVItem->state, infoPtr->uCallbackMask);
 
     /* we're done if we don't need to change anything we handle */
-    if ( (oldState ^ lpLVItem->state) & lpLVItem->stateMask &
-         ~infoPtr->uCallbackMask & (LVIS_FOCUSED | LVIS_SELECTED)) return FALSE;
+    if ( !((oldState ^ lpLVItem->state) & lpLVItem->stateMask &
+           ~infoPtr->uCallbackMask & (LVIS_FOCUSED | LVIS_SELECTED))) return TRUE;
 
     /*
      * As per MSDN LVN_ITEMCHANGING notifications are _NOT_ sent for
@@ -2517,7 +2514,7 @@
 	    add_selection_range(infoPtr, lpLVItem->iItem, lpLVItem->iItem, TRUE);
         }
         else
-	remove_selection_range(infoPtr, lpLVItem->iItem, lpLVItem->iItem, TRUE);
+	    remove_selection_range(infoPtr, lpLVItem->iItem, lpLVItem->iItem, TRUE);
     }
 
     /* notify the parent now that things have changed */
@@ -3267,7 +3264,7 @@
     }
     
     /* Get scroll info once before loop */
-    LISTVIEW_GetOrigin(infoPtr, &ptOrig);
+    if (!LISTVIEW_GetOrigin(infoPtr, &ptOrig)) return;
     
     /* we now narrow the columns as well */
     nLastCol = nColumnCount - 1;
@@ -3315,7 +3312,8 @@
             item.mask = LVIF_PARAM | LVIF_STATE;
 	    item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
 	    if (!LISTVIEW_GetItemW(infoPtr, &item, TRUE)) continue;
-	    
+	   
+	    ZeroMemory(&dis, sizeof(dis)); 
             dis.hwndItem = infoPtr->hwndSelf;
             dis.hDC = hdc;
             dis.CtlType = ODT_LISTVIEW;
@@ -3323,7 +3321,6 @@
             dis.itemID = nItem;
             dis.itemAction = ODA_DRAWENTIRE;
             dis.itemData = item.lParam;
-            dis.itemState = 0;
             if (item.state & LVIS_SELECTED) dis.itemState |= ODS_SELECTED;
             if (item.state & LVIS_FOCUSED) dis.itemState |= ODS_FOCUS;
             dis.rcItem.left = lpCols[0].rc.left;
@@ -3333,7 +3330,7 @@
             OffsetRect(&dis.rcItem, ptOrig.x, 0);
 
 	    TRACE("item=%s, rcItem=%s\n", debuglvitem_t(&item, TRUE), debugrect(&dis.rcItem));
-            if (SendMessageW(GetParent(infoPtr->hwndSelf), WM_DRAWITEM, uID, (LPARAM)&dis))
+            if (SendMessageW(GetParent(infoPtr->hwndSelf), WM_DRAWITEM, dis.CtlID, (LPARAM)&dis))
 		continue;
         }
 	
@@ -3481,7 +3478,7 @@
   if(GETITEMCOUNT(infoPtr) == 0)
     return;
 
-  LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
+  if (!LISTVIEW_GetOrigin(infoPtr, &ptOrigin)) return;
 
   GetClipBox(hdc, &rcClip);
 
@@ -4746,7 +4743,7 @@
 	}
 
 	/* we store only a little state, so if we're not asked, we're done */
-	if (!(lpLVItem->mask & LVIF_STATE) || lpLVItem->iSubItem) return FALSE;
+	if (!(lpLVItem->mask & LVIF_STATE) || lpLVItem->iSubItem) return TRUE;
 
 	/* if focus is handled by us, report it */
 	if ( !(infoPtr->uCallbackMask & LVIS_FOCUSED) ) 
@@ -6790,28 +6787,26 @@
  */
 static LRESULT LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem)
 {
-  BOOL bResult = TRUE;
-  LVITEMW lvItem;
-
-  TRACE("(nItem=%d, state=%x, stateMask=%x)\n", nItem, lpLVItem->state,
-        lpLVItem->stateMask);
+    BOOL bResult = TRUE;
+    LVITEMW lvItem;
 
-  lvItem.iItem = nItem;
-  lvItem.iSubItem = 0;
-  lvItem.mask = LVIF_STATE;
-  lvItem.state = lpLVItem->state;
-  lvItem.stateMask = lpLVItem->stateMask;
-
-  if (nItem == -1)
-  {
-    /* apply to all items */
-    for (lvItem.iItem = 0; lvItem.iItem < GETITEMCOUNT(infoPtr); lvItem.iItem++)
-      if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
-  }
-  else
-    bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);
+    lvItem.iItem = nItem;
+    lvItem.iSubItem = 0;
+    lvItem.mask = LVIF_STATE;
+    lvItem.state = lpLVItem->state;
+    lvItem.stateMask = lpLVItem->stateMask;
+    TRACE("lvItem=%s\n", debuglvitem_t(&lvItem, TRUE));
+
+    if (nItem == -1)
+    {
+    	/* apply to all items */
+    	for (lvItem.iItem = 0; lvItem.iItem < GETITEMCOUNT(infoPtr); lvItem.iItem++)
+	    if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
+    }
+    else
+	bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);
 
-  return bResult;
+    return bResult;
 }
 
 /***




More information about the wine-devel mailing list