Listview L2

Dimitrie O. Paun dpaun at rogers.com
Sun Oct 6 17:13:17 CDT 2002


Another rounds of cleanups

ChangeLog
  -- Cleanup of the way we maintain/lookup the item count
  -- Rename GetItemWidth to CalculateMaxWidth
  -- Misc trivial changes.

--- dlls/comctl32/listview.c.L1	Sun Oct  6 17:30:50 2002
+++ dlls/comctl32/listview.c	Sun Oct  6 18:12:29 2002
@@ -154,6 +154,7 @@
   DWORD dwStyle;		/* the cached window GWL_STYLE */
   DWORD dwLvExStyle;		/* extended listview style */
   HDPA hdpaItems;
+  UINT nItemCount;
   PFNLVCOMPARE pfnCompare;
   LPARAM lParamSort;
   HWND hwndEdit;
@@ -234,12 +235,7 @@
 /* Standard DrawText flags for LISTVIEW_UpdateLargeItemLabelRect and LISTVIEW_DrawLargeItem */
 #define LISTVIEW_DTFLAGS  DT_TOP | DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_EDITCONTROL
 
-/*
- * macros
- */
-/* retrieve the number of items in the listview */
-#define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount)
-
+/* Dump the LISTVIEW_INFO structure to the debug channel */
 #define LISTVIEW_DUMP(iP) do { \
   TRACE("hwndSelf=%08x, clrBk=0x%06lx, clrText=0x%06lx, clrTextBk=0x%06lx, ItemHeight=%d, ItemWidth=%d, Style=0x%08lx\n", \
         iP->hwndSelf, iP->clrBk, iP->clrText, iP->clrTextBk, \
@@ -269,7 +265,7 @@
 static INT LISTVIEW_GetItemHeight(LISTVIEW_INFO *);
 static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *, INT, LPPOINT);
 static BOOL LISTVIEW_GetItemRect(LISTVIEW_INFO *, INT, LPRECT);
-static INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *);
+static INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *);
 static BOOL LISTVIEW_GetSubItemRect(LISTVIEW_INFO *, INT, LPRECT);
 static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *, INT);
 static LRESULT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *, INT);
@@ -821,8 +817,8 @@
     }
 
     visrange.upper = visrange.lower + nPerCol * nPerRow;
-    if (visrange.upper > GETITEMCOUNT(infoPtr)) 
-	visrange.upper = GETITEMCOUNT(infoPtr);
+    if (visrange.upper > infoPtr->nItemCount) 
+	visrange.upper = infoPtr->nItemCount;
    
     TRACE("range=(%d, %d)\n", visrange.lower, visrange.upper);
 
@@ -874,18 +870,13 @@
 static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
 {
     INT nItem;
-    INT nSize;
     INT endidx,idx;
     LVITEMW item;
     WCHAR buffer[MAX_PATH];
     DWORD timestamp,elapsed;
 
     /* simple parameter checking */
-    if (!charCode || !keyData)
-        return 0;
-
-    if (!infoPtr)
-        return 0;
+    if (!charCode || !keyData) return 0;
 
     /* only allow the valid WM_CHARs through */
     if (!isalnum(charCode) &&
@@ -900,10 +891,8 @@
         charCode != '<' && charCode != ',' && charCode != '~')
         return 0;
 
-    nSize=GETITEMCOUNT(infoPtr);
     /* if there's one item or less, there is no where to go */
-    if (nSize <= 1)
-        return 0;
+    if (infoPtr->nItemCount <= 1) return 0;
 
     /* compute how much time elapsed since last keypress */
     timestamp=GetTickCount();
@@ -941,12 +930,12 @@
         if (infoPtr->nSearchParamLength == 1)
             idx++;
     } else {
-        endidx=nSize;
+        endidx=infoPtr->nItemCount;
         idx=0;
     }
     do {
-        if (idx == nSize) {
-            if (endidx == nSize || endidx == 0)
+        if (idx == infoPtr->nItemCount) {
+            if (endidx == infoPtr->nItemCount || endidx == 0)
                 break;
             idx=0;
         }
@@ -1041,14 +1030,13 @@
     /* update horizontal scrollbar */
     INT nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
     INT nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
-    INT nNumOfItems = GETITEMCOUNT(infoPtr);
 
     TRACE("items=%d, perColumn=%d, perRow=%d\n",
-	  nNumOfItems, nCountPerColumn, nCountPerRow);
+	  infoPtr->nItemCount, nCountPerColumn, nCountPerRow);
    
     scrollInfo.nMin = 0; 
-    scrollInfo.nMax = nNumOfItems / nCountPerColumn;
-    if((nNumOfItems % nCountPerColumn) == 0)
+    scrollInfo.nMax = infoPtr->nItemCount / nCountPerColumn;
+    if((infoPtr->nItemCount % nCountPerColumn) == 0)
         scrollInfo.nMax--;
     if (scrollInfo.nMax < 0) scrollInfo.nMax = 0;
     scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf) / nCountPerColumn;
@@ -1063,7 +1051,7 @@
 
     /* update vertical scrollbar */
     scrollInfo.nMin = 0;
-    scrollInfo.nMax = GETITEMCOUNT(infoPtr) - 1;
+    scrollInfo.nMax = infoPtr->nItemCount - 1;
     scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf);
     scrollInfo.nPage = LISTVIEW_GetCountPerColumn(infoPtr);
     scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
@@ -1077,7 +1065,7 @@
     nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
     scrollInfo.fMask = SIF_POS;
     if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo)
-       || GETITEMCOUNT(infoPtr) == 0)
+       || infoPtr->nItemCount == 0)
     {
       scrollInfo.nPos = 0;
     }
@@ -1109,7 +1097,7 @@
       /* Update Horizontal Scrollbar */
       scrollInfo.fMask = SIF_POS;
       if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo)
-        || GETITEMCOUNT(infoPtr) == 0)
+        || infoPtr->nItemCount == 0)
       {
         scrollInfo.nPos = 0;
       }
@@ -1124,7 +1112,7 @@
       nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
       scrollInfo.fMask = SIF_POS;
       if (!GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo)
-        || GETITEMCOUNT(infoPtr) == 0)
+        || infoPtr->nItemCount == 0)
       {
         scrollInfo.nPos = 0;
       }
@@ -1530,7 +1518,7 @@
 
     if (nListWidth > infoPtr->nItemWidth)
     {
-      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+      for (i = 0; i < infoPtr->nItemCount; i++)
       {
         if ((ptItem.x-off_x) + infoPtr->nItemWidth > nListWidth)
         {
@@ -1548,7 +1536,7 @@
     }
     else
     {
-      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+      for (i = 0; i < infoPtr->nItemCount; i++)
       {
         LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.y += infoPtr->nItemHeight;
@@ -1596,7 +1584,7 @@
 
     if (nListHeight > infoPtr->nItemHeight)
     {
-      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+      for (i = 0; i < infoPtr->nItemCount; i++)
       {
         if (ptItem.y + infoPtr->nItemHeight > nListHeight)
         {
@@ -1613,7 +1601,7 @@
     }
     else
     {
-      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+      for (i = 0; i < infoPtr->nItemCount; i++)
       {
         LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.x += infoPtr->nItemWidth;
@@ -1699,7 +1687,7 @@
  * RETURN:
  * Returns the width of an item width an item.
  */
-static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
+static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr, INT nItem)
 {
     UINT uView = LISTVIEW_GetType(infoPtr);
     INT nItemWidth = 0, i;
@@ -1721,12 +1709,12 @@
     {
 	INT nLabelWidth;
 	
-	if (GETITEMCOUNT(infoPtr) == 0) return DEFAULT_COLUMN_WIDTH;
+	if (infoPtr->nItemCount == 0) return DEFAULT_COLUMN_WIDTH;
     
         /* get width of string */
 	if (nItem == -1) 
 	{
-	    for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+	    for (i = 0; i < infoPtr->nItemCount; i++)
 	    {
 		nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, i);
 		nItemWidth = max(nItemWidth, nLabelWidth);
@@ -1755,9 +1743,9 @@
  * RETURN:
  * Returns item width.
  */
-static inline INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *infoPtr)
+static inline INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *infoPtr)
 {
-    return LISTVIEW_CalculateWidth(infoPtr, -1);
+    return LISTVIEW_CalculateItemWidth(infoPtr, -1);
 }
 
 /***
@@ -2116,7 +2104,7 @@
     if (infoPtr->uCallbackMask & LVIS_SELECTED)
     {
         INT i;
-	for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+	for (i = 0; i < infoPtr->nItemCount; i++)
   	{
 	    if (LISTVIEW_GetItemState(infoPtr, i, LVIS_SELECTED))
 		nSelectedCount++;
@@ -2204,8 +2192,8 @@
   {
     if (direction > 0)
       infoPtr->nSelectionMark += direction;
-    else if (infoPtr->nSelectionMark >= GETITEMCOUNT(infoPtr))
-      infoPtr->nSelectionMark = GETITEMCOUNT(infoPtr) - 1;
+    else if (infoPtr->nSelectionMark >= infoPtr->nItemCount)
+      infoPtr->nSelectionMark = infoPtr->nItemCount - 1;
   }
 
   if (infoPtr->nFocusedItem > nItem)
@@ -2216,8 +2204,8 @@
       infoPtr->nFocusedItem += direction;
     else
     {
-      if (infoPtr->nFocusedItem >= GETITEMCOUNT(infoPtr))
-        infoPtr->nFocusedItem = GETITEMCOUNT(infoPtr) - 1;
+      if (infoPtr->nFocusedItem >= infoPtr->nItemCount)
+        infoPtr->nFocusedItem = infoPtr->nItemCount - 1;
       if (infoPtr->nFocusedItem >= 0)
         LISTVIEW_SetItemFocus(infoPtr, infoPtr->nFocusedItem);
     }
@@ -2309,7 +2297,7 @@
 	rcSelMark.left = LVIR_BOUNDS;
 	if (!LISTVIEW_GetItemRect(infoPtr, infoPtr->nSelectionMark, &rcSelMark)) return;
 	UnionRect(&rcSel, &rcItem, &rcSelMark);
-	for (i = 0; i <= GETITEMCOUNT(infoPtr); i++)
+	for (i = 0; i <= infoPtr->nItemCount; i++)
 	{
 	    LISTVIEW_GetItemPosition(infoPtr, i, &ptItem);
 	    if (PtInRect(&rcSel, ptItem)) 
@@ -2366,7 +2354,7 @@
   WORD wCtrl = HIWORD(GetKeyState(VK_CONTROL));
   BOOL bResult = FALSE;
 
-  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
+  if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
   {
     if (lStyle & LVS_SINGLESEL)
     {
@@ -2673,7 +2661,7 @@
     /* if LVS_LIST or LVS_SMALLICON, update the width of the items */
     if((uChanged & LVIF_TEXT) && ((uView == LVS_LIST) || (uView == LVS_SMALLICON)))
     {
-	int item_width = LISTVIEW_CalculateWidth(infoPtr, lpLVItem->iItem);
+	int item_width = LISTVIEW_CalculateItemWidth(infoPtr, lpLVItem->iItem);
 	if(item_width > infoPtr->nItemWidth) infoPtr->nItemWidth = item_width;
     }
 
@@ -2791,8 +2779,7 @@
     
     TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
-    if (!lpLVItem || lpLVItem->iItem < 0 ||
-	lpLVItem->iItem>=GETITEMCOUNT(infoPtr))
+    if (!lpLVItem || lpLVItem->iItem < 0 || lpLVItem->iItem >= infoPtr->nItemCount)
 	return FALSE;
    
     /* For efficiency, we transform the lpLVItem->pszText to Unicode here */
@@ -3288,9 +3275,6 @@
 
     TRACE("()\n");
 
-    /* nothing to draw */
-    if(GETITEMCOUNT(infoPtr) == 0) return;
-
     /* figure out what to draw */
     rgntype = GetClipBox(hdc, &rcClip);
     if (rgntype == NULLREGION) return;
@@ -3302,8 +3286,8 @@
         nItem = nTop;
     nLast = nItem + nUpdateHeight / infoPtr->nItemHeight;
     if (nUpdateHeight % infoPtr->nItemHeight) nLast++;
-    if (nLast > GETITEMCOUNT(infoPtr))
-        nLast = GETITEMCOUNT(infoPtr);
+    if (nLast > infoPtr->nItemCount)
+        nLast = infoPtr->nItemCount;
 
     /* send cache hint notification */
     if (lStyle & LVS_OWNERDATA) 
@@ -3484,15 +3468,11 @@
   TRACE("nColumnCount=%d, nCountPerColumn=%d, start item=%d\n",
 	nColumnCount, nCountPerColumn, nItem);
 
-  /* nothing to draw, return here */
-  if(GETITEMCOUNT(infoPtr) == 0)
-    return;
-
   for (i = 0; i < nColumnCount; i++)
   {
     for (j = 0; j < nCountPerColumn; j++, nItem++)
     {
-      if (nItem >= GETITEMCOUNT(infoPtr))
+      if (nItem >= infoPtr->nItemCount)
         return;
 
       if (cdmode & CDRF_NOTIFYITEMDRAW)
@@ -3535,16 +3515,12 @@
 
   TRACE("\n");
 
-  /* nothing to draw, return here */
-  if(GETITEMCOUNT(infoPtr) == 0)
-    return;
-
   if (!LISTVIEW_GetOrigin(infoPtr, &ptOrigin)) return;
 
   GetClipBox(hdc, &rcClip);
 
   /* Draw the visible non-selected items */
-  for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+  for (i = 0; i < infoPtr->nItemCount; i++)
   {
     if (LISTVIEW_GetItemState(infoPtr,i,LVIS_SELECTED))
 	continue;
@@ -3589,7 +3565,7 @@
   }
 
   /* Draw the visible selected items */
-  for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+  for (i = 0; i < infoPtr->nItemCount; i++)
   {
     if (!LISTVIEW_GetItemState(infoPtr,i,LVIS_SELECTED))
 	continue;
@@ -3661,6 +3637,9 @@
 
     infoPtr->bIsDrawing = TRUE;
 
+    /* nothing to draw */
+    if(infoPtr->nItemCount == 0) goto enddraw;
+
     /* select font */
     hOldFont = SelectObject(hdc, infoPtr->hFont);
 
@@ -3678,6 +3657,7 @@
     /* unselect objects */
     SelectObject(hdc, hOldFont);
 
+enddraw:
     if (cdmode & CDRF_NOTIFYPOSTPAINT)
 	notify_customdraw(infoPtr, CDDS_POSTPAINT, hdc, rcClient);
 
@@ -3707,7 +3687,7 @@
   DWORD dwViewRect = 0;
 
   if (nItemCount == -1)
-    nItemCount = GETITEMCOUNT(infoPtr);
+    nItemCount = infoPtr->nItemCount;
 
   if (uView == LVS_LIST)
   {
@@ -3824,12 +3804,12 @@
 
   if (lStyle & LVS_OWNERDATA)
   {
-    infoPtr->hdpaItems->nItemCount = 0;
+    infoPtr->nItemCount = 0;
     LISTVIEW_InvalidateList(infoPtr);
     return TRUE;
   }
 
-  if (GETITEMCOUNT(infoPtr) > 0)
+  if (infoPtr->nItemCount > 0)
   {
     INT i, j;
 
@@ -3840,7 +3820,7 @@
     nmlv.iItem = -1;
     bSuppress = notify_listview(infoPtr, LVN_DELETEALLITEMS, &nmlv);
 
-    for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
+    for (i = 0; i < infoPtr->nItemCount; i++)
     {
       hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i);
       if (hdpaSubItems != NULL)
@@ -3884,6 +3864,7 @@
 
     /* reinitialize listview memory */
     bResult = DPA_DeleteAllPtrs(infoPtr->hdpaItems);
+    infoPtr->nItemCount = 0;
 
     /* align items (set position of each item) */
     if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
@@ -3942,7 +3923,7 @@
 	HDPA hdpaSubItems;
 	INT nItem, nSubItem, i;
 	
-	for (nItem = 0; nItem < infoPtr->hdpaItems->nItemCount; nItem++)
+	for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
 	{
 	    hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
 	    if (!hdpaSubItems) continue;
@@ -3983,7 +3964,7 @@
     if (uView != LVS_REPORT) return TRUE;
 
     /* Need to reset the item width when deleting a column */
-    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+    infoPtr->nItemWidth -= rcCol.right - rcCol.left;
 
     /* update scrollbar(s) */
     LISTVIEW_UpdateScroll(infoPtr);
@@ -4042,12 +4023,12 @@
 
   if (lStyle & LVS_OWNERDATA)
   {
-    infoPtr->hdpaItems->nItemCount --;
+    infoPtr->nItemCount--;
     LISTVIEW_InvalidateList(infoPtr); /*FIXME: optimize */
     return TRUE;
   }
 
-  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
+  if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
   {
     /* initialize memory */
     ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
@@ -4055,6 +4036,7 @@
     hdpaSubItems = (HDPA)DPA_DeletePtr(infoPtr->hdpaItems, nItem);
     if (hdpaSubItems != NULL)
     {
+      infoPtr->nItemCount--;
       for (i = 1; i < hdpaSubItems->nItemCount; i++)
       {
         lpSubItem = (LISTVIEW_SUBITEM *)DPA_GetPtr(hdpaSubItems, i);
@@ -4359,7 +4341,7 @@
   LVITEMW lvItem;
   BOOL bWrap = FALSE;
   INT nItem = nStart;
-  INT nLast = GETITEMCOUNT(infoPtr);
+  INT nLast = infoPtr->nItemCount;
 
   if ((nItem >= -1) && (lpFindInfo != NULL))
   {
@@ -4667,7 +4649,7 @@
   }
   else
   {
-    nItemCount = GETITEMCOUNT(infoPtr);
+    nItemCount = infoPtr->nItemCount;
   }
 
   return nItemCount;
@@ -4764,7 +4746,7 @@
     TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
     if (!lpLVItem || (lpLVItem->iItem < 0) ||
-        (lpLVItem->iItem >= GETITEMCOUNT(infoPtr)))
+        (lpLVItem->iItem >= infoPtr->nItemCount))
 	return FALSE;
 
     /* a quick optimization if all we're asked is the focus state
@@ -4966,8 +4948,7 @@
     LPWSTR pszText;
     BOOL bResult;
 
-    if (!lpLVItem || (lpLVItem->iItem < 0) ||
-        (lpLVItem->iItem >= GETITEMCOUNT(infoPtr)))
+    if (!lpLVItem || lpLVItem->iItem < 0 || lpLVItem->iItem >= infoPtr->nItemCount)
 	return FALSE;
 
     pszText = lpLVItem->pszText;
@@ -4999,7 +4980,7 @@
 {
     TRACE("(nItem=%d, lpptPosition=%p)\n", nItem, lpptPosition);
 
-    if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr)) || !lpptPosition) return FALSE;
+    if (!lpptPosition || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
 
     return LISTVIEW_GetItemMeasures(infoPtr, nItem, lpptPosition, NULL, NULL, NULL, NULL);
 }
@@ -5189,7 +5170,7 @@
 
     TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", infoPtr->hwndSelf, nItem, lprc);
 
-    if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr)) || !lprc) return FALSE;
+    if (!lprc || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
 
     switch(lprc->left)
     {
@@ -5343,7 +5324,7 @@
 {
     LVITEMW lvItem;
 
-    if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr))) return 0;
+    if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
 
     lvItem.iItem = nItem;
     lvItem.iSubItem = 0;
@@ -5370,7 +5351,7 @@
  */
 static LRESULT LISTVIEW_GetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
 {
-    if (!lpLVItem || (nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr))) return 0;
+    if (!lpLVItem || nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
 
     lpLVItem->mask = LVIF_TEXT;
     lpLVItem->iItem = nItem;
@@ -5405,7 +5386,7 @@
 
     TRACE("nItem=%d, uFlags=%x\n", nItem, uFlags);
 
-    if ((nItem < -1) || (nItem >= GETITEMCOUNT(infoPtr))) return -1;
+    if (nItem < -1 || nItem >= infoPtr->nItemCount) return -1;
 
     ZeroMemory(&lvFindInfo, sizeof(lvFindInfo));
 
@@ -5456,7 +5437,7 @@
     {
       if ((uView == LVS_LIST) || (uView == LVS_REPORT))
       {
-        while (nItem < GETITEMCOUNT(infoPtr))
+        while (nItem < infoPtr->nItemCount)
         {
           nItem++;
           if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
@@ -5504,7 +5485,7 @@
       if (uView == LVS_LIST)
       {
         nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
-        while (nItem + nCountPerColumn < GETITEMCOUNT(infoPtr))
+        while (nItem + nCountPerColumn < infoPtr->nItemCount)
         {
           nItem += nCountPerColumn;
           if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
@@ -5528,7 +5509,7 @@
       nItem++;
 
       /* search by index */
-      for (i = nItem; i < GETITEMCOUNT(infoPtr); i++)
+      for (i = nItem; i < infoPtr->nItemCount; i++)
       {
         if ((LISTVIEW_GetItemState(infoPtr, i, uMask) & uMask) == uMask)
           return i;
@@ -5658,11 +5639,11 @@
   if (uView == LVS_REPORT)
   {
     bottomindex = topindex + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
-    bottomindex = min(bottomindex,GETITEMCOUNT(infoPtr));
+    bottomindex = min(bottomindex,infoPtr->nItemCount);
   }
   else
   {
-    bottomindex = GETITEMCOUNT(infoPtr);
+    bottomindex = infoPtr->nItemCount;
   }
 
   for (i = topindex; i < bottomindex; i++)
@@ -5888,7 +5869,7 @@
     if (!Header_GetItemRect(infoPtr->hwndHeader, nNewColumn, &rcCol)) return -1;
    
     /* now we have to actually adjust the data */
-    if (!(infoPtr->dwStyle & LVS_OWNERDATA) && infoPtr->hdpaItems->nItemCount > 0)
+    if (!(infoPtr->dwStyle & LVS_OWNERDATA) && infoPtr->nItemCount > 0)
     {
 	LISTVIEW_SUBITEM *lpSubItem, *lpMainItem, **lpNewItems = 0;
 	HDPA hdpaSubItems;
@@ -5897,11 +5878,11 @@
 	/* preallocate memory, so we can fail gracefully */
 	if (nNewColumn == 0)
 	{
-	    lpNewItems = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM *) * infoPtr->hdpaItems->nItemCount);
+	    lpNewItems = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM *) * infoPtr->nItemCount);
 	    if (!lpNewItems) return -1;
-	    for (i = 0; i < infoPtr->hdpaItems->nItemCount; i++)
+	    for (i = 0; i < infoPtr->nItemCount; i++)
 		if (!(lpNewItems[i] = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM)))) break;
-	    if (i != infoPtr->hdpaItems->nItemCount)
+	    if (i != infoPtr->nItemCount)
 	    {
 		for(; i >=0; i--) COMCTL32_Free(lpNewItems[i]);
 		COMCTL32_Free(lpNewItems);
@@ -5909,7 +5890,7 @@
 	    }
 	}
 	
-	for (nItem = 0; nItem < infoPtr->hdpaItems->nItemCount; nItem++)
+	for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
 	{
 	    hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
 	    if (!hdpaSubItems) continue;
@@ -5941,7 +5922,7 @@
     if ((infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return nNewColumn;
     
     /* Need to reset the item width when inserting a new column */
-    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+    infoPtr->nItemWidth += rcCol.right - rcCol.left;
 
     LISTVIEW_UpdateScroll(infoPtr);
 
@@ -6007,8 +5988,8 @@
 
     if (lStyle & LVS_OWNERDATA)
     {
-	nItem = infoPtr->hdpaItems->nItemCount;
-	infoPtr->hdpaItems->nItemCount++;
+	nItem = infoPtr->nItemCount;
+	infoPtr->nItemCount++;
 	return nItem;
     }
 
@@ -6029,13 +6010,15 @@
 	        !(lStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
 
     nItem = DPA_InsertPtr( infoPtr->hdpaItems, 
-		           is_sorted ? GETITEMCOUNT( infoPtr ) + 1 : lpLVItem->iItem, 
+		           is_sorted ? infoPtr->nItemCount + 1 : lpLVItem->iItem, 
 			   hdpaSubItems );
     if (nItem == -1) goto fail;
+    infoPtr->nItemCount++;
    
     if (!LISTVIEW_SetItemT(infoPtr, lpLVItem, isW))
     {
 	DPA_DeletePtr(infoPtr->hdpaItems, nItem);
+	infoPtr->nItemCount--;
 	goto fail;
     }
 
@@ -6105,7 +6088,7 @@
     INT i;
  
     if (nLast < nFirst || min(nFirst, nLast) < 0 || 
-	max(nFirst, nLast) >= GETITEMCOUNT(infoPtr))
+	max(nFirst, nLast) >= infoPtr->nItemCount)
 	return FALSE;
     
     for (i = nFirst; i <= nLast; i++)
@@ -6385,7 +6368,7 @@
       if (iCol == 0 || uView == LVS_LIST)
       {
         cx = 0;
-        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
         {
           nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, item_index);
           cx = (nLabelWidth>cx)?nLabelWidth:cx;
@@ -6400,7 +6383,7 @@
         lvItem.pszText = szDispText;
         lvItem.cchTextMax = DISP_TEXT_SIZE;
         cx = 0;
-        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
         {
           lvItem.iItem = item_index;
           if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) continue;
@@ -6463,7 +6446,7 @@
         lvItem.pszText = szDispText;
         lvItem.cchTextMax = DISP_TEXT_SIZE;
         cx = size.cx;
-        for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
+        for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
         {
           lvItem.iItem = item_index;
           if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) continue;
@@ -6621,7 +6604,7 @@
 	  infoPtr->ntmHeight);
 
     /* these depend on the iconSpacing */
-    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+    infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
     infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
 
     return oldspacing;
@@ -6723,7 +6706,7 @@
 
       LISTVIEW_RemoveAllSelections(infoPtr);
 
-      precount = infoPtr->hdpaItems->nItemCount;
+      precount = infoPtr->nItemCount;
       topvisible = LISTVIEW_GetTopIndex(infoPtr) +
                    LISTVIEW_GetCountPerColumn(infoPtr) + 1;
 
@@ -6732,13 +6715,13 @@
           if (!DPA_SetPtr(infoPtr->hdpaItems, nItems - 1, NULL))
               return FALSE;
 
-      infoPtr->nItemWidth = max(LISTVIEW_GetItemWidth(infoPtr),
+      infoPtr->nItemWidth = max(LISTVIEW_CalculateMaxWidth(infoPtr),
                                 DEFAULT_COLUMN_WIDTH);
 
       LISTVIEW_UpdateSize(infoPtr);
       LISTVIEW_UpdateScroll(infoPtr);
 
-      if (min(precount,infoPtr->hdpaItems->nItemCount)<topvisible)
+      if (min(precount,infoPtr->nItemCount)<topvisible)
         LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
   }
   else
@@ -6783,7 +6766,7 @@
   if (lStyle & LVS_OWNERDATA)
     return FALSE;
 
-  if ((nItem >= 0) || (nItem < GETITEMCOUNT(infoPtr)))
+  if ((nItem >= 0) || (nItem < infoPtr->nItemCount))
   {
     if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
     {
@@ -6875,7 +6858,7 @@
     if (nItem == -1)
     {
     	/* apply to all items */
-    	for (lvItem.iItem = 0; lvItem.iItem < GETITEMCOUNT(infoPtr); lvItem.iItem++)
+    	for (lvItem.iItem = 0; lvItem.iItem < infoPtr->nItemCount; lvItem.iItem++)
 	    if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
     }
     else
@@ -6902,7 +6885,7 @@
 {
     LVITEMW lvItem;
 
-    if ((nItem < 0) && (nItem >= GETITEMCOUNT(infoPtr))) return FALSE;
+    if (nItem < 0 && nItem >= infoPtr->nItemCount) return FALSE;
     
     lvItem.iItem = nItem;
     lvItem.iSubItem = lpLVItem->iSubItem;
@@ -7043,7 +7026,7 @@
     if (!infoPtr->hdpaItems) return FALSE;
 
     /* if there are 0 or 1 items, there is no need to sort */
-    if (GETITEMCOUNT(infoPtr) < 2) return TRUE;
+    if (infoPtr->nItemCount < 2) return TRUE;
 
     if (infoPtr->nFocusedItem >= 0)
     {
@@ -7062,7 +7045,7 @@
      * selected instead)
      */
     selectionMarkItem=(infoPtr->nSelectionMark>=0)?DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nSelectionMark):NULL;
-    for (i=0; i < GETITEMCOUNT(infoPtr); i++)
+    for (i=0; i < infoPtr->nItemCount; i++)
     {
 	hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i);
 	lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
@@ -7109,7 +7092,7 @@
 
     TRACE("(nItem=%d)\n", nItem);
 
-    if ((nItem < 0) && (nItem >= GETITEMCOUNT(infoPtr))) return FALSE;
+    if (nItem < 0 && nItem >= infoPtr->nItemCount) return FALSE;
 
     /* rearrange with default alignment style */
     if ((lStyle & LVS_AUTOARRANGE) && ((uView == LVS_ICON) ||(uView == LVS_SMALLICON)))
@@ -7227,7 +7210,7 @@
   infoPtr->hdpaSelectionRanges = DPA_Create(10);
 
   /* initialize size of items */
-  infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+  infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
   infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
 
   /* initialize the hover time to -1(indicating the default system hover time) */
@@ -7565,7 +7548,7 @@
   switch (nVirtualKey)
   {
   case VK_RETURN:
-    if ((GETITEMCOUNT(infoPtr) > 0) && (infoPtr->nFocusedItem != -1))
+    if ((infoPtr->nItemCount > 0) && (infoPtr->nFocusedItem != -1))
     {
       notify_return(infoPtr);
       notify_itemactivate(infoPtr);
@@ -7573,13 +7556,13 @@
     break;
 
   case VK_HOME:
-    if (GETITEMCOUNT(infoPtr) > 0)
+    if (infoPtr->nItemCount > 0)
       nItem = 0;
     break;
 
   case VK_END:
-    if (GETITEMCOUNT(infoPtr) > 0)
-      nItem = GETITEMCOUNT(infoPtr) - 1;
+    if (infoPtr->nItemCount > 0)
+      nItem = infoPtr->nItemCount - 1;
     break;
 
   case VK_LEFT:
@@ -7613,7 +7596,7 @@
     else
       nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(infoPtr)
                                     * LISTVIEW_GetCountPerRow(infoPtr);
-    if(nItem >= GETITEMCOUNT(infoPtr)) nItem = GETITEMCOUNT(infoPtr) - 1;
+    if(nItem >= infoPtr->nItemCount) nItem = infoPtr->nItemCount - 1;
     break;
   }
 
@@ -7725,7 +7708,7 @@
 
   nItem = LISTVIEW_GetItemAtPt(infoPtr, pt);
   TRACE("nItem=%d\n", nItem);
-  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
+  if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
   {
     if (lStyle & LVS_SINGLESEL)
     {
@@ -7918,7 +7901,7 @@
     /* handle notification from header control */
     if (lpnmh->code == HDN_ENDTRACKW)
     {
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
     }
     else if(lpnmh->code ==  HDN_ITEMCLICKW || lpnmh->code ==  HDN_ITEMCLICKA)
@@ -7939,7 +7922,7 @@
        * update of the scroll bar here (Header.c works fine as it is,
        * no need to disturb it)
        */
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       LISTVIEW_UpdateScroll(infoPtr);
       LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
     }
@@ -8063,7 +8046,7 @@
     lvHitTestInfo.pt.y = pts.y;
     nItem = LISTVIEW_GetItemAtPt(infoPtr, lvHitTestInfo.pt);
   
-    if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
+    if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
     {
 	LISTVIEW_SetItemFocus(infoPtr,nItem);
 	if (!((wKey & MK_SHIFT) || (wKey & MK_CONTROL)) &&
@@ -8407,7 +8390,7 @@
       }
 
       /* Now update the full item width and height */
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
       if (lpss->styleNew & LVS_ALIGNLEFT)
         LISTVIEW_AlignLeft(infoPtr);
@@ -8429,21 +8412,21 @@
 
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
     }
     else if (uNewView == LVS_LIST)
     {
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
     }
     else
     {
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
       infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
       if (lpss->styleNew & LVS_ALIGNLEFT)
         LISTVIEW_AlignLeft(infoPtr);
@@ -8598,7 +8581,7 @@
     return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, TRUE);
 
   case LVM_GETITEMCOUNT:
-    return GETITEMCOUNT(infoPtr);
+    return infoPtr->nItemCount;
 
   case LVM_GETITEMPOSITION:
     return LISTVIEW_GetItemPosition(infoPtr, (INT)wParam, (LPPOINT)lParam);




More information about the wine-patches mailing list