Listview notifications (H0)

Dimitrie O. Paun dpaun at rogers.com
Thu Oct 3 17:08:14 CDT 2002


ChangeLog
  -- Fix nasty bug in REPORT mode, when calculating the label rect
  -- Lots of cleanups, and simplifications

Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.163
diff -u -r1.163 listview.c
--- dlls/comctl32/listview.c	2 Oct 2002 23:53:04 -0000	1.163
+++ dlls/comctl32/listview.c	3 Oct 2002 21:55:47 -0000
@@ -76,13 +76,6 @@
 
 /* Some definitions for inline edit control */
 
-typedef struct tagLV_INTHIT
-{
-  LVHITTESTINFO  ht;
-  DWORD          distance;     /* distance to closest item    */
-  INT            iDistItem;    /* item number that is closest */
-} LV_INTHIT, *LPLV_INTHIT;
-
 typedef struct tagCOLUMNCACHE
 {
   RECT rc;
@@ -269,8 +262,7 @@
  * forward declarations
  */
 static BOOL LISTVIEW_GetItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL, BOOL);
-static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *, LPLV_INTHIT, BOOL);
-static INT LISTVIEW_HitTestItem(LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL);
+static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL);
 static void LISTVIEW_AlignLeft(LISTVIEW_INFO *);
 static void LISTVIEW_AlignTop(LISTVIEW_INFO *);
 static void LISTVIEW_AddGroupSelection(LISTVIEW_INFO *, INT);
@@ -550,24 +542,17 @@
     return notify(infoPtr, code, (LPNMHDR)plvnm);
 }
 
-static int tabNotification[] = {
-    LVN_BEGINLABELEDITW, LVN_BEGINLABELEDITA,
-    LVN_ENDLABELEDITW, LVN_ENDLABELEDITA,
-    LVN_GETDISPINFOW, LVN_GETDISPINFOA,
-    LVN_SETDISPINFOW, LVN_SETDISPINFOA,
-    LVN_ODFINDITEMW, LVN_ODFINDITEMA,
-    LVN_GETINFOTIPW, LVN_GETINFOTIPA,
-    0
-};
-
 static int get_ansi_notification(INT unicodeNotificationCode)
 {
-    int *pTabNotif;
-    
-    for(pTabNotif = tabNotification; *pTabNotif; pTabNotif += 2)
-	if (*pTabNotif == unicodeNotificationCode) 
-	    return *(pTabNotif + 1);
-    
+    switch (unicodeNotificationCode)
+    {
+    case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+    case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+    case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+    case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
+    case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+    case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
+    }
     ERR("unknown notification %x\n", unicodeNotificationCode);
     return unicodeNotificationCode;
 }
@@ -1250,23 +1235,13 @@
 {
     LONG lStyle = infoPtr->dwStyle;
     UINT uView = lStyle & LVS_TYPEMASK;
-    HDPA hdpaSubItems;
-    LISTVIEW_ITEM *lpItem;
     POINT Origin, Position, TopLeft;
     RECT Icon, Boundary, Label;
     INT nIndent = 0;
 
-    /************************************************************/
-    /* do some basic checks on the item for correctness         */
-    /************************************************************/
-    if (!(hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem)))
-	return FALSE;
-    if (!(lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0)))
-	return FALSE;
-
     if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return FALSE;
 
-    if (uView & LVS_REPORT)
+    if (uView == LVS_REPORT)
     {
 	LVITEMW lvItem;
 
@@ -1284,6 +1259,10 @@
     /************************************************************/
     if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     {
+	/* FIXME: what about virtual listview? */
+	HDPA hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
+	LISTVIEW_ITEM * lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
+	if (!lpItem) return FALSE;
 	TopLeft = lpItem->ptPosition;
     }
     else if (uView == LVS_LIST)
@@ -1458,7 +1437,7 @@
 	    infoPtr->hwndSelf, nItem,
 	    Label.left, Label.top, Label.right, Label.bottom);
   }
-  else
+  else /* LVS_LIST or LVS_REPORT */
   {
 	INT nLabelWidth;
 
@@ -1469,7 +1448,7 @@
             if (infoPtr->himlSmall) nLabelWidth += IMAGE_PADDING;
         }
         else
-            nLabelWidth = LISTVIEW_GetColumnWidth(infoPtr, 0) - Label.left;
+            nLabelWidth = LISTVIEW_GetColumnWidth(infoPtr, 0) - Icon.left;
 	
 	Label.left = Icon.right;
         Label.top = Position.y;
@@ -1482,6 +1461,8 @@
         if (lprcText) *lprcText = Label;
   }
   
+  TRACE("hwnd=%x, item=%d, label=%s\n", infoPtr->hwndSelf, nItem, debugrect(&Label));
+  
     /***********************************************************/
     /* compute boundary box for the item (ala LVM_GETITEMRECT) */
     /***********************************************************/
@@ -2399,7 +2380,10 @@
     {
 	rcItem.left = LVIR_SELECTBOUNDS;
 	if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
+	{
+	    TRACE("i=%d, rcItem=%s\n", i, debugrect(&rcItem));
 	    if (PtInRect(&rcItem, pt)) return i;
+	}
     }
     return -1;
 }
@@ -2424,11 +2408,9 @@
  */
 static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKyes, POINTS pts)
 {
-    POINT pt = { pts.x, pts.y };
-
     if(infoPtr->dwLvExStyle & LVS_EX_TRACKSELECT)
 	/* FIXME: select the item!!! */
-	LISTVIEW_GetItemAtPt(infoPtr, pt);
+	/*LISTVIEW_GetItemAtPt(infoPtr, pt)*/;
 
     return 0;
 }
@@ -4418,8 +4400,7 @@
  */
 static INT LISTVIEW_GetNearestItem(LISTVIEW_INFO *infoPtr, POINT pt, UINT vkDirection)
 {
-    LV_INTHIT lvIntHit;
-    INT nItem;
+    LVHITTESTINFO ht;
     RECT rcView;
 
     TRACE("point %ld,%ld, direction %s\n", pt.x, pt.y,
@@ -4429,24 +4410,19 @@
 
     if (!LISTVIEW_GetViewRect(infoPtr, &rcView)) return -1;
     
-    if (!LISTVIEW_GetOrigin(infoPtr, &lvIntHit.ht.pt)) return -1;
+    if (!LISTVIEW_GetOrigin(infoPtr, &ht.pt)) return -1;
     
-    lvIntHit.ht.pt.x += pt.x;
-    lvIntHit.ht.pt.y += pt.y;
+    ht.pt.x += pt.x;
+    ht.pt.y += pt.y;
 
-    if (vkDirection == VK_DOWN)
-        lvIntHit.ht.pt.y += infoPtr->nItemHeight;
-    else if (vkDirection == VK_UP)
-        lvIntHit.ht.pt.y -= infoPtr->nItemHeight;
-    else if (vkDirection == VK_LEFT)
-        lvIntHit.ht.pt.x -= infoPtr->nItemWidth;
-    else if (vkDirection == VK_RIGHT)
-        lvIntHit.ht.pt.x += infoPtr->nItemWidth;
+    if (vkDirection == VK_DOWN)       ht.pt.y += infoPtr->nItemHeight;
+    else if (vkDirection == VK_UP)    ht.pt.y -= infoPtr->nItemHeight;
+    else if (vkDirection == VK_LEFT)  ht.pt.x -= infoPtr->nItemWidth;
+    else if (vkDirection == VK_RIGHT) ht.pt.x += infoPtr->nItemWidth;
 
-    if (!PtInRect(&rcView, lvIntHit.ht.pt)) return -1;
+    if (!PtInRect(&rcView, ht.pt)) return -1;
     
-    nItem = LISTVIEW_SuperHitTestItem(infoPtr, &lvIntHit, TRUE);
-    return nItem == -1 ? lvIntHit.iDistItem : nItem;
+    return LISTVIEW_SuperHitTestItem(infoPtr, &ht, TRUE, TRUE);
 }
 
 /***
@@ -4727,6 +4703,8 @@
     INT nColumnWidth = 0;
     HDITEMW hdi;
 
+    TRACE("nColumn=%d\n", nColumn);
+
     switch(LISTVIEW_GetType(infoPtr))
     {
     case LVS_LIST:
@@ -4734,13 +4712,14 @@
 	break;
     case LVS_REPORT:
 	hdi.mask = HDI_WIDTH;
-	if (Header_GetItemW(infoPtr->hwndHeader, nColumn, &hdi)) 
+	if (Header_GetItemW(infoPtr->hwndHeader, nColumn, &hdi))
 	    nColumnWidth = hdi.cxy;
 	break;
     default:
 	/* we don't have a 'column' in [SMALL]ICON mode */
     }
 
+    TRACE("nColumnWidth=%d\n", nColumnWidth);
     return nColumnWidth;
 }
 
@@ -4788,7 +4767,7 @@
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
- * [I] INT : image list identifier
+ * [I] nImageList : image list identifier
  *
  * RETURN:
  *   SUCCESS : image list handle
@@ -5325,21 +5304,20 @@
  */
 static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
-  INT nLabelWidth = 0;
-  LVITEMW lvItem;
-
-  TRACE("(nItem=%d)\n", nItem);
+    WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
+    LVITEMW lvItem;
 
-  lvItem.mask = LVIF_TEXT;
-  lvItem.iItem = nItem;
-  lvItem.iSubItem = 0;
-  lvItem.cchTextMax = DISP_TEXT_SIZE;
-  lvItem.pszText = szDispText;
-  if (LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE))
-    nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
+    TRACE("(nItem=%d)\n", nItem);
 
-  return nLabelWidth;
+    lvItem.mask = LVIF_TEXT;
+    lvItem.iItem = nItem;
+    lvItem.iSubItem = 0;
+    lvItem.cchTextMax = DISP_TEXT_SIZE;
+    lvItem.pszText = szDispText;
+    if (!LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE)) return 0;
+  
+    /* FIXME: is this right? What if the label is very long? */ 
+    return LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
 }
 
 /***
@@ -5377,28 +5355,25 @@
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
- * [I] INT : item index
- * [I] UINT : state mask
+ * [I] nItem : item index
+ * [I] uMask : state mask
  *
  * RETURN:
  * State specified by the mask.
  */
 static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *infoPtr, INT nItem, UINT uMask)
 {
-  LVITEMW lvItem;
-  UINT uState = 0;
+    LVITEMW lvItem;
+
+    if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr))) return 0;
 
-  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
-  {
     lvItem.iItem = nItem;
     lvItem.iSubItem = 0;
     lvItem.mask = LVIF_STATE;
     lvItem.stateMask = uMask;
-    if (LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE))
-      uState = lvItem.state & uMask;
-  }
+    if (!LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE)) return 0;
 
-  return uState;
+    return lvItem.state & uMask;
 }
 
 /***
@@ -5685,35 +5660,6 @@
     return stringSize.cx;
 }
 
-/***
- * DESCRIPTION:
- * Retrieves the text backgound color.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * COLORREF associated with the the background.
- */
-static LRESULT LISTVIEW_GetTextBkColor(LISTVIEW_INFO *infoPtr)
-{
-  return infoPtr->clrTextBk;
-}
-
-/***
- * DESCRIPTION:
- * Retrieves the text color.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * COLORREF associated with the text.
- */
-static LRESULT LISTVIEW_GetTextColor(LISTVIEW_INFO *infoPtr)
-{
-  return infoPtr->clrText;
-}
 
 /***
  * DESCRIPTION:
@@ -5721,23 +5667,27 @@
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
- * [IO] LPLV_INTHIT : hit test information
+ * [IO] lpht : hit test information
  * [I] subitem : fill out iSubItem.
+ * [I] bNearItem : return the nearest item
  *
  * RETURN:
  *   SUCCESS : item index of hit
  *   FAILURE : -1
  */
-static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *infoPtr, LPLV_INTHIT lpInt, BOOL subitem)
+static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem, BOOL bNearItem)
 {
   LONG lStyle = infoPtr->dwStyle;
   UINT uView = lStyle & LVS_TYPEMASK;
-  INT i,j,topindex,bottomindex;
+  INT i,j,topindex,bottomindex,nearestItem;
   RECT rcItem,rcSubItem;
-  DWORD xterm, yterm, dist;
+  DWORD xterm, yterm, dist, mindist;
 
-  TRACE("(x=%ld, y=%ld)\n", lpInt->ht.pt.x, lpInt->ht.pt.y);
+  TRACE("(x=%ld, y=%ld)\n", lpht->pt.x, lpht->pt.y);
 
+  nearestItem = -1;
+  mindist = -1;
+  
   /* FIXME: get the visible range */
   topindex = LISTVIEW_GetTopIndex(infoPtr);
   if (uView == LVS_REPORT)
@@ -5750,24 +5700,21 @@
     bottomindex = GETITEMCOUNT(infoPtr);
   }
 
-  lpInt->distance = 0x7fffffff;
-  lpInt->iDistItem = -1;
-
   for (i = topindex; i < bottomindex; i++)
   {
     rcItem.left = LVIR_BOUNDS;
     if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
     {
-      if (PtInRect(&rcItem, lpInt->ht.pt))
+      if (PtInRect(&rcItem, lpht->pt))
       {
         rcSubItem = rcItem;
         rcItem.left = LVIR_ICON;
         if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
         {
-          if (PtInRect(&rcItem, lpInt->ht.pt))
+          if (PtInRect(&rcItem, lpht->pt))
           {
-            lpInt->ht.flags = LVHT_ONITEMICON;
-            lpInt->ht.iItem = i;
+            lpht->flags = LVHT_ONITEMICON;
+            lpht->iItem = i;
             goto set_subitem;
           }
         }
@@ -5775,29 +5722,29 @@
         rcItem.left = LVIR_LABEL;
         if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
         {
-          if (PtInRect(&rcItem, lpInt->ht.pt))
+          if (PtInRect(&rcItem, lpht->pt))
           {
-            lpInt->ht.flags = LVHT_ONITEMLABEL;
-            lpInt->ht.iItem = i;
+            lpht->flags = LVHT_ONITEMLABEL;
+            lpht->iItem = i;
             goto set_subitem;
           }
         }
 
-        lpInt->ht.flags = LVHT_ONITEMSTATEICON;
-        lpInt->ht.iItem = i;
+        lpht->flags = LVHT_ONITEMSTATEICON;
+        lpht->iItem = i;
        set_subitem:
         if (subitem)
         {
 	  INT nColumnCount = Header_GetItemCount(infoPtr->hwndHeader);
-          lpInt->ht.iSubItem = 0;
+          lpht->iSubItem = 0;
           rcSubItem.right = rcSubItem.left;
           for (j = 0; j < nColumnCount; j++)
           {
             rcSubItem.left = rcSubItem.right;
             rcSubItem.right += LISTVIEW_GetColumnWidth(infoPtr, j);
-            if (PtInRect(&rcSubItem, lpInt->ht.pt))
+            if (PtInRect(&rcSubItem, lpht->pt))
             {
-              lpInt->ht.iSubItem = j;
+              lpht->iSubItem = j;
               break;
             }
           }
@@ -5805,57 +5752,30 @@
 	TRACE("hit on item %d\n", i);
         return i;
       }
-      else
+      else if (bNearItem)
       {
         /*
          * Now compute distance from point to center of boundary
          * box. Since we are only interested in the relative
          * distance, we can skip the nasty square root operation
          */
-        xterm = rcItem.left + (rcItem.right - rcItem.left)/2 - lpInt->ht.pt.x;
-        yterm = rcItem.top + (rcItem.bottom - rcItem.top)/2 - lpInt->ht.pt.y;
+        xterm = rcItem.left + (rcItem.right - rcItem.left)/2 - lpht->pt.x;
+        yterm = rcItem.top + (rcItem.bottom - rcItem.top)/2 - lpht->pt.y;
         dist = xterm * xterm + yterm * yterm;
-        if (dist < lpInt->distance)
-        {
-          lpInt->distance = dist;
-          lpInt->iDistItem = i;
-        }
+	if (mindist < 0 || dist < mindist)
+	{
+	    mindist = dist;
+	    nearestItem = i;
+	}
       }
     }
   }
 
-  lpInt->ht.flags = LVHT_NOWHERE;
-  TRACE("no hit, closest item %d, distance %ld\n", lpInt->iDistItem, lpInt->distance);
+  lpht->flags = LVHT_NOWHERE;
 
-  return -1;
+  return bNearItem ? nearestItem : -1;
 }
 
- /***
-  * DESCRIPTION:
-  * Determines which section of the item was selected (if any).
-  *
-  * PARAMETER(S):
-  * [I] infoPtr : valid pointer to the listview structure
-  * [IO] LPLVHITTESTINFO : hit test information
-  * [I] subitem : fill out iSubItem.
-  *
-  * RETURN:
-  *   SUCCESS : item index
-  *   FAILURE : -1
-  */
-static INT LISTVIEW_HitTestItem(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo, BOOL subitem)
-{
-  INT ret;
-  LV_INTHIT lv_inthit;
-
-  TRACE("(x=%ld, y=%ld)\n", lpHitTestInfo->pt.x,
-        lpHitTestInfo->pt.y);
-
-  memcpy(&lv_inthit, lpHitTestInfo, sizeof(LVHITTESTINFO));
-  ret = LISTVIEW_SuperHitTestItem(infoPtr, &lv_inthit, subitem);
-  memcpy(lpHitTestInfo, &lv_inthit, sizeof(LVHITTESTINFO));
-  return ret;
-}
 
 /***
  * DESCRIPTION:
@@ -5863,67 +5783,38 @@
  *
  * PARAMETER(S):
  * [I] infoPtr : valid pointer to the listview structure
- * [IO} LPLVHITTESTINFO : hit test information
+ * [IO] lpht : hit test information
+ * [I] subitem : fill out iSubItem.
  *
  * RETURN:
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo)
+static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem)
 {
-    lpHitTestInfo->flags = 0;
+    TRACE("(x=%ld, y=%ld)\n", lpht->pt.x, lpht->pt.y);
+    
+    lpht->flags = 0;
 
-    if (infoPtr->rcList.left > lpHitTestInfo->pt.x)
-	lpHitTestInfo->flags = LVHT_TOLEFT;
-    else if (infoPtr->rcList.right < lpHitTestInfo->pt.x)
-	lpHitTestInfo->flags = LVHT_TORIGHT;
+    if (infoPtr->rcList.left > lpht->pt.x)
+	lpht->flags |= LVHT_TOLEFT;
+    else if (infoPtr->rcList.right < lpht->pt.x)
+	lpht->flags |= LVHT_TORIGHT;
     
-    if (infoPtr->rcList.top > lpHitTestInfo->pt.y)
-	lpHitTestInfo->flags |= LVHT_ABOVE;
-    else if (infoPtr->rcList.bottom < lpHitTestInfo->pt.y)
-	lpHitTestInfo->flags |= LVHT_BELOW;
+    if (infoPtr->rcList.top > lpht->pt.y)
+	lpht->flags |= LVHT_ABOVE;
+    else if (infoPtr->rcList.bottom < lpht->pt.y)
+	lpht->flags |= LVHT_BELOW;
 
-    if (lpHitTestInfo->flags) return -1;
+    if (lpht->flags) return -1;
     
     /* NOTE (mm 20001022): We must not allow iSubItem to be touched, for
      * an app might pass only a structure with space up to iItem!
      * (MS Office 97 does that for instance in the file open dialog)
      */
-    return LISTVIEW_HitTestItem(infoPtr, lpHitTestInfo, FALSE);
+    return LISTVIEW_SuperHitTestItem(infoPtr, lpht, subitem, FALSE);
 }
 
-/***
- * DESCRIPTION:
- * Determines which listview subitem is located at the specified position.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- * [IO} LPLVHITTESTINFO : hit test information
- *
- * RETURN:
- *   SUCCESS : item index
- *   FAILURE : -1
- */
-static LRESULT LISTVIEW_SubItemHitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo)
-{
-  INT nItem = -1;
-
-  lpHitTestInfo->flags = 0;
-
-  if (infoPtr->rcList.left > lpHitTestInfo->pt.x)
-    lpHitTestInfo->flags = LVHT_TOLEFT;
-  else if (infoPtr->rcList.right < lpHitTestInfo->pt.x)
-    lpHitTestInfo->flags = LVHT_TORIGHT;
-  if (infoPtr->rcList.top > lpHitTestInfo->pt.y)
-    lpHitTestInfo->flags |= LVHT_ABOVE;
-  else if (infoPtr->rcList.bottom < lpHitTestInfo->pt.y)
-    lpHitTestInfo->flags |= LVHT_BELOW;
-
-  if (lpHitTestInfo->flags == 0)
-    nItem = LISTVIEW_HitTestItem(infoPtr, lpHitTestInfo, TRUE);
-
-  return nItem;
-}
 
 /***
  * DESCRIPTION:
@@ -7249,8 +7140,6 @@
     return TRUE;
 }
 
-/* LISTVIEW_SubItemHitTest */
-
 /***
  * DESCRIPTION:
  * Updates an items or rearranges the listview control.
@@ -7831,36 +7720,27 @@
  */
 static LRESULT LISTVIEW_LButtonDblClk(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  LVHITTESTINFO htInfo;
-  NMLISTVIEW nmlv;
+    LVHITTESTINFO htInfo;
+    NMLISTVIEW nmlv;
 
-  TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
+    TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
 
-  htInfo.pt.x = pts.x;
-  htInfo.pt.y = pts.y;
+    htInfo.pt.x = pts.x;
+    htInfo.pt.y = pts.y;
 
-  /* send NM_DBLCLK notification */
-  ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
-  if (LISTVIEW_HitTestItem(infoPtr, &htInfo, TRUE) != -1)
-  {
+    /* send NM_DBLCLK notification */
+    ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
+    LISTVIEW_HitTest(infoPtr, &htInfo, TRUE);
     nmlv.iItem = htInfo.iItem;
     nmlv.iSubItem = htInfo.iSubItem;
-  }
-  else
-  {
-    nmlv.iItem = -1;
-    nmlv.iSubItem = 0;
-  }
-  nmlv.ptAction.x = pts.x;
-  nmlv.ptAction.y = pts.y;
-  notify_listview(infoPtr, NM_DBLCLK, &nmlv);
-
+    nmlv.ptAction = htInfo.pt;
+    notify_listview(infoPtr, NM_DBLCLK, &nmlv);
 
-  /* To send the LVN_ITEMACTIVATE, it must be on an Item */
-  if(nmlv.iItem != -1)
-    notify_itemactivate(infoPtr);
+    /* To send the LVN_ITEMACTIVATE, it must be on an Item */
+    if(nmlv.iItem != -1)
+        notify_itemactivate(infoPtr);
 
-  return 0;
+    return 0;
 }
 
 /***
@@ -7884,6 +7764,8 @@
 
   TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
 
+  /* FIXME: NM_CLICK */
+  
   /* send NM_RELEASEDCAPTURE notification */
   notify_releasedcapture(infoPtr);
 
@@ -7987,7 +7869,7 @@
 
   /* send NM_CLICK notification */
     ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
-    if (LISTVIEW_HitTestItem(infoPtr, &lvHitTestInfo, TRUE) != -1)
+    if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE) != -1)
     {
         nmlv.iItem = lvHitTestInfo.iItem;
         nmlv.iSubItem = lvHitTestInfo.iSubItem;
@@ -8214,56 +8096,50 @@
  */
 static LRESULT LISTVIEW_RButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  INT nItem;
-  NMLISTVIEW nmlv;
-  LVHITTESTINFO lvHitTestInfo;
-  POINT pt = { pts.x, pts.y };
+    LVHITTESTINFO lvHitTestInfo;
+    NMLISTVIEW nmlv;
+    INT nItem;
 
-  TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, pts.x, pts.y);
+    TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, pts.x, pts.y);
 
-  /* send NM_RELEASEDCAPTURE notification */
-  notify_releasedcapture(infoPtr);
+    /* FIXME: NM_CLICK */
+  
+    /* send NM_RELEASEDCAPTURE notification */
+    notify_releasedcapture(infoPtr);
 
-  /* make sure the listview control window has the focus */
-  if (!infoPtr->bFocus) SetFocus(infoPtr->hwndSelf);
+    /* make sure the listview control window has the focus */
+    if (!infoPtr->bFocus) SetFocus(infoPtr->hwndSelf);
 
-  /* set right button down flag */
-  infoPtr->bRButtonDown = TRUE;
+    /* set right button down flag */
+    infoPtr->bRButtonDown = TRUE;
 
-  /* determine the index of the selected item */
-  nItem = LISTVIEW_GetItemAtPt(infoPtr, pt);
-  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
-  {
-    LISTVIEW_SetItemFocus(infoPtr,nItem);
-    if (!((wKey & MK_SHIFT) || (wKey & MK_CONTROL)) &&
-        !LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED))
-      LISTVIEW_SetSelection(infoPtr, nItem);
-  }
-  else
-  {
-    LISTVIEW_RemoveAllSelections(infoPtr);
-  }
+    /* determine the index of the selected item */
+    lvHitTestInfo.pt.x = pts.x;
+    lvHitTestInfo.pt.y = pts.y;
+    nItem = LISTVIEW_GetItemAtPt(infoPtr, lvHitTestInfo.pt);
+  
+    if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
+    {
+	LISTVIEW_SetItemFocus(infoPtr,nItem);
+	if (!((wKey & MK_SHIFT) || (wKey & MK_CONTROL)) &&
+            !LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED))
+	    LISTVIEW_SetSelection(infoPtr, nItem);
+    }
+    else
+    {
+	LISTVIEW_RemoveAllSelections(infoPtr);
+    }
 
-  lvHitTestInfo.pt.x = pts.x;
-  lvHitTestInfo.pt.y = pts.y;
 
-  /* Send NM_RClICK notification */
-  ZeroMemory(&nmlv, sizeof(nmlv));
-  if (LISTVIEW_HitTestItem(infoPtr, &lvHitTestInfo, TRUE) != -1)
-  {
+    /* Send NM_RClICK notification */
+    ZeroMemory(&nmlv, sizeof(nmlv));
+    LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE);
     nmlv.iItem = lvHitTestInfo.iItem;
     nmlv.iSubItem = lvHitTestInfo.iSubItem;
-  }
-  else
-  {
-    nmlv.iItem = -1;
-    nmlv.iSubItem = 0;
-  }
-  nmlv.ptAction.x = pts.x;
-  nmlv.ptAction.y = pts.y;
-  notify_listview(infoPtr, NM_RCLICK, &nmlv);
+    nmlv.ptAction = lvHitTestInfo.pt;
+    notify_listview(infoPtr, NM_RCLICK, &nmlv);
 
-  return 0;
+    return 0;
 }
 
 /***
@@ -8321,7 +8197,7 @@
     if(!(infoPtr->dwLvExStyle & LVS_EX_TRACKSELECT)) return FALSE;
 
     if(!infoPtr->hHotCursor)  return FALSE;
-  
+
     GetCursorPos(&pt);
     if (LISTVIEW_GetItemAtPt(infoPtr, pt) < 0) return FALSE;
 
@@ -8536,6 +8412,8 @@
   TRACE("(styletype=%x, styleOld=0x%08lx, styleNew=0x%08lx)\n",
         wStyleType, lpss->styleOld, lpss->styleNew);
 
+  /* FIXME: if LVS_NOSORTHEADER changed, update header */
+
   if (wStyleType == GWL_STYLE)
   {
     infoPtr->dwStyle = lpss->styleNew;
@@ -8823,10 +8701,10 @@
                                    ((LPRECT)lParam)->left, (LPRECT)lParam);
 
   case LVM_GETTEXTBKCOLOR:
-    return LISTVIEW_GetTextBkColor(infoPtr);
+    return infoPtr->clrTextBk;
 
   case LVM_GETTEXTCOLOR:
-    return LISTVIEW_GetTextColor(infoPtr);
+    return infoPtr->clrText;
 
   /* case LVN_GETTILEINFO: */
 
@@ -8853,7 +8731,7 @@
   /* case LVN_HASGROUP: */
 
   case LVM_HITTEST:
-    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam);
+    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE);
 
   case LVM_INSERTCOLUMNA:
     return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
@@ -9001,7 +8879,7 @@
     return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam);
 
   case LVM_SUBITEMHITTEST:
-    return LISTVIEW_SubItemHitTest(infoPtr, (LPLVHITTESTINFO)lParam);
+    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, TRUE);
 
   case LVM_UPDATE:
     return LISTVIEW_Update(infoPtr, (INT)wParam);




More information about the wine-patches mailing list