Commit d98b9a46 authored by Mikołaj Zalewski's avatar Mikołaj Zalewski Committed by Alexandre Julliard

comctl32: header: Simplify the insert/delete code by using ReAlloc.

parent 8ab78e18
...@@ -1076,7 +1076,6 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam) ...@@ -1076,7 +1076,6 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam)
infoPtr->uNumItem = 0; infoPtr->uNumItem = 0;
} }
else { else {
HEADER_ITEM *oldItems = infoPtr->items;
INT i; INT i;
INT iOrder; INT iOrder;
TRACE("Complex delete! [iItem=%d]\n", iItem); TRACE("Complex delete! [iItem=%d]\n", iItem);
...@@ -1087,26 +1086,14 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam) ...@@ -1087,26 +1086,14 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam)
iOrder = infoPtr->items[iItem].iOrder; iOrder = infoPtr->items[iItem].iOrder;
infoPtr->uNumItem--; infoPtr->uNumItem--;
infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem); memmove(&infoPtr->items[iItem], &infoPtr->items[iItem + 1],
/* pre delete copy */ (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
if (iItem > 0) { memmove(&infoPtr->order[iOrder], &infoPtr->order[iOrder + 1],
memcpy (&infoPtr->items[0], &oldItems[0], (infoPtr->uNumItem - iOrder) * sizeof(INT));
iItem * sizeof(HEADER_ITEM)); infoPtr->items = ReAlloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
} infoPtr->order = ReAlloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
/* post delete copy */
if (iItem < infoPtr->uNumItem) {
memcpy (&infoPtr->items[iItem], &oldItems[iItem+1],
(infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
}
/* Correct the orders */ /* Correct the orders */
if (iOrder < infoPtr->uNumItem)
{
memmove(&infoPtr->order[iOrder], &infoPtr->order[iOrder + 1],
(infoPtr->uNumItem - iOrder) * sizeof(INT));
}
for (i = 0; i < infoPtr->uNumItem; i++) for (i = 0; i < infoPtr->uNumItem; i++)
{ {
if (infoPtr->order[i] > iItem) if (infoPtr->order[i] > iItem)
...@@ -1117,7 +1104,6 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam) ...@@ -1117,7 +1104,6 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wParam)
for (i = 0; i < infoPtr->uNumItem; i++) for (i = 0; i < infoPtr->uNumItem; i++)
TRACE("%d: order=%d, iOrder=%d, ->iOrder=%d\n", i, infoPtr->order[i], infoPtr->items[i].iOrder, infoPtr->items[infoPtr->order[i]].iOrder); TRACE("%d: order=%d, iOrder=%d, ->iOrder=%d\n", i, infoPtr->order[i], infoPtr->items[i].iOrder, infoPtr->items[infoPtr->order[i]].iOrder);
Free (oldItems);
} }
HEADER_SetItemBounds (hwnd); HEADER_SetItemBounds (hwnd);
...@@ -1300,46 +1286,18 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode) ...@@ -1300,46 +1286,18 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode)
else if (infoPtr->uNumItem < iOrder) else if (infoPtr->uNumItem < iOrder)
iOrder = infoPtr->uNumItem; iOrder = infoPtr->uNumItem;
if (infoPtr->uNumItem == 0) { infoPtr->uNumItem++;
infoPtr->items = Alloc (sizeof (HEADER_ITEM)); infoPtr->items = ReAlloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
infoPtr->order = Alloc(sizeof(INT)); infoPtr->order = ReAlloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
infoPtr->uNumItem++;
} /* make space for the new item */
else { memmove(&infoPtr->items[nItem + 1], &infoPtr->items[nItem],
HEADER_ITEM *oldItems = infoPtr->items; (infoPtr->uNumItem - nItem - 1) * sizeof(HEADER_ITEM));
INT *oldOrder = infoPtr->order; memmove(&infoPtr->order[iOrder + 1], &infoPtr->order[iOrder],
(infoPtr->uNumItem - iOrder - 1) * sizeof(INT));
infoPtr->uNumItem++;
infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem); /* update the order array */
if (nItem == 0) { infoPtr->order[iOrder] = nItem;
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(sizeof(INT) * infoPtr->uNumItem);
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++) for (i = 0; i < infoPtr->uNumItem; i++)
{ {
if (i != iOrder && infoPtr->order[i] >= nItem) if (i != iOrder && infoPtr->order[i] >= nItem)
...@@ -1352,6 +1310,7 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode) ...@@ -1352,6 +1310,7 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode)
/* cxy, fmt and lParam are copied even if not in the HDITEM mask */ /* cxy, fmt and lParam are copied even if not in the HDITEM mask */
copyMask = phdi->mask | HDI_WIDTH | HDI_FORMAT | HDI_LPARAM; copyMask = phdi->mask | HDI_WIDTH | HDI_FORMAT | HDI_LPARAM;
HEADER_StoreHDItemInHeader(lpItem, copyMask, phdi, bUnicode); HEADER_StoreHDItemInHeader(lpItem, copyMask, phdi, bUnicode);
lpItem->iOrder = iOrder;
/* set automatically some format bits */ /* set automatically some format bits */
if (phdi->mask & HDI_TEXT) if (phdi->mask & HDI_TEXT)
...@@ -1367,10 +1326,7 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode) ...@@ -1367,10 +1326,7 @@ HEADER_InsertItemT (HWND hwnd, INT nItem, LPHDITEMW phdi, BOOL bUnicode)
if (phdi->mask & HDI_IMAGE) if (phdi->mask & HDI_IMAGE)
lpItem->fmt |= HDF_IMAGE; lpItem->fmt |= HDF_IMAGE;
lpItem->iOrder = iOrder;
HEADER_SetItemBounds (hwnd); HEADER_SetItemBounds (hwnd);
InvalidateRect(hwnd, NULL, FALSE); InvalidateRect(hwnd, NULL, FALSE);
return nItem; return nItem;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment