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