Nikolay Sivov : comctl32/listview: Properly update selection mark on item state change.

Alexandre Julliard julliard at winehq.org
Mon Jun 11 15:08:07 CDT 2012


Module: wine
Branch: master
Commit: 6560d881511bc2affba709803275d086e8d41249
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6560d881511bc2affba709803275d086e8d41249

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jun  9 12:15:16 2012 +0400

comctl32/listview: Properly update selection mark on item state change.

---

 dlls/comctl32/listview.c       |    6 ++-
 dlls/comctl32/tests/listview.c |  126 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 130 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 7111560..27b2fd0 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -6,7 +6,7 @@
  * Copyright 2000 Jason Mawdsley
  * Copyright 2001 CodeWeavers Inc.
  * Copyright 2002 Dimitrie O. Paun
- * Copyright 2009-2011 Nikolay Sivov
+ * Copyright 2009-2012 Nikolay Sivov
  * Copyright 2009 Owen Rudge for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
@@ -4276,6 +4276,10 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
 	{
 	    if (lpLVItem->state & LVIS_FOCUSED)
 	    {
+		/* update selection mark */
+		if (infoPtr->nFocusedItem == -1 && infoPtr->nSelectionMark == -1)
+		    infoPtr->nSelectionMark = lpLVItem->iItem;
+
 		if (infoPtr->nFocusedItem != -1)
 		{
 		    /* remove current focus */
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index b96e85f..255ef50 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -2090,7 +2090,6 @@ static void test_multiselect(void)
         { "using VK_HOME", -1, VK_HOME, 1, -1 }
     };
 
-
     hwnd = create_listview_control(LVS_REPORT);
 
     for (i=0;i<items;i++) {
@@ -2237,6 +2236,131 @@ static void test_multiselect(void)
     r = ListView_GetSelectedCount(hwnd);
     expect(0, r);
 
+    /* 1. selection mark is update when new focused item is set */
+    style = GetWindowLongPtrA(hwnd, GWL_STYLE);
+    SetWindowLongPtrA(hwnd, GWL_STYLE, style & ~LVS_SINGLESEL);
+
+    r = SendMessage(hwnd, LVM_SETSELECTIONMARK, 0, -1);
+    expect(-1, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(0, r);
+
+    /* it's not updated if already set */
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, 1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(0, r);
+
+    r = SendMessage(hwnd, LVM_SETSELECTIONMARK, 0, -1);
+    expect(0, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, 1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(-1, r);
+
+    /* need to reset focused item first */
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = 0;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, -1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, 2, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(2, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = 0;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, -1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(2, r);
+
+    /* 2. same tests, with LVM_SETITEM */
+    style = GetWindowLongPtrA(hwnd, GWL_STYLE);
+    SetWindowLongPtrA(hwnd, GWL_STYLE, style & ~LVS_SINGLESEL);
+
+    r = SendMessage(hwnd, LVM_SETSELECTIONMARK, 0, -1);
+    expect(2, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    item.mask      = LVIF_STATE;
+    item.iItem = item.iSubItem = 0;
+    r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(0, r);
+
+    /* it's not updated if already set */
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    item.mask      = LVIF_STATE;
+    item.iItem     = 1;
+    item.iSubItem  = 0;
+    r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(0, r);
+
+    r = SendMessage(hwnd, LVM_SETSELECTIONMARK, 0, -1);
+    expect(0, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    item.mask      = LVIF_STATE;
+    item.iItem     = 1;
+    item.iSubItem  = 0;
+    r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(-1, r);
+
+    /* need to reset focused item first */
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = 0;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, -1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = LVIS_FOCUSED;
+    item.mask      = LVIF_STATE;
+    item.iItem     = 2;
+    item.iSubItem  = 0;
+    r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(2, r);
+
+    item.stateMask = LVIS_FOCUSED;
+    item.state     = 0;
+    r = SendMessage(hwnd, LVM_SETITEMSTATE, -1, (LPARAM)&item);
+    expect(TRUE, r);
+
+    r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+    expect(2, r);
+
     DestroyWindow(hwnd);
 }
 




More information about the wine-cvs mailing list