Correction to header order maintenance when a dummy first item is
added and then deleted (as suggested by MSDN to handle the fact that
the first column of a listview is left justified). Also removed
redundant casts.
diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index 228f214..613938c 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -26,6 +26,7 @@
* - Drag and Drop support (including Notifications).
* - New messages.
* - Use notification format
+ * - Correct the order maintenance code to preserve valid order
*
* FIXME:
* - Little flaw when drawing a bitmap on the right side of the text.
@@ -93,7 +94,7 @@
HEADER_IndexToOrder (HWND hwnd, INT iItem)
{
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
- HEADER_ITEM *lpItem = (HEADER_ITEM*)&infoPtr->items[iItem];
+ HEADER_ITEM *lpItem = &infoPtr->items[iItem];
return lpItem->iOrder;
}
@@ -608,10 +609,14 @@
}
else {
HEADER_ITEM *oldItems = infoPtr->items;
+ HEADER_ITEM *pItem;
+ INT i;
+ INT iOrder;
TRACE("Complex delete! [iItem=%d]\n", iItem);
if (infoPtr->items[iItem].pszText)
COMCTL32_Free (infoPtr->items[iItem].pszText);
+ iOrder = infoPtr->items[iItem].iOrder;
infoPtr->uNumItem--;
infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
@@ -627,6 +632,12 @@
(infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
}
+ /* Correct the orders */
+ for (i=infoPtr->uNumItem, pItem = infoPtr->items; i; i--, pItem++)
+ {
+ if (pItem->iOrder > iOrder)
+ pItem->iOrder--;
+ }
COMCTL32_Free (oldItems);
}
@@ -665,7 +676,7 @@
if (phdi->mask == 0)
return TRUE;
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
if (phdi->mask & HDI_BITMAP)
phdi->hbm = lpItem->hbm;
@@ -718,7 +729,7 @@
if (phdi->mask == 0)
return TRUE;
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
if (phdi->mask & HDI_BITMAP)
phdi->hbm = lpItem->hbm;
@@ -805,7 +816,7 @@
return FALSE;
for (i=0; i<(int)wParam; i++)
{
- lpItem = (HEADER_ITEM*)&infoPtr->items[*order++];
+ lpItem = &infoPtr->items[*order++];
lpItem->iOrder=i;
}
infoPtr->bRectsValid=0;
@@ -881,7 +892,7 @@
COMCTL32_Free (oldItems);
}
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
lpItem->bDown = FALSE;
if (phdi->mask & HDI_WIDTH)
@@ -980,7 +991,7 @@
COMCTL32_Free (oldItems);
}
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
lpItem->bDown = FALSE;
if (phdi->mask & HDI_WIDTH)
@@ -1096,7 +1107,7 @@
if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem, phdi->mask))
return FALSE;
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
if (phdi->mask & HDI_BITMAP)
lpItem->hbm = phdi->hbm;
@@ -1163,7 +1174,7 @@
if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGW, nItem, phdi->mask))
return FALSE;
- lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem = &infoPtr->items[nItem];
if (phdi->mask & HDI_BITMAP)
lpItem->hbm = phdi->hbm;
@@ -1271,7 +1282,7 @@
INT nItem;
if (infoPtr->items) {
- lpItem = (HEADER_ITEM*)infoPtr->items;
+ lpItem = infoPtr->items;
for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACKW))
COMCTL32_Free (lpItem->pszText);
@@ -1403,10 +1414,10 @@
TRACE("Exchanging [index:order] [%d:%d] [%d:%d]\n",
infoPtr->iMoveItem,oldindex,nItem,newindex);
- lpItem= (HEADER_ITEM*)&infoPtr->items[nItem];
+ lpItem= &infoPtr->items[nItem];
lpItem->iOrder=oldindex;
- lpItem= (HEADER_ITEM*)&infoPtr->items[infoPtr->iMoveItem];
+ lpItem= &infoPtr->items[infoPtr->iMoveItem];
lpItem->iOrder = newindex;
infoPtr->bRectsValid = FALSE;
@@ -1768,7 +1779,7 @@
return HEADER_SetFont (hwnd, wParam, lParam);
default:
- if (msg >= WM_USER)
+ if ((msg >= WM_USER) && (msg < WM_APP))
ERR("unknown msg %04x wp=%04x lp=%08lx\n",
msg, wParam, lParam );
return DefWindowProcA (hwnd, msg, wParam, lParam);
@@ -1799,4 +1810,3 @@
{
UnregisterClassA (WC_HEADERA, (HINSTANCE)NULL);
}
-