Listview V1

Dimitrie O. Paun dpaun at rogers.com
Sun Oct 20 02:26:08 CDT 2002


The "I hate defensive programming" patch.

Asserting instead of gracefully failing on internal errors
proved to be a good strategy to find important bugs. This
patch extends this throughout the code.

I hope to add as many of the internal invariants as asserts
in the future.

You may experience crashes. Please report them, and in short
order we'll have a much better listview. No pain, no gain,
I guess... :)

ChangeLog
  Assert on internal invariants, rather than fail gracefully.

--- dlls/comctl32/listview.c.V0	Sat Oct 19 17:49:34 2002
+++ dlls/comctl32/listview.c	Sun Oct 20 03:19:43 2002
@@ -275,18 +275,18 @@
  * forward declarations
  */
 static BOOL LISTVIEW_GetItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL);
-static BOOL LISTVIEW_GetItemBox(LISTVIEW_INFO *, INT, LPRECT);
+static void LISTVIEW_GetItemBox(LISTVIEW_INFO *, INT, LPRECT);
 static void LISTVIEW_AlignLeft(LISTVIEW_INFO *);
 static void LISTVIEW_AlignTop(LISTVIEW_INFO *);
 static void LISTVIEW_AddGroupSelection(LISTVIEW_INFO *, INT);
 static INT LISTVIEW_CalculateMaxHeight(LISTVIEW_INFO *);
-static BOOL LISTVIEW_GetItemOrigin(LISTVIEW_INFO *, INT, LPPOINT);
+static void LISTVIEW_GetItemOrigin(LISTVIEW_INFO *, INT, LPPOINT);
 static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *, INT, LPPOINT);
 static BOOL LISTVIEW_GetItemRect(LISTVIEW_INFO *, INT, LPRECT);
 static INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *);
 static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *, INT);
 static INT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *, INT);
-static BOOL LISTVIEW_GetOrigin(LISTVIEW_INFO *, LPPOINT);
+static void LISTVIEW_GetOrigin(LISTVIEW_INFO *, LPPOINT);
 static BOOL LISTVIEW_GetViewRect(LISTVIEW_INFO *, LPRECT);
 static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *, INT);
 static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL);
@@ -922,7 +922,7 @@
     /* in case we fail, we want to return an empty iterator */
     if (!iterator_empty(i)) return FALSE;
 
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
 
     TRACE("(lprc=%s)\n", debugrect(lprc));
     OffsetRect(&frame, -Origin.x, -Origin.y);
@@ -931,9 +931,10 @@
     {
 	INT nItem;
 	
-	if (uView == LVS_ICON)
+	if (uView == LVS_ICON && infoPtr->nFocusedItem != -1)
 	{
-	    if (LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcItem) && IntersectRect(&rcTemp, &rcItem, lprc))
+	    LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcItem);
+	    if (IntersectRect(&rcTemp, &rcItem, lprc))
 		i->nSpecial = infoPtr->nFocusedItem;
 	}
 	if (!(i->ranges = ranges_create(50))) return FALSE;
@@ -1015,11 +1016,14 @@
     if (rgntype == SIMPLEREGION) return TRUE;
 
     /* first deal with the special item */
-    if (LISTVIEW_GetItemBox(infoPtr, i->nSpecial, &rcItem) && !RectVisible(hdc, &rcItem))
-	i->nSpecial = -1;
+    if (i->nSpecial != -1)
+    {
+	LISTVIEW_GetItemBox(infoPtr, i->nSpecial, &rcItem);
+	if (!RectVisible(hdc, &rcItem)) i->nSpecial = -1;
+    }
     
     /* if we can't deal with the region, we'll just go with the simple range */
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return TRUE;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
     TRACE("building visible range:\n");
     if (!i->ranges && i->range.lower < i->range.upper)
     {
@@ -1035,7 +1039,7 @@
     /* now delete the invisible items from the list */
     while(iterator_next(i))
     {
-	if (!LISTVIEW_GetItemOrigin(infoPtr, i->nItem, &Position)) continue;
+	LISTVIEW_GetItemOrigin(infoPtr, i->nItem, &Position);
 	rcItem.left = Position.x + Origin.x;
 	rcItem.top = Position.y + Origin.y;
 	rcItem.right = rcItem.left + infoPtr->nItemWidth;
@@ -1069,33 +1073,36 @@
 
 #define LISTVIEW_InvalidateItem(infoPtr, nItem) do { \
     RECT rcBox; \
-    if(LISTVIEW_GetItemBox(infoPtr, nItem, &rcBox)) \
-	LISTVIEW_InvalidateRect(infoPtr, &rcBox); \
+    LISTVIEW_GetItemBox(infoPtr, nItem, &rcBox); \
+    LISTVIEW_InvalidateRect(infoPtr, &rcBox); \
 } while (0)
 
 #define LISTVIEW_InvalidateSubItem(infoPtr, nItem, nSubItem) do { \
     POINT Origin, Position; \
     RECT rcBox; \
-    if (LISTVIEW_GetOrigin(infoPtr, &Origin) && \
-	LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position) && \
-	LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox)) { \
-	OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y); \
-	LISTVIEW_InvalidateRect(infoPtr, &rcBox); \
-    }\
+    LISTVIEW_GetOrigin(infoPtr, &Origin); \
+    LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position); \
+    LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox); \
+    OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y); \
+    LISTVIEW_InvalidateRect(infoPtr, &rcBox); \
 } while (0)
 
 #define LISTVIEW_InvalidateList(infoPtr)\
     LISTVIEW_InvalidateRect(infoPtr, NULL)
 
 
-static inline BOOL LISTVIEW_GetHeaderRect(LISTVIEW_INFO *infoPtr, INT nSubItem, RECT *lprc)
+static inline COLUMN_INFO * LISTVIEW_GetColumnInfo(LISTVIEW_INFO *infoPtr, INT nSubItem)
 {
     COLUMN_INFO *columnInfo;
-    
+    assert (nSubItem >= 0 && nSubItem < infoPtr->hdpaColumns->nItemCount);
     columnInfo = (COLUMN_INFO *)DPA_GetPtr(infoPtr->hdpaColumns, nSubItem);
-    if (!columnInfo) return FALSE;
-    *lprc = columnInfo->rcHeader;
-    return TRUE;
+    assert (columnInfo);
+    return columnInfo;
+}
+	
+static inline void LISTVIEW_GetHeaderRect(LISTVIEW_INFO *infoPtr, INT nSubItem, RECT *lprc)
+{
+    *lprc = LISTVIEW_GetColumnInfo(infoPtr, nSubItem)->rcHeader;
 }
 	
 static inline BOOL LISTVIEW_GetItemW(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem)
@@ -1453,8 +1460,7 @@
     {
 	RECT rcBox;
 
-	if (!LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcBox)) 
-	    return;
+	LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcBox); 
 	if ((rcBox.bottom - rcBox.top) > infoPtr->nItemHeight)
 	{
 	    LISTVIEW_InvalidateRect(infoPtr, &rcBox);
@@ -1483,7 +1489,7 @@
 	if (fShow) dis.itemState |= ODS_FOCUS;
 	dis.hwndItem = infoPtr->hwndSelf;
 	dis.hDC = hdc;
-	if (!LISTVIEW_GetItemBox(infoPtr, dis.itemID, &dis.rcItem)) goto done;
+	LISTVIEW_GetItemBox(infoPtr, dis.itemID, &dis.rcItem);
 	dis.itemData = item.lParam;
 
 	SendMessageW(GetParent(infoPtr->hwndSelf), WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
@@ -1555,14 +1561,13 @@
  * [O] lpptOrig : item top, left corner
  *
  * RETURN:
- *   TRUE if computations OK
- *   FALSE otherwise
+ *   None.
  */
-static BOOL LISTVIEW_GetItemOrigin(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
+static void LISTVIEW_GetItemOrigin(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
 {
     UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
 
-    if (nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
+    assert(nItem >= 0 && nItem < infoPtr->nItemCount);
 
     if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     {
@@ -1580,8 +1585,6 @@
 	lpptPosition->x = REPORT_MARGINX;
 	lpptPosition->y = nItem * infoPtr->nItemHeight;
     }
-
-    return TRUE;
 }
     
 /***
@@ -1623,10 +1626,9 @@
  *                Same as LVM_GETITEMRECT with LVIR_LABEL
  *
  * RETURN:
- *   TRUE if computations OK
- *   FALSE otherwise
+ *   None.
  */
-static BOOL LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem,
+static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem,
 				    LPRECT lprcBox, LPRECT lprcState, 
 				    LPRECT lprcIcon, LPRECT lprcLabel)
 {
@@ -1652,10 +1654,7 @@
     /* compute the box rectangle (it should be cheap to do)     */
     /************************************************************/
     if (lpLVItem->iSubItem || uView == LVS_REPORT)
-    {
-	lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, lpLVItem->iSubItem);
-	assert(lpColumnInfo);
-    }
+	lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, lpLVItem->iSubItem);
 
     if (lpLVItem->iSubItem)    
     {
@@ -1831,8 +1830,6 @@
 	else *lprcBox = Box;
     }
     TRACE("    - box=%s\n", debugrect(&Box));
-
-    return TRUE;
 }
 
 /***
@@ -1844,18 +1841,17 @@
  * [O] lprcBox : ptr to Box rectangle
  *
  * RETURN:
- *   TRUE if computations OK
- *   FALSE otherwise
+ *   None.
  */
-static BOOL LISTVIEW_GetItemBox(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprcBox)
+static void LISTVIEW_GetItemBox(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprcBox)
 {
     UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
     WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
     POINT Position, Origin;
     LVITEMW lvItem;
 
-    if (!LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position)) return FALSE;
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
+    LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
 
     /* Be smart and try to figure out the minimum we have to do */
     lvItem.mask = 0;
@@ -1865,18 +1861,16 @@
     lvItem.iSubItem = 0;
     lvItem.pszText = szDispText;
     lvItem.cchTextMax = DISP_TEXT_SIZE;
-    if (lvItem.mask && !LISTVIEW_GetItemW(infoPtr, &lvItem)) return FALSE;
+    if (lvItem.mask) LISTVIEW_GetItemW(infoPtr, &lvItem);
     if (uView == LVS_ICON)
     {
 	lvItem.mask |= LVIF_STATE;
 	lvItem.stateMask = LVIS_FOCUSED;
 	lvItem.state = (lvItem.mask & LVIF_TEXT ? LVIS_FOCUSED : 0);
     }
-    if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprcBox, 0, 0, 0)) return FALSE;
+    LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprcBox, 0, 0, 0);
 
     OffsetRect(lprcBox, Position.x + Origin.x, Position.y + Origin.y);
-
-    return TRUE;
 }
 
 /***
@@ -2033,7 +2027,7 @@
 
     if (!lprcView) return FALSE;
   
-    if (!LISTVIEW_GetOrigin(infoPtr, &ptOrigin)) return FALSE;
+    LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
    
     *lprcView = infoPtr->rcView;
     OffsetRect(lprcView, ptOrigin.x, ptOrigin.y); 
@@ -2096,8 +2090,10 @@
 	
 	/* calculate width of header */
 	for (i = 0; i < infoPtr->hdpaColumns->nItemCount; i++)
-	    if (LISTVIEW_GetHeaderRect(infoPtr, i, &rcHeaderItem))
-		nItemWidth += (rcHeaderItem.right - rcHeaderItem.left);
+	{
+	    LISTVIEW_GetHeaderRect(infoPtr, i, &rcHeaderItem);
+	    nItemWidth += (rcHeaderItem.right - rcHeaderItem.left);
+	}
     }
     else
     {
@@ -3306,7 +3302,7 @@
     lprcFocus = infoPtr->bFocus && (lvItem.state & LVIS_FOCUSED) ? &infoPtr->rcFocus : 0;
     
     if (!lprcFocus) lvItem.state &= ~LVIS_FOCUSED;
-    if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcState, &rcIcon, &rcLabel)) return FALSE;
+    LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcState, &rcIcon, &rcLabel);
     OffsetRect(&rcBox, pos.x, pos.y);
     OffsetRect(&rcState, pos.x, pos.y);
     OffsetRect(&rcIcon, pos.x, pos.y);
@@ -3383,14 +3379,12 @@
 	uFormat = (lprcFocus ? LV_FL_DT_FLAGS : LV_ML_DT_FLAGS);
     else if (nSubItem)
     {
-	COLUMN_INFO *lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nSubItem);
-	if (lpColumnInfo)
-	    switch (lpColumnInfo->fmt & LVCFMT_JUSTIFYMASK)
-	    {
-	    case LVCFMT_RIGHT:  uFormat |= DT_RIGHT;  break;
-	    case LVCFMT_CENTER: uFormat |= DT_CENTER; break;
-	    default:            uFormat |= DT_LEFT;
-	    }
+	switch (LISTVIEW_GetColumnInfo(infoPtr, nSubItem)->fmt & LVCFMT_JUSTIFYMASK)
+	{
+	case LVCFMT_RIGHT:  uFormat |= DT_RIGHT;  break;
+	case LVCFMT_CENTER: uFormat |= DT_CENTER; break;
+	default:            uFormat |= DT_LEFT;
+	}
     }
     if (!(uFormat & (DT_RIGHT | DT_CENTER))) rcLabel.left += 2;
     DrawTextW(hdc, lvItem.pszText, -1, &rcLabel, uFormat);
@@ -3426,7 +3420,7 @@
     ZeroMemory(&dis, sizeof(dis));
     
     /* Get scroll info once before loop */
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
 
     /* figure out what we need to draw */
     iterator_visibleitems(&i, infoPtr, hdc);
@@ -3461,7 +3455,7 @@
 	if (infoPtr->bFocus && (item.state & LVIS_FOCUSED)) dis.itemState |= ODS_FOCUS;
 	dis.hwndItem = infoPtr->hwndSelf;
 	dis.hDC = hdc;
-	if (!LISTVIEW_GetItemOrigin(infoPtr, dis.itemID, &Position)) continue;
+	LISTVIEW_GetItemOrigin(infoPtr, dis.itemID, &Position);
 	dis.rcItem.left = Position.x + Origin.x;
 	dis.rcItem.right = dis.rcItem.left + infoPtr->nItemWidth;
 	dis.rcItem.top = Position.y + Origin.y;
@@ -3500,15 +3494,19 @@
     if (rgntype == NULLREGION) return;
     
     /* Get scroll info once before loop */
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
     
     /* narrow down the columns we need to paint */
     for(nFirstCol = 0; nFirstCol < infoPtr->hdpaColumns->nItemCount; nFirstCol++)
-	if (LISTVIEW_GetHeaderRect(infoPtr, nFirstCol, &rcItem) &&
-	    rcItem.right + Origin.x >= rcClip.left) break;
+    {
+	LISTVIEW_GetHeaderRect(infoPtr, nFirstCol, &rcItem);
+	if (rcItem.right + Origin.x >= rcClip.left) break;
+    }
     for(nLastCol = infoPtr->hdpaColumns->nItemCount - 1; nLastCol >= 0; nLastCol--)
-	if (LISTVIEW_GetHeaderRect(infoPtr, nLastCol, &rcItem) &&
-	    rcItem.left + Origin.x < rcClip.right) break;
+    {
+	LISTVIEW_GetHeaderRect(infoPtr, nLastCol, &rcItem);
+	if (rcItem.left + Origin.x < rcClip.right) break;
+    }
 
     /* figure out what we need to draw */
     iterator_visibleitems(&i, infoPtr, hdc);
@@ -3522,12 +3520,13 @@
 	/* iterate through the invalidated columns */
 	for (nCol = nFirstCol; nCol <= nLastCol; nCol++)
 	{
-	    if (!LISTVIEW_GetItemOrigin(infoPtr, i.nItem, &Position)) continue;
+	    LISTVIEW_GetItemOrigin(infoPtr, i.nItem, &Position);
 	    Position.x += Origin.x;
 	    Position.y += Origin.y;
 
-	    if (rgntype == COMPLEXREGION && LISTVIEW_GetHeaderRect(infoPtr, nCol, &rcItem))
+	    if (rgntype == COMPLEXREGION)
 	    {
+		LISTVIEW_GetHeaderRect(infoPtr, nCol, &rcItem);
 		rcItem.top = 0;
 	        rcItem.bottom = infoPtr->nItemHeight;
 		OffsetRect(&rcItem, Position.x, Position.y);
@@ -3558,14 +3557,14 @@
     ITERATOR i;
 
     /* Get scroll info once before loop */
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
     
     /* figure out what we need to draw */
     iterator_visibleitems(&i, infoPtr, hdc);
     
     while(iterator_prev(&i))
     {
-	if (!LISTVIEW_GetItemOrigin(infoPtr, i.nItem, &Position)) continue;
+	LISTVIEW_GetItemOrigin(infoPtr, i.nItem, &Position);
 	Position.x += Origin.x;
 	Position.y += Origin.y;
 
@@ -3885,27 +3884,29 @@
  * [I] dx : amount of scroll, in pixels
  *
  * RETURN:
- *   SUCCESS : TRUE
- *   FAILURE : FALSE
+ *   None.
  */
-static BOOL LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
+static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
 {
     COLUMN_INFO *lpColumnInfo;
     RECT rcOld, rcCol;
     INT nCol;
-    
-    if ((lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nColumn)))
-	rcCol = lpColumnInfo->rcHeader;
+   
+    lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, infoPtr->hdpaColumns->nItemCount - 1));
+    rcCol = lpColumnInfo->rcHeader;
+    if (nColumn >= infoPtr->hdpaColumns->nItemCount)
+	rcCol.left = rcCol.right;
     
     /* ajust the other columns */
-    for (nCol = nColumn; (lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nCol)); nCol++)
+    for (nCol = nColumn; nCol < infoPtr->hdpaColumns->nItemCount; nCol++)
     {
+	lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol);
         lpColumnInfo->rcHeader.left += dx;
         lpColumnInfo->rcHeader.right += dx;
     }
 
     /* do not update screen if not in report mode */
-    if ((infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return TRUE;
+    if ((infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return;
     
     /* if we have a focus, must first erase the focus rect */
     if (infoPtr->bFocus) LISTVIEW_ShowFocusRect(infoPtr, FALSE);
@@ -3922,8 +3923,6 @@
     
     /* we can restore focus now */
     if (infoPtr->bFocus) LISTVIEW_ShowFocusRect(infoPtr, TRUE);
-
-    return TRUE;
 }
 
 /***
@@ -3944,10 +3943,9 @@
     
     TRACE("nColumn=%d\n", nColumn);
 
-    if (nColumn <= 0) return FALSE;
+    if (nColumn <= 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE;
 
-    if (!LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol))
-	return FALSE;
+    LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol);
     
     if (!Header_DeleteItem(infoPtr->hwndHeader, nColumn))
 	return FALSE;
@@ -4346,7 +4344,7 @@
 	POINT Origin;
 	
 	FIXME("LVFI_NEARESTXY is slow.\n");
-        if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
+        LISTVIEW_GetOrigin(infoPtr, &Origin);
 	Destination.x = lpFindInfo->pt.x - Origin.x;
 	Destination.y = lpFindInfo->pt.y - Origin.y;
 	switch(lpFindInfo->vkDirection)
@@ -4398,7 +4396,7 @@
 	
 	/* This is very inefficient. To do a good job here,
 	 * we need a sorted array of (x,y) item positions */
-	if (!LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position)) continue;
+	LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
 
 	/* compute the distance^2 to the destination */
 	xdist = Destination.x - Position.x;
@@ -4490,7 +4488,7 @@
     HDITEMW hdi;
 
     if (!lpColumn || nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE;
-    if (!(lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nColumn))) return FALSE;
+    lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nColumn);
 
     /* initialize memory */
     ZeroMemory(&hdi, sizeof(hdi));
@@ -4566,8 +4564,9 @@
 	nColumnWidth = infoPtr->nItemWidth;
 	break;
     case LVS_REPORT:
-	if (LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader))
-	    nColumnWidth = rcHeader.right - rcHeader.left;
+	if (nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return 0;
+	LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader);
+	nColumnWidth = rcHeader.right - rcHeader.left;
 	break;
     }
 
@@ -4923,8 +4922,9 @@
     TRACE("(nItem=%d, lpptPosition=%p)\n", nItem, lpptPosition);
 
     if (!lpptPosition || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
-    if (!LISTVIEW_GetItemOrigin(infoPtr, nItem, lpptPosition)) return FALSE;
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
+
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
+    LISTVIEW_GetItemOrigin(infoPtr, nItem, lpptPosition);
 
     if (uView == LVS_ICON)
     {
@@ -5012,8 +5012,9 @@
     TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", infoPtr->hwndSelf, nItem, lprc);
 
     if (!lprc || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
-    if (!LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position)) return FALSE;
+
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
+    LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
 
     /* Be smart and try to figure out the minimum we have to do */
     if (lprc->left == LVIR_ICON) doLabel = FALSE;
@@ -5046,19 +5047,19 @@
     switch(lprc->left)
     {
     case LVIR_ICON:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL);
         break;
 
     case LVIR_LABEL:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, NULL, lprc)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, NULL, lprc);
         break;
 
     case LVIR_BOUNDS:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL);
         break;
 
     case LVIR_SELECTBOUNDS:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, &label_rect)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, &label_rect);
 	UnionRect(lprc, lprc, &label_rect);
         break;
 
@@ -5101,7 +5102,7 @@
     
     TRACE("(nItem=%d, nSubItem=%d)\n", nItem, lprc->top);
 
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
     if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &Position)) return FALSE;
 
     lvItem.mask = lprc->top == 0 ? LVIF_INDENT : 0;
@@ -5112,12 +5113,12 @@
     switch(lprc->left)
     {
     case LVIR_ICON:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL);
         break;
 
     case LVIR_LABEL:
     case LVIR_BOUNDS:
-	if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL)) return FALSE;
+	LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL);
         break;
 
     default:
@@ -5408,18 +5409,15 @@
  * [O] lpptOrigin : coordinate information
  *
  * RETURN:
- *   SUCCESS : TRUE
- *   FAILURE : FALSE
+ *   None.
  */
-static BOOL LISTVIEW_GetOrigin(LISTVIEW_INFO *infoPtr, LPPOINT lpptOrigin)
+static void LISTVIEW_GetOrigin(LISTVIEW_INFO *infoPtr, LPPOINT lpptOrigin)
 {
     DWORD lStyle = infoPtr->dwStyle;
     UINT uView = lStyle & LVS_TYPEMASK;
     INT nHorzPos = 0, nVertPos = 0;
     SCROLLINFO scrollInfo;
 
-    if (!lpptOrigin) return FALSE;
-
     scrollInfo.cbSize = sizeof(SCROLLINFO);    
     scrollInfo.fMask = SIF_POS;
     
@@ -5441,8 +5439,6 @@
     lpptOrigin->y -= nVertPos;
 
     TRACE(" origin=%s\n", debugpoint(lpptOrigin));
-
-    return TRUE;
 }
 
 /***
@@ -5528,7 +5524,7 @@
 
     lpht->flags |= LVHT_NOWHERE;
 
-    if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
+    LISTVIEW_GetOrigin(infoPtr, &Origin);
    
     /* first deal with the large items */
     rcSearch.left = lpht->pt.x;
@@ -5555,8 +5551,8 @@
     if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
     if (!infoPtr->bFocus) lvItem.state &= ~LVIS_FOCUSED; 
     
-    if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcState, &rcIcon, &rcLabel)) return -1;
-    if (!LISTVIEW_GetItemOrigin(infoPtr, lpht->iItem, &Position)) return -1;
+    LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcState, &rcIcon, &rcLabel);
+    LISTVIEW_GetItemOrigin(infoPtr, lpht->iItem, &Position);
     opt.x = lpht->pt.x - Position.x - Origin.x;
     opt.y = lpht->pt.y - Position.y - Origin.y;
     
@@ -5678,12 +5674,14 @@
     is_sorted = (lStyle & (LVS_SORTASCENDING | LVS_SORTDESCENDING)) &&
 	        !(lStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
 
-    nItem = DPA_InsertPtr( infoPtr->hdpaItems, 
-		           is_sorted ? infoPtr->nItemCount + 1 : lpLVItem->iItem, 
-			   hdpaSubItems );
+    nItem = is_sorted ? infoPtr->nItemCount + 1 : lpLVItem->iItem;
+    TRACE(" inserting at %d, sorted=%d, count=%d, iItem=%d\n", nItem, is_sorted, infoPtr->nItemCount, lpLVItem->iItem);
+    nItem = DPA_InsertPtr( infoPtr->hdpaItems, nItem, hdpaSubItems );
+    TRACE(" result of insert is %d\n", nItem);
     if (nItem == -1) goto fail;
     /* the array may be sparsly populated, we can't just increment the count here */
     infoPtr->nItemCount = infoPtr->hdpaItems->nItemCount;
+    TRACE(" item count is %d\n", infoPtr->nItemCount);
   
     /* set the item attributes */ 
     if (!set_main_item(infoPtr, lpLVItem, TRUE, isW, &has_changed)) goto undo;
@@ -5891,8 +5889,10 @@
             INT item_index;
 
             for(item_index = 0; item_index < (nColumn - 1); item_index++)
-            	if (LISTVIEW_GetHeaderRect(infoPtr, item_index, &rcHeader))
-		    lphdi->cxy += rcHeader.right - rcHeader.left;
+	    {
+            	LISTVIEW_GetHeaderRect(infoPtr, item_index, &rcHeader);
+		lphdi->cxy += rcHeader.right - rcHeader.left;
+	    }
 
             /* retrieve the layout of the header */
             GetClientRect(infoPtr->hwndSelf, &rcHeader);
@@ -6079,7 +6079,7 @@
 	      hdi.fmt = hdiget.fmt & HDF_STRING;
     }
 
-    if (!(lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nColumn))) return FALSE;
+    lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nColumn);
 
     column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW);
 
@@ -6208,8 +6208,8 @@
 
         for(item_index = 0; item_index < (header_item_count - 1); item_index++) 
 	{
-	  if (LISTVIEW_GetHeaderRect(infoPtr, item_index, &rcHeader))
-	    cx += rcHeader.right - rcHeader.left;
+	  LISTVIEW_GetHeaderRect(infoPtr, item_index, &rcHeader);
+	  cx += rcHeader.right - rcHeader.left;
         }
 
         /* retrieve the layout of the header */
@@ -7661,8 +7661,10 @@
 	    RECT rcCol;
 	    INT dx;
 
-	    if (!(lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, lphnm->iItem))) return 0;
+	    if (lphnm->iItem < 0 || lphnm->iItem >= infoPtr->hdpaColumns->nItemCount) return 0;
 	    if (!(lphnm->pitem->mask & HDI_WIDTH)) return 0;
+
+	    lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, lphnm->iItem);
 	    
 	    /* determine how much we change since the last know position */
 	    dx = lphnm->pitem->cxy - (lpColumnInfo->rcHeader.right - lpColumnInfo->rcHeader.left);
@@ -8334,7 +8336,9 @@
     return 1;
 
   case LVM_GETORIGIN:
-    return LISTVIEW_GetOrigin(infoPtr, (LPPOINT)lParam);
+    if (!lParam) return FALSE;
+    LISTVIEW_GetOrigin(infoPtr, (LPPOINT)lParam);
+    return TRUE;
 
   /* case LVN_GETOUTLINECOLOR: */
 




More information about the wine-patches mailing list