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