Send notification messages in the format dictated by
authorDimitrie O. Paun <dpaun@rogers.com>
Mon, 1 Nov 2004 21:07:11 +0000 (21:07 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 1 Nov 2004 21:07:11 +0000 (21:07 +0000)
infoPtr->notifyFormat.

dlls/comctl32/listview.c

index 0104305d9312c00c13db567c5f4afc990694a3e2..ca76edb373b8c46fc81d5346d5a1a79cf0784cf9 100644 (file)
@@ -818,10 +818,8 @@ static int get_ansi_notification(INT unicodeNotificationCode)
 }
 
 /*
-  With testing on Windows 2000 it looks like the notify format
-  has nothing to do with this message. It ALWAYS seems to be
-  in ansi format.
-
+  Send notification. depends on dispinfoW having same
+  structure as dispinfoA.
   infoPtr : listview struct
   notificationCode : *Unicode* notification code
   pdi : dispinfo structure (can be unicode or ansi)
@@ -830,32 +828,40 @@ static int get_ansi_notification(INT unicodeNotificationCode)
 static BOOL notify_dispinfoT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNMLVDISPINFOW pdi, BOOL isW)
 {
     BOOL bResult = FALSE;
-    BOOL convertToAnsi = FALSE;
-    INT cchTempBufMax = 0, savCchTextMax = 0;
+    BOOL convertToAnsi = FALSE, convertToUnicode = FALSE;
+    INT cchTempBufMax = 0, savCchTextMax = 0, realNotifCode;
     LPWSTR pszTempBuf = NULL, savPszText = NULL;
 
     if ((pdi->item.mask & LVIF_TEXT) && is_textT(pdi->item.pszText, isW))
-           convertToAnsi = isW;
+    {
+       convertToAnsi = (isW && infoPtr->notifyFormat == NFR_ANSI);
+       convertToUnicode = (!isW && infoPtr->notifyFormat == NFR_UNICODE);
+    }
 
-    if (convertToAnsi)
+    if (convertToAnsi || convertToUnicode)
     {
        if (notificationCode != LVN_GETDISPINFOW)
-       {
-            cchTempBufMax = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText,
-                                                -1, NULL, 0, NULL, NULL);
-        }
-       else
-       {
-           cchTempBufMax = pdi->item.cchTextMax;
-           *pdi->item.pszText = 0; /* make sure we don't process garbage */
+       {
+           cchTempBufMax = convertToUnicode ?
+                       MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1, NULL, 0):
+                       WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL, NULL);
        }
-
-        pszTempBuf = HeapAlloc(GetProcessHeap(), 0, sizeof(CHAR) *
-                               cchTempBufMax);
+       else
+       {
+           cchTempBufMax = pdi->item.cchTextMax;
+           *pdi->item.pszText = 0; /* make sure we don't process garbage */
+       }
+
+       pszTempBuf = HeapAlloc(GetProcessHeap(), 0,
+           (convertToUnicode ? sizeof(WCHAR) : sizeof(CHAR)) * cchTempBufMax);
         if (!pszTempBuf) return FALSE;
 
-        WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR)
-                             pszTempBuf, cchTempBufMax, NULL, NULL);
+       if (convertToUnicode)
+           MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1,
+                               pszTempBuf, cchTempBufMax);
+       else
+           WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) pszTempBuf,
+                               cchTempBufMax, NULL, NULL);
 
         savCchTextMax = pdi->item.cchTextMax;
         savPszText = pdi->item.pszText;
@@ -863,16 +869,21 @@ static BOOL notify_dispinfoT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNML
         pdi->item.cchTextMax = cchTempBufMax;
     }
 
-    TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat !=
-           NFR_ANSI));
-
-    bResult = notify_hdr(infoPtr, get_ansi_notification(notificationCode),
-                        (LPNMHDR)pdi);
+    if (infoPtr->notifyFormat == NFR_ANSI)
+       realNotifCode = get_ansi_notification(notificationCode);
+    else
+       realNotifCode = notificationCode;
+    TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat != NFR_ANSI));
+    bResult = notify_hdr(infoPtr, realNotifCode, &pdi->hdr);
 
-    if (convertToAnsi)
+    if (convertToUnicode || convertToAnsi)
     {
-        MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
-                            savPszText, savCchTextMax);
+       if (convertToUnicode) /* note : pointer can be changed by app ! */
+           WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) savPszText,
+                                savCchTextMax, NULL, NULL);
+       else
+           MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
+                               savPszText, savCchTextMax);
         pdi->item.pszText = savPszText; /* restores our buffer */
         pdi->item.cchTextMax = savCchTextMax;
         HeapFree(GetProcessHeap(), 0, pszTempBuf);