Nikolay Sivov : comctl32/listview: Add callback subitem on column insertion .

Alexandre Julliard julliard at winehq.org
Thu Apr 22 11:24:06 CDT 2010


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 22 12:06:28 2010 +0400

comctl32/listview: Add callback subitem on column insertion.

---

 dlls/comctl32/listview.c       |   26 ++++++++++++-----
 dlls/comctl32/tests/listview.c |   59 +++++++++++++++++++++++++++++-----------
 2 files changed, 61 insertions(+), 24 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 3ea8e0f..68ad0a9 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -4276,12 +4276,11 @@ static BOOL set_sub_item(const LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
 	*bChanged = TRUE;
     }
     
-    if (lpLVItem->mask & LVIF_IMAGE)
-	if (lpSubItem->hdr.iImage != lpLVItem->iImage)
-	{
-	    lpSubItem->hdr.iImage = lpLVItem->iImage;
-	    *bChanged = TRUE;
-	}
+    if ((lpLVItem->mask & LVIF_IMAGE) && (lpSubItem->hdr.iImage != lpLVItem->iImage))
+    {
+        lpSubItem->hdr.iImage = lpLVItem->iImage;
+        *bChanged = TRUE;
+    }
 
     if ((lpLVItem->mask & LVIF_TEXT) && textcmpWT(lpSubItem->hdr.pszText, lpLVItem->pszText, isW))
     {
@@ -6434,7 +6433,7 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
 
     if (isubitem)
     {
-	SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
+        SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
         pItemHdr = lpSubItem ? &lpSubItem->hdr : &callbackHdr;
         if (!lpSubItem)
         {
@@ -7883,7 +7882,14 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
 	SUBITEM_INFO *lpSubItem;
 	HDPA hdpaSubItems;
 	INT nItem, i;
-	
+	LVITEMW item;
+	BOOL changed;
+
+	item.iSubItem = nNewColumn;
+	item.mask = LVIF_TEXT | LVIF_IMAGE;
+	item.iImage = I_IMAGECALLBACK;
+	item.pszText = LPSTR_TEXTCALLBACKW;
+
 	for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
 	{
             hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, nItem);
@@ -7893,6 +7899,10 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
 		if (lpSubItem->iSubItem >= nNewColumn)
 		    lpSubItem->iSubItem++;
 	    }
+
+	    /* add new subitem for each item */
+	    item.iItem = nItem;
+	    set_sub_item(infoPtr, &item, isW, &changed);
 	}
     }
 
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 13fda83..4bf877a 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -45,7 +45,7 @@
 static const WCHAR testparentclassW[] =
     {'L','i','s','t','v','i','e','w',' ','t','e','s','t',' ','p','a','r','e','n','t','W', 0};
 
-HWND hwndparent, hwndparentW;
+static HWND hwndparent, hwndparentW;
 /* prevents edit box creation, LVN_BEGINLABELEDIT return value */
 static BOOL blockEdit;
 /* return nonzero on NM_HOVER */
@@ -54,9 +54,11 @@ static BOOL g_block_hover;
 static BOOL g_dump_itemchanged;
 /* format reported to control:
    -1 falls to defproc, anything else returned */
-INT  notifyFormat;
+static INT  notifyFormat;
 /* indicates we're running < 5.80 version */
-BOOL g_is_below_5;
+static BOOL g_is_below_5;
+/* item data passed to LVN_GETDISPINFOA */
+static LVITEMA g_itema;
 
 static HWND subclass_editbox(HWND hwndListview);
 
@@ -366,6 +368,12 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP
                          nmlv->iItem, nmlv->uNewState, nmlv->uOldState, nmlv->uChanged);
               }
               break;
+          case LVN_GETDISPINFOA:
+              {
+                  NMLVDISPINFOA *dispinfo = (NMLVDISPINFOA*)lParam;
+                  g_itema = dispinfo->item;
+              }
+              break;
           case NM_HOVER:
               if (g_block_hover) return 1;
               break;
@@ -1187,24 +1195,25 @@ static void test_items(void)
 static void test_columns(void)
 {
     HWND hwnd, hwndheader;
-    LVCOLUMN column;
-    DWORD rc;
+    LVCOLUMNA column;
+    LVITEMA item;
     INT order[2];
+    CHAR buff[5];
+    DWORD rc;
 
-    hwnd = CreateWindowEx(0, "SysListView32", "foo", LVS_REPORT,
+    hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_REPORT,
                 10, 10, 100, 200, hwndparent, NULL, NULL, NULL);
     ok(hwnd != NULL, "failed to create listview window\n");
 
     /* Add a column with no mask */
     memset(&column, 0xcc, sizeof(column));
     column.mask = 0;
-    rc = ListView_InsertColumn(hwnd, 0, &column);
-    ok(rc==0, "Inserting column with no mask failed with %d\n", rc);
+    rc = SendMessageA(hwnd, LVM_INSERTCOLUMNA, 0, (LPARAM)&column);
+    ok(rc == 0, "Inserting column with no mask failed with %d\n", rc);
 
     /* Check its width */
-    rc = ListView_GetColumnWidth(hwnd, 0);
-    ok(rc==10 ||
-       broken(rc==0), /* win9x */
+    rc = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0);
+    ok(rc == 10 || broken(rc == 0) /* win9x */,
        "Inserting column with no mask failed to set width to 10 with %d\n", rc);
 
     DestroyWindow(hwnd);
@@ -1216,24 +1225,43 @@ static void test_columns(void)
     memset(&column, 0, sizeof(column));
     column.mask = LVCF_WIDTH;
     column.cx = 100;
-    rc = ListView_InsertColumn(hwnd, 0, &column);
+    rc = SendMessageA(hwnd, LVM_INSERTCOLUMNA, 0, (LPARAM)&column);
     ok(rc == 0, "Inserting column failed with %d\n", rc);
 
     column.cx = 200;
-    rc = ListView_InsertColumn(hwnd, 1, &column);
+    rc = SendMessageA(hwnd, LVM_INSERTCOLUMNA, 1, (LPARAM)&column);
     ok(rc == 1, "Inserting column failed with %d\n", rc);
 
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
-    rc = SendMessage(hwnd, LVM_GETCOLUMNORDERARRAY, 2, (LPARAM)&order);
-    ok(rc != 0, "Expected LVM_GETCOLUMNORDERARRAY to succeed\n");
+    rc = SendMessageA(hwnd, LVM_GETCOLUMNORDERARRAY, 2, (LPARAM)&order);
+    ok(rc == 1, "Expected LVM_GETCOLUMNORDERARRAY to succeed\n");
     ok(order[0] == 0, "Expected order 0, got %d\n", order[0]);
     ok(order[1] == 1, "Expected order 1, got %d\n", order[1]);
 
     ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_getorderarray_seq, "get order array", FALSE);
 
+    /* after column added subitem is considered as present */
+    insert_item(hwnd, 0);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    item.pszText = buff;
+    item.cchTextMax = sizeof(buff);
+    item.iItem = 0;
+    item.iSubItem = 1;
+    item.mask = LVIF_TEXT;
+    memset(&g_itema, 0, sizeof(g_itema));
+    rc = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
+    ok(rc == 1, "got %d\n", rc);
+    ok(g_itema.iSubItem == 1, "got %d\n", g_itema.iSubItem);
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, single_getdispinfo_parent_seq,
+        "get subitem text after column added", FALSE);
+
     DestroyWindow(hwnd);
 }
+
 /* test setting imagelist between WM_NCCREATE and WM_CREATE */
 static WNDPROC listviewWndProc;
 static HIMAGELIST test_create_imagelist;
@@ -3389,7 +3417,6 @@ static void test_getitemrect(void)
     expect(2 + 16, rect.left);
     expect(34, rect.right);
 
-
     DestroyWindow(hwnd);
 }
 




More information about the wine-cvs mailing list