Listview O1 (try 2)
Dimitrie O. Paun
dpaun at rogers.com
Fri Oct 11 00:10:08 CDT 2002
The other one got garbled, cursor must have been in the wrong place. :/
ChangeLog
Make use of the new GetItemMetrics in HitTest, to avoid code duplication.
--- dlls/comctl32/listview.c.O0 Fri Oct 11 00:29:51 2002
+++ dlls/comctl32/listview.c Fri Oct 11 00:52:05 2002
@@ -5478,8 +5478,11 @@
*/
static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem, BOOL select)
{
+ WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
- RECT rcBounds, rcIcon, rcLabel;
+ RECT rcBounds, rcState, rcIcon, rcLabel;
+ POINT Origin, Position, opt;
+ LVITEMW lvItem;
TRACE("(pt=%s, subitem=%d, select=%d)\n", debugpoint(&lpht->pt), subitem, select);
@@ -5500,9 +5503,11 @@
if (lpht->flags) return -1;
lpht->flags |= LVHT_NOWHERE;
+
+ if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
/* first deal with the large items */
- if (uView == LVS_ICON && (infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
+ if (uView == LVS_ICON && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
PtInRect (&infoPtr->rcFocus, lpht->pt))
{
lpht->iItem = infoPtr->nFocusedItem;
@@ -5530,10 +5535,8 @@
}
else
{
- POINT Origin, Position;
INT nPerCol = (uView == LVS_REPORT) ? infoPtr->nItemCount : LISTVIEW_GetCountPerColumn(infoPtr);
- if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
Position.x = lpht->pt.x - Origin.x;
Position.y = lpht->pt.y - Origin.y;
TRACE("Position=%s, nPerCol=%d, nItemHeight=%d, nColHeight=%d\n",
@@ -5550,45 +5553,29 @@
if (lpht->iItem == -1) return -1;
- if (!LISTVIEW_GetItemMeasures(infoPtr, lpht->iItem, 0, &rcBounds, &rcIcon, &rcLabel)) return -1;
+ lvItem.mask = LVIF_STATE | LVIF_TEXT;
+ if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
+ lvItem.stateMask = LVIS_STATEIMAGEMASK;
+ if (uView == LVS_ICON && infoPtr->bFocus) lvItem.stateMask |= LVIS_FOCUSED;
+ lvItem.iItem = lpht->iItem;
+ lvItem.iSubItem = 0;
+ lvItem.pszText = szDispText;
+ lvItem.cchTextMax = DISP_TEXT_SIZE;
+ if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
+
+ if (!LISTVIEW_GetItemMetrics(infoPtr, &lvItem, 0, &rcBounds, &rcState, &rcIcon, &rcLabel)) return -1;
+ if (!LISTVIEW_GetItemListOrigin(infoPtr, lpht->iItem, &Position)) return -1;
+ opt.x = lpht->pt.x - Position.x - Origin.x;
+ opt.y = lpht->pt.y - Position.y - Origin.y;
- if (!PtInRect(&rcBounds, lpht->pt)) return -1;
+ if (!PtInRect(&rcBounds, opt)) return -1;
- if (PtInRect(&rcIcon, lpht->pt))
+ if (PtInRect(&rcIcon, opt))
lpht->flags |= LVHT_ONITEMICON;
- else if (PtInRect(&rcLabel, lpht->pt))
+ else if (PtInRect(&rcLabel, opt))
lpht->flags |= LVHT_ONITEMLABEL;
- else if (infoPtr->himlState)
- {
- /* FIXME: move this to GetItemMeasures */
- LVITEMW lvItem;
-
- lvItem.mask = LVIF_STATE;
- lvItem.stateMask = LVIS_STATEIMAGEMASK;
- lvItem.iItem = lpht->iItem;
- lvItem.iSubItem = 0;
- if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
- {
- UINT uStateImage = (lvItem.state & LVIS_STATEIMAGEMASK) >> 12;
- RECT rcState;
-
- if (uView == LVS_ICON)
- {
- rcState.left = rcIcon.left - infoPtr->iconStateSize.cx + 10;
- rcState.top = rcIcon.top + infoPtr->iconSize.cy - infoPtr->iconStateSize.cy + 4;
- }
- else
- {
- rcState.left = rcIcon.left - infoPtr->iconStateSize.cx - IMAGE_PADDING;
- rcState.top = rcIcon.top;
- }
- rcState.right = rcState.left + infoPtr->iconStateSize.cx;
- rcState.bottom = rcState.top + infoPtr->iconStateSize.cy;
-
- if (uStateImage > 0 && PtInRect(&rcState, lpht->pt))
- lpht->flags |= LVHT_ONITEMSTATEICON;
- }
- }
+ else if (infoPtr->himlState && ((lvItem.state & LVIS_STATEIMAGEMASK) >> 12) && PtInRect(&rcState, opt))
+ lpht->flags |= LVHT_ONITEMSTATEICON;
if (lpht->flags & LVHT_ONITEM)
lpht->flags &= ~LVHT_NOWHERE;
@@ -5600,7 +5587,7 @@
{
rcBounds.left = rcBounds.right;
rcBounds.right += LISTVIEW_GetColumnWidth(infoPtr, j);
- if (PtInRect(&rcBounds, lpht->pt))
+ if (PtInRect(&rcBounds, opt))
{
lpht->iSubItem = j;
break;
More information about the wine-patches
mailing list