[PATCH] Complete IFolderView::ItemCount() implementation

Nikolay Sivov nsivov at codeweavers.com
Sun Apr 18 09:55:50 CDT 2010


---
 dlls/shell32/shlview.c       |   26 +++++++++++++++++++++++---
 dlls/shell32/tests/shlview.c |   19 ++++++++++++++++++-
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index c7d9ee8..77b93de 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -2774,10 +2774,30 @@ static HRESULT WINAPI IFView_ItemCount(IFolderView *iface, UINT flags, int *item
 
     TRACE("(%p)->(%u %p)\n", This, flags, items);
 
-    if (flags != SVGIO_ALLVIEW)
-        FIXME("some flags unsupported, %x\n", flags & ~SVGIO_ALLVIEW);
+    switch (flags & SVGIO_TYPE_MASK)
+    {
+    case SVGIO_SELECTION:
+        *items = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
+        break;
+    case SVGIO_BACKGROUND:
+    case SVGIO_ALLVIEW:
+        *items = SendMessageW(This->hWndList, LVM_GETITEMCOUNT, 0, 0);
+        break;
+    case SVGIO_CHECKED:
+    {
+        DWORD state, count;
 
-    *items = SendMessageW(This->hWndList, LVM_GETITEMCOUNT, 0, 0);
+        *items = count = SendMessageW(This->hWndList, LVM_GETSELECTEDCOUNT, 0, 0);
+        while (count--)
+        {
+            state = SendMessageW(This->hWndList, LVM_GETITEMSTATE, count, LVIS_STATEIMAGEMASK);
+            if (((state & LVIS_STATEIMAGEMASK) >> 12) != 2) (*items)--;
+        }
+        break;
+    }
+    default:
+        WARN("unsupported flags, %x\n", flags);
+    }
 
     return S_OK;
 }
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c
index dc60a49..4af7246 100644
--- a/dlls/shell32/tests/shlview.c
+++ b/dlls/shell32/tests/shlview.c
@@ -432,6 +432,11 @@ static const struct message folderview_itemcount_seq[] = {
     { 0 }
 };
 
+static const struct message folderview_selected_count_seq[] = {
+    { LVM_GETSELECTEDCOUNT, sent },
+    { 0 }
+};
+
 static void test_IShellView_CreateViewWindow(void)
 {
     IShellFolder *desktop;
@@ -621,7 +626,19 @@ if (0)
     hr = IFolderView_ItemCount(fv, SVGIO_ALLVIEW, &ret);
     ok(hr == S_OK, "got (0x%08x)\n", hr);
     ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_itemcount_seq,
-                                  "IFolderView::ItemCount", FALSE);
+                                  "IFolderView::ItemCount - SVGIO_ALLVIEW", FALSE);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    hr = IFolderView_ItemCount(fv, SVGIO_SELECTION, &ret);
+    ok(hr == S_OK, "got (0x%08x)\n", hr);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_selected_count_seq,
+                                  "IFolderView::ItemCount - SVGIO_SELECTION", FALSE);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    hr = IFolderView_ItemCount(fv, SVGIO_BACKGROUND, &ret);
+    ok(hr == S_OK, "got (0x%08x)\n", hr);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_itemcount_seq,
+                                  "IFolderView::ItemCount - SVGIO_BACKGROUND", FALSE);
 
     IShellBrowser_Release(browser);
     IFolderView_Release(fv);
-- 
1.5.6.5


--=-CEFihzN79zW7jFaLudUl--




More information about the wine-patches mailing list