diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index 0d808fef0d40dd5258aa386e93da0a0b3640a395..f3c592940836f23b5e6661df0c8ed75e7c15b3ed 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -1986,25 +1986,39 @@ TREEVIEW_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) wineItem->upsibling=sibItem->hItem; break; default: - while ((sibItem->sibling) && (sibItem->hItem!=ptdi->hInsertAfter)) + { + TREEVIEW_ITEM *localsibItem = sibItem; + while ((localsibItem->sibling) && + (localsibItem->hItem!=ptdi->hInsertAfter)) { - prevsib=sibItem; - sibItem=&infoPtr->items [(INT)sibItem->sibling]; + prevsib=localsibItem; + localsibItem=&infoPtr->items [(INT)localsibItem->sibling]; } - if (sibItem->hItem!=ptdi->hInsertAfter) { - ERR("tried to insert item after nonexisting handle %d.\n", + if (localsibItem->hItem!=ptdi->hInsertAfter) { + WARN("tried to insert item after nonexisting handle %d treating as TVI_LAST.\n", (INT) ptdi->hInsertAfter); - break; + /* + * retry placing it last + */ + if (sibItem==wineItem) break; + while (sibItem->sibling) { + prevsib=sibItem; + sibItem=&infoPtr->items [(INT)sibItem->sibling]; + } + sibItem->sibling=(HTREEITEM)iItem; + wineItem->upsibling=sibItem->hItem; + break; } - prevsib=sibItem; - if (sibItem->sibling) { - sibItem=&infoPtr->items [(INT)sibItem->sibling]; - sibItem->upsibling=(HTREEITEM)iItem; - wineItem->sibling=sibItem->hItem; + prevsib=localsibItem; + if (localsibItem->sibling) { + localsibItem=&infoPtr->items [(INT)localsibItem->sibling]; + localsibItem->upsibling=(HTREEITEM)iItem; + wineItem->sibling=localsibItem->hItem; } prevsib->sibling=(HTREEITEM)iItem; wineItem->upsibling=prevsib->hItem; break; + } } }