From fe941591fef2ce73e37b89f7b7e735c687670c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 17 Feb 2004 22:33:55 +0000 Subject: [PATCH] Sync with Wine-20040213: Aric Stewart Work toward properly updating the SelectionMark when the selected state changed inside a listbox. svn path=/trunk/; revision=8231 --- reactos/lib/comctl32/listview.c | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index cf151d8f8a4..8c43634ede9 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -7043,6 +7043,40 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE else bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE); + /* + *update selection mark + * + * Investigation on windows 2k showed that selection mark was updated + * whenever a new selection was made, but if the selected item was + * unselected it was not updated. + * + * we are probably still not 100% accurate, but this at least sets the + * proper selection mark when it is needed + */ + + if (bResult && (lvItem.state & lvItem.stateMask & LVIS_SELECTED) && + ((infoPtr->nSelectionMark == -1) || (lvItem.iItem <= infoPtr->nSelectionMark))) + { + int i; + infoPtr->nSelectionMark = -1; + for (i = 0; i < infoPtr->nItemCount; i++) + { + if (infoPtr->uCallbackMask & LVIS_SELECTED) + { + if (LISTVIEW_GetItemState(infoPtr, i, LVIS_SELECTED)) + { + infoPtr->nSelectionMark = i; + break; + } + } + else if (ranges_contain(infoPtr->selectionRanges, i)) + { + infoPtr->nSelectionMark = i; + break; + } + } + } + return bResult; }