Commit eed36af5 authored by Gabriel Ivăncescu's avatar Gabriel Ivăncescu Committed by Alexandre Julliard

comctl32/listbox: Resize the entire item array at once in SetCount.

parent 1ae12240
...@@ -144,6 +144,12 @@ static BOOL resize_storage(LB_DESCR *descr, UINT items_size) ...@@ -144,6 +144,12 @@ static BOOL resize_storage(LB_DESCR *descr, UINT items_size)
descr->items_size = items_size; descr->items_size = items_size;
descr->items = items; descr->items = items;
} }
if ((descr->style & LBS_NODATA) && items_size > descr->nb_items)
{
memset(&descr->items[descr->nb_items], 0,
(items_size - descr->nb_items) * sizeof(LB_ITEMDATA));
}
return TRUE; return TRUE;
} }
...@@ -1742,25 +1748,36 @@ static void LISTBOX_ResetContent( LB_DESCR *descr ) ...@@ -1742,25 +1748,36 @@ static void LISTBOX_ResetContent( LB_DESCR *descr )
/*********************************************************************** /***********************************************************************
* LISTBOX_SetCount * LISTBOX_SetCount
*/ */
static LRESULT LISTBOX_SetCount( LB_DESCR *descr, INT count ) static LRESULT LISTBOX_SetCount( LB_DESCR *descr, UINT count )
{ {
LRESULT ret; UINT orig_num = descr->nb_items;
if (!(descr->style & LBS_NODATA)) return LB_ERR; if (!(descr->style & LBS_NODATA)) return LB_ERR;
/* FIXME: this is far from optimal... */ if (!resize_storage(descr, count))
if (count > descr->nb_items) return LB_ERRSPACE;
descr->nb_items = count;
if (count)
{ {
while (count > descr->nb_items) LISTBOX_UpdateScroll(descr);
if ((ret = LISTBOX_InsertString( descr, -1, 0 )) < 0) if (count < orig_num)
return ret;
}
else if (count < descr->nb_items)
{ {
while (count < descr->nb_items) descr->anchor_item = min(descr->anchor_item, count - 1);
if ((ret = LISTBOX_RemoveItem( descr, (descr->nb_items - 1) )) < 0) if (descr->selected_item >= count)
return ret; descr->selected_item = -1;
/* If we removed the scrollbar, reset the top of the list */
if (count <= descr->page_size && orig_num > descr->page_size)
LISTBOX_SetTopItem(descr, 0, TRUE);
descr->focus_item = min(descr->focus_item, count - 1);
}
/* If it was empty before growing, set focus to the first item */
else if (orig_num == 0) LISTBOX_SetCaretIndex(descr, 0, FALSE);
} }
else SendMessageW(descr->self, LB_RESETCONTENT, 0, 0);
InvalidateRect( descr->self, NULL, TRUE ); InvalidateRect( descr->self, NULL, TRUE );
return LB_OKAY; return LB_OKAY;
......
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