comctl32/header.c: Unify HEADER_SetItem[A/W] into one function

Vitaliy Margolen wine-patch at kievinfo.com
Mon Oct 17 18:47:32 CDT 2005



Vitaliy Margolen

changelog:
  comctl32/header.c
  - Unify HEADER_SetItem[A/W] into one function
-------------- next part --------------
Index: dlls/comctl32/header.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/header.c,v
retrieving revision 1.83
diff -u -p -r1.83 header.c
--- dlls/comctl32/header.c	18 Sep 2005 12:29:35 -0000	1.83
+++ dlls/comctl32/header.c	17 Oct 2005 23:44:52 -0000
@@ -1207,11 +1091,9 @@ HEADER_SetBitmapMargin(HWND hwnd, WPARAM
 }
 
 static LRESULT
-HEADER_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+HEADER_SetItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
-    HDITEMA *phdi = (HDITEMA*)lParam;
-    INT nItem = (INT)wParam;
     HEADER_ITEM *lpItem;
 
     if (phdi == NULL)
@@ -1221,7 +1103,8 @@ HEADER_SetItemA (HWND hwnd, WPARAM wPara
 
     TRACE("[nItem=%d]\n", nItem);
 
-	if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem, phdi->mask))
+    if (HEADER_SendHeaderNotify (hwnd, bUnicode ? HDN_ITEMCHANGINGW : HDN_ITEMCHANGINGA,
+                                 nItem, phdi->mask))
 	return FALSE;
 
     lpItem = &infoPtr->items[nItem];
@@ -1234,113 +1117,33 @@ HEADER_SetItemA (HWND hwnd, WPARAM wPara
     if (phdi->mask & HDI_LPARAM)
 	lpItem->lParam = phdi->lParam;
 
-    if (phdi->mask & HDI_TEXT) {
-	if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
-	    if (lpItem->pszText) {
-		Free (lpItem->pszText);
-		lpItem->pszText = NULL;
-	    }
-	    if (phdi->pszText) {
-		INT len = MultiByteToWideChar (CP_ACP,0,phdi->pszText,-1,NULL,0);
-		lpItem->pszText = Alloc( len*sizeof(WCHAR) );
-		MultiByteToWideChar (CP_ACP,0,phdi->pszText,-1,lpItem->pszText,len);
-	    }
-	}
-	else
-	    lpItem->pszText = LPSTR_TEXTCALLBACKW;
-    }
-
     if (phdi->mask & HDI_WIDTH)
 	lpItem->cxy = phdi->cxy;
 
     if (phdi->mask & HDI_IMAGE)
 	lpItem->iImage = phdi->iImage;
 
-    if (phdi->mask & HDI_ORDER)
-      {
-        INT i, nMin, nMax;
-        
-        if (lpItem->iOrder < phdi->iOrder)
-        {
-            memmove(&infoPtr->order[lpItem->iOrder],
-                   &infoPtr->order[lpItem->iOrder + 1],
-                   (phdi->iOrder - lpItem->iOrder) * sizeof(INT));
-        }
-        if (phdi->iOrder < lpItem->iOrder)
-        {
-            memmove(&infoPtr->order[phdi->iOrder + 1],
-                    &infoPtr->order[phdi->iOrder],
-                    (lpItem->iOrder - phdi->iOrder) * sizeof(INT));
-        }
-        infoPtr->order[phdi->iOrder] = nItem;
-        nMin = min(lpItem->iOrder, phdi->iOrder);
-        nMax = max(lpItem->iOrder, phdi->iOrder);
-        for (i = nMin; i <= nMax; i++)
+    if (phdi->mask & HDI_TEXT)
+    {
+        if (phdi->pszText != LPSTR_TEXTCALLBACKW) /* covers != TEXTCALLBACKA too */
         {
-            infoPtr->items[infoPtr->order[i]].iOrder = infoPtr->order[i];
-        }
-      }
-
-    HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem, phdi->mask);
-
-    HEADER_SetItemBounds (hwnd);
-
-    InvalidateRect(hwnd, NULL, FALSE);
-
-    return TRUE;
-}
-
-
-static LRESULT
-HEADER_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
-    HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
-    HDITEMW *phdi = (HDITEMW*)lParam;
-    INT nItem = (INT)wParam;
-    HEADER_ITEM *lpItem;
-
-    if (phdi == NULL)
-	return FALSE;
-    if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
-        return FALSE;
-
-    TRACE("[nItem=%d]\n", nItem);
-
-	if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGW, nItem, phdi->mask))
-	return FALSE;
-
-    lpItem = &infoPtr->items[nItem];
-    if (phdi->mask & HDI_BITMAP)
-	lpItem->hbm = phdi->hbm;
-
-    if (phdi->mask & HDI_FORMAT)
-	lpItem->fmt = phdi->fmt;
-
-    if (phdi->mask & HDI_LPARAM)
-	lpItem->lParam = phdi->lParam;
-
-    if (phdi->mask & HDI_TEXT) {
-	if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
-	    if (lpItem->pszText) {
-		Free (lpItem->pszText);
-		lpItem->pszText = NULL;
-	    }
-	    if (phdi->pszText) {
-		INT len = strlenW (phdi->pszText);
-		lpItem->pszText = Alloc ((len+1)*sizeof(WCHAR));
-		strcpyW (lpItem->pszText, phdi->pszText);
-	    }
+            if (lpItem->pszText)
+            {
+                Free(lpItem->pszText);
+                lpItem->pszText = NULL;
+            }
+            if (phdi->pszText)
+            {
+                if (bUnicode)
+                    Str_SetPtrW(&lpItem->pszText, phdi->pszText);
+                else
+                    Str_SetPtrAtoW(&lpItem->pszText, (LPSTR)phdi->pszText);
+            }
 	}
 	else
 	    lpItem->pszText = LPSTR_TEXTCALLBACKW;
     }
 
-    if (phdi->mask & HDI_WIDTH)
-	lpItem->cxy = phdi->cxy;
-
-    if (phdi->mask & HDI_IMAGE)
-	lpItem->iImage = phdi->iImage;
-
     if (phdi->mask & HDI_ORDER)
       {
         INT i, nMin, nMax;
@@ -1366,7 +1169,8 @@ HEADER_SetItemW (HWND hwnd, WPARAM wPara
         }
       }
 
-    HEADER_SendHeaderNotify(hwnd, HDN_ITEMCHANGEDW, nItem, phdi->mask);
+    HEADER_SendHeaderNotify (hwnd, bUnicode ? HDN_ITEMCHANGEDW : HDN_ITEMCHANGEDA,
+                             nItem, phdi->mask);
 
     HEADER_SetItemBounds (hwnd);
 
@@ -1932,10 +1734,8 @@ HEADER_WindowProc (HWND hwnd, UINT msg, 
 	    return HEADER_SetImageList (hwnd, (HIMAGELIST)lParam);
 
 	case HDM_SETITEMA:
-	    return HEADER_SetItemA (hwnd, wParam, lParam);
-
 	case HDM_SETITEMW:
-	    return HEADER_SetItemW (hwnd, wParam, lParam);
+	    return HEADER_SetItemT (hwnd, (INT)wParam, (LPHDITEMW)lParam, msg == HDM_SETITEMW);
 
 	case HDM_SETORDERARRAY:
 	    return HEADER_SetOrderArray(hwnd, wParam, lParam);


More information about the wine-patches mailing list