Listview W7

Dimitrie O. Paun dpaun at rogers.com
Wed Oct 23 11:01:34 CDT 2002


ChangeLog
  Reorganize the item size calculation (a bit simpler, and faster).

--- dlls/comctl32/listview.c.Wr	Wed Oct 23 11:01:56 2002
+++ dlls/comctl32/listview.c	Wed Oct 23 11:58:19 2002
@@ -2187,55 +2187,39 @@
 
 /***
  * DESCRIPTION:
- * Calculates the width of a specific item.
+ * Caclulates the desired item width.
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
- * [I] nItem : item to calculate width, or -1 for max of all
  *
  * RETURN:
- * Returns the width of an item width an item.
+ *  The desired item width.
  */
-static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr, INT nItem)
+static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr)
 {
     UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-    INT nItemWidth = 0, i;
+    INT nItemWidth;
 
-    if (uView == LVS_ICON) 
+    if (uView == LVS_ICON)
 	nItemWidth = infoPtr->iconSpacing.cx;
     else if (uView == LVS_REPORT)
     {
-	RECT rcHeaderItem;
-	
-	/* calculate width of header */
-	for (i = 0; i < infoPtr->hdpaColumns->nItemCount; i++)
-	{
-	    LISTVIEW_GetHeaderRect(infoPtr, i, &rcHeaderItem);
-	    nItemWidth += (rcHeaderItem.right - rcHeaderItem.left);
-	}
+	RECT rcHeader;
+
+	LISTVIEW_GetHeaderRect(infoPtr, infoPtr->hdpaColumns->nItemCount - 1, &rcHeader);
+        nItemWidth = rcHeader.right;	
     }
-    else
+    else /* LVS_SMALLICON, or LVS_LIST */
     {
-	INT nLabelWidth;
+	INT i;
 	
-	if (infoPtr->nItemCount == 0) return DEFAULT_COLUMN_WIDTH;
-    
-        /* get width of string */
-	if (nItem == -1) 
-	{
-	    for (i = 0; i < infoPtr->nItemCount; i++)
-	    {
-		nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, i);
-		nItemWidth = max(nItemWidth, nLabelWidth);
-	    }
-	}
-	else
-            nItemWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
-        if (!nItemWidth)  return DEFAULT_COLUMN_WIDTH;
-        nItemWidth += WIDTH_PADDING;
-        if (infoPtr->himlSmall) nItemWidth += infoPtr->iconSize.cx; 
-        if (infoPtr->himlState) nItemWidth += infoPtr->iconStateSize.cx;
-	if (nItem == -1) nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth);
+	for (nItemWidth = i = 0; i < infoPtr->nItemCount; i++)
+	    nItemWidth = max(LISTVIEW_GetLabelWidth(infoPtr, i), nItemWidth);
+
+        if (infoPtr->himlSmall) nItemWidth += infoPtr->iconSize.cx + IMAGE_PADDING; 
+        if (infoPtr->himlState) nItemWidth += infoPtr->iconStateSize.cx + IMAGE_PADDING;
+
+	nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
     }
 
     return max(nItemWidth, 1);
@@ -2243,21 +2227,54 @@
 
 /***
  * DESCRIPTION:
- * Calculates the max width of any item in the list.
+ * Caclulates the desired item height.
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
  *
  * RETURN:
- * Returns item width.
+ *  The desired item height.
  */
-static inline INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *infoPtr)
+static INT LISTVIEW_CalculateItemHeight(LISTVIEW_INFO *infoPtr)
 {
-    return LISTVIEW_CalculateItemWidth(infoPtr, -1);
+    UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
+    INT nItemHeight;
+
+    if (uView == LVS_ICON)
+	nItemHeight = infoPtr->iconSpacing.cy;
+    else
+    {
+	nItemHeight = infoPtr->ntmHeight; 
+	if (infoPtr->himlState)
+	    nItemHeight = max(nItemHeight, infoPtr->iconStateSize.cy);
+	if (infoPtr->himlSmall)
+	    nItemHeight = max(nItemHeight, infoPtr->iconSize.cy);
+	if (infoPtr->himlState || infoPtr->himlSmall)
+	    nItemHeight += HEIGHT_PADDING;
+    }
+
+    return max(nItemHeight, 1);
 }
 
 /***
  * DESCRIPTION:
+ * Updates the width, and height of an item.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ *
+ * RETURN:
+ *  None.
+ */
+static inline void LISTVIEW_UpdateItemSize(LISTVIEW_INFO *infoPtr)
+{
+    infoPtr->nItemWidth = LISTVIEW_CalculateItemWidth(infoPtr);
+    infoPtr->nItemHeight = LISTVIEW_CalculateItemHeight(infoPtr);
+}
+
+
+/***
+ * DESCRIPTION:
  * Retrieves and saves important text metrics info for the current
  * Listview font.
  *
@@ -2280,36 +2297,6 @@
     TRACE("tmHeight=%d\n", infoPtr->ntmHeight);
 }
 
-
-/***
- * DESCRIPTION:
- * Calculates the height of an item.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * Returns item height.
- */
-static INT LISTVIEW_CalculateMaxHeight(LISTVIEW_INFO *infoPtr)
-{
-    INT nItemHeight;
-
-    if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_ICON)
-	nItemHeight = infoPtr->iconSpacing.cy;
-    else
-    {
-	nItemHeight = infoPtr->ntmHeight; 
-	if (infoPtr->himlState)
-	    nItemHeight = max(nItemHeight, infoPtr->iconStateSize.cy);
-	if (infoPtr->himlSmall)
-	    nItemHeight = max(nItemHeight, infoPtr->iconSize.cy);
-	if (infoPtr->himlState || infoPtr->himlSmall)
-	    nItemHeight += HEIGHT_PADDING;
-    }
-    return nItemHeight;
-}
-
 /***
  * DESCRIPTION:
  * A compare function for ranges
@@ -6413,8 +6400,7 @@
 	  infoPtr->ntmHeight);
 
     /* these depend on the iconSpacing */
-    infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
-    infoPtr->nItemHeight = LISTVIEW_CalculateMaxHeight(infoPtr);
+    LISTVIEW_UpdateItemSize(infoPtr);
 
     return oldspacing;
 }
@@ -6481,7 +6467,7 @@
 	return NULL;
     }
 
-    infoPtr->nItemHeight = LISTVIEW_CalculateMaxHeight(infoPtr);
+    infoPtr->nItemHeight = LISTVIEW_CalculateItemHeight(infoPtr);
     if (infoPtr->nItemHeight != oldHeight)
         LISTVIEW_UpdateScroll(infoPtr);
 
@@ -6523,8 +6509,7 @@
                    LISTVIEW_GetCountPerColumn(infoPtr) + 1;
 
       infoPtr->nItemCount = nItems;
-      infoPtr->nItemWidth = max(LISTVIEW_CalculateMaxWidth(infoPtr),
-                                DEFAULT_COLUMN_WIDTH);
+      LISTVIEW_UpdateItemSize(infoPtr);
 
       LISTVIEW_UpdateSize(infoPtr);
       LISTVIEW_UpdateScroll(infoPtr);
@@ -6972,8 +6957,7 @@
   infoPtr->hdpaPosY  = DPA_Create(10);
 
   /* initialize size of items */
-  infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
-  infoPtr->nItemHeight = LISTVIEW_CalculateMaxHeight(infoPtr);
+  LISTVIEW_UpdateItemSize(infoPtr);
 
   /* initialize the hover time to -1(indicating the default system hover time) */
   infoPtr->dwHoverTime = -1;
@@ -8137,8 +8121,7 @@
             SetWindowPos(infoPtr->hwndHeader, infoPtr->hwndSelf, wp.x, wp.y, wp.cx, wp.cy, wp.flags);
         }
 
-        infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
-        infoPtr->nItemHeight = LISTVIEW_CalculateMaxHeight(infoPtr);
+	LISTVIEW_UpdateItemSize(infoPtr);
     }
 
     if (uNewView == LVS_REPORT)




More information about the wine-patches mailing list