comctl32/header.c: Unify EADER_InsertItem[A/W] into one function
Vitaliy Margolen
wine-patch at kievinfo.com
Mon Oct 17 18:28:08 CDT 2005
Vitaliy Margolen
changelog:
comctl32/header.c:
- Unify EADER_InsertItem[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:26:01 -0000
@@ -914,13 +914,11 @@ HEADER_HitTest (HWND hwnd, WPARAM wParam
static LRESULT
-HEADER_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+HEADER_InsertItemT (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;
- INT len, iOrder;
+ INT iOrder;
UINT i;
if ((phdi == NULL) || (nItem < 0))
@@ -988,28 +986,12 @@ HEADER_InsertItemA (HWND hwnd, WPARAM wP
if (phdi->mask & HDI_WIDTH)
lpItem->cxy = phdi->cxy;
- if (phdi->mask & HDI_TEXT) {
- if (!phdi->pszText) /* null pointer check */
- phdi->pszText = "";
- if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
- 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_FORMAT)
lpItem->fmt = phdi->fmt;
if (lpItem->fmt == 0)
lpItem->fmt = HDF_LEFT;
- if (!(lpItem->fmt & HDF_STRING) && (phdi->mask & HDI_TEXT))
- {
- lpItem->fmt |= HDF_STRING;
- }
if (phdi->mask & HDI_BITMAP)
lpItem->hbm = phdi->hbm;
@@ -1019,118 +1001,20 @@ HEADER_InsertItemA (HWND hwnd, WPARAM wP
if (phdi->mask & HDI_IMAGE)
lpItem->iImage = phdi->iImage;
- lpItem->iOrder = iOrder;
-
- HEADER_SetItemBounds (hwnd);
-
- InvalidateRect(hwnd, NULL, FALSE);
-
- return nItem;
-}
-
-
-static LRESULT
-HEADER_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
-{
- HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
- HDITEMW *phdi = (HDITEMW*)lParam;
- INT nItem = (INT)wParam;
- HEADER_ITEM *lpItem;
- INT len, iOrder;
- UINT i;
-
- if ((phdi == NULL) || (nItem < 0))
- return -1;
-
- if (nItem > infoPtr->uNumItem)
- nItem = infoPtr->uNumItem;
-
- iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder : nItem;
-
- if (infoPtr->uNumItem == 0) {
- infoPtr->items = Alloc (sizeof (HEADER_ITEM));
- infoPtr->order = Alloc(sizeof(INT));
- infoPtr->uNumItem++;
- }
- else {
- HEADER_ITEM *oldItems = infoPtr->items;
- INT *oldOrder = infoPtr->order;
-
- infoPtr->uNumItem++;
- infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
- if (nItem == 0) {
- memcpy (&infoPtr->items[1], &oldItems[0],
- (infoPtr->uNumItem-1) * sizeof(HEADER_ITEM));
- }
- else
- {
- /* pre insert copy */
- if (nItem > 0) {
- memcpy (&infoPtr->items[0], &oldItems[0],
- nItem * sizeof(HEADER_ITEM));
- }
-
- /* post insert copy */
- if (nItem < infoPtr->uNumItem - 1) {
- memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
- (infoPtr->uNumItem - nItem - 1) * sizeof(HEADER_ITEM));
- }
- }
-
- infoPtr->order = Alloc(infoPtr->uNumItem * sizeof(INT));
- memcpy(infoPtr->order, oldOrder, iOrder * sizeof(INT));
- infoPtr->order[iOrder] = nItem;
- memcpy(&infoPtr->order[iOrder + 1], &oldOrder[iOrder],
- (infoPtr->uNumItem - iOrder - 1) * sizeof(INT));
-
- Free (oldItems);
- Free(oldOrder);
- }
-
- for (i = 0; i < infoPtr->uNumItem; i++)
+ if (phdi->mask & HDI_TEXT)
{
- if (i != iOrder && infoPtr->order[i] >= nItem)
- infoPtr->order[i]++;
- infoPtr->items[infoPtr->order[i]].iOrder = infoPtr->order[i];
- }
-
- lpItem = &infoPtr->items[nItem];
- lpItem->bDown = FALSE;
-
- if (phdi->mask & HDI_WIDTH)
- lpItem->cxy = phdi->cxy;
-
- if (phdi->mask & HDI_TEXT) {
- WCHAR wide_null_char = 0;
if (!phdi->pszText) /* null pointer check */
- phdi->pszText = &wide_null_char;
- if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
- len = strlenW (phdi->pszText);
- lpItem->pszText = Alloc ((len+1)*sizeof(WCHAR));
- strcpyW (lpItem->pszText, phdi->pszText);
- }
- else
- lpItem->pszText = LPSTR_TEXTCALLBACKW;
- }
-
- if (phdi->mask & HDI_FORMAT)
- lpItem->fmt = phdi->fmt;
-
- if (lpItem->fmt == 0)
- lpItem->fmt = HDF_LEFT;
-
- if (!(lpItem->fmt &HDF_STRING) && (phdi->mask & HDI_TEXT))
- {
- lpItem->fmt |= HDF_STRING;
- }
- if (phdi->mask & HDI_BITMAP)
- lpItem->hbm = phdi->hbm;
-
- if (phdi->mask & HDI_LPARAM)
- lpItem->lParam = phdi->lParam;
+ phdi->pszText = '\0';
+ if (phdi->pszText != LPSTR_TEXTCALLBACKW) /* covers != TEXTCALLBACKA too */
+ 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_IMAGE)
- lpItem->iImage = phdi->iImage;
+ lpItem->fmt |= HDF_STRING;
+ }
lpItem->iOrder = iOrder;
@@ -1910,10 +1794,8 @@ HEADER_WindowProc (HWND hwnd, UINT msg,
return HEADER_HitTest (hwnd, wParam, lParam);
case HDM_INSERTITEMA:
- return HEADER_InsertItemA (hwnd, wParam, lParam);
-
case HDM_INSERTITEMW:
- return HEADER_InsertItemW (hwnd, wParam, lParam);
+ return HEADER_InsertItemT (hwnd, (INT)wParam, (LPHDITEMW)lParam, msg == HDM_INSERTITEMW);
case HDM_LAYOUT:
return HEADER_Layout (hwnd, wParam, lParam);
More information about the wine-patches
mailing list