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