Work toward properly updating the SelectionMark when the selected

state changed inside a listbox.
This commit is contained in:
Aric Stewart 2004-02-13 22:40:37 +00:00 committed by Alexandre Julliard
parent 20fff3d111
commit e56178d9d5
1 changed files with 34 additions and 0 deletions

View File

@ -7043,6 +7043,40 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE
else else
bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE); 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; return bResult;
} }