Make use of the new GetItemMetrics in HitTest, to avoid code

duplication.
This commit is contained in:
Dimitrie O. Paun 2002-10-11 17:58:11 +00:00 committed by Alexandre Julliard
parent f1f447931e
commit 01b5226508
1 changed files with 27 additions and 40 deletions

View File

@ -5478,8 +5478,11 @@ static LRESULT LISTVIEW_GetStringWidthT(LISTVIEW_INFO *infoPtr, LPCWSTR lpszText
*/
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 @@ static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BO
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 @@ static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BO
}
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 @@ static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BO
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 (!PtInRect(&rcBounds, lpht->pt)) 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, 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 @@ static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BO
{
rcBounds.left = rcBounds.right;
rcBounds.right += LISTVIEW_GetColumnWidth(infoPtr, j);
if (PtInRect(&rcBounds, lpht->pt))
if (PtInRect(&rcBounds, opt))
{
lpht->iSubItem = j;
break;