Index: dll/win32/comctl32/propsheet.c =================================================================== --- dll/win32/comctl32/propsheet.c (revision 69461) +++ dll/win32/comctl32/propsheet.c (working copy) @@ -156,7 +156,7 @@ static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo* psInfo); static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID); static BOOL PROPSHEET_RemovePage(HWND hwndDlg, int index, HPROPSHEETPAGE hpage); - +static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage); static INT_PTR CALLBACK PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -2243,60 +2243,9 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg, HPROPSHEETPAGE hpage) { - PropPageInfo * ppi; PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr); - HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL); - TCITEMW item; - LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)hpage; - TRACE("hpage %p\n", hpage); - /* - * Allocate and fill in a new PropPageInfo entry. - */ - ppi = ReAlloc(psInfo->proppage, sizeof(PropPageInfo) * (psInfo->nPages + 1)); - if (!ppi) - return FALSE; - - psInfo->proppage = ppi; - if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages, FALSE)) - return FALSE; - - psInfo->proppage[psInfo->nPages].hpage = hpage; - - if (ppsp->dwFlags & PSP_PREMATURE) - { - /* Create the page but don't show it */ - if(!PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp)) - return FALSE; - } - - /* - * Add a new tab to the tab control. - */ - item.mask = TCIF_TEXT; - item.pszText = (LPWSTR) psInfo->proppage[psInfo->nPages].pszText; - item.cchTextMax = MAX_TABTEXT_LENGTH; - - if (psInfo->hImageList) - { - SendMessageW(hwndTabControl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList); - } - - if ( psInfo->proppage[psInfo->nPages].hasIcon ) - { - item.mask |= TCIF_IMAGE; - item.iImage = psInfo->nPages; - } - - SendMessageW(hwndTabControl, TCM_INSERTITEMW, psInfo->nPages + 1, - (LPARAM)&item); - - psInfo->nPages++; - - /* If it is the only page - show it */ - if(psInfo->nPages == 1) - PROPSHEET_SetCurSel(hwndDlg, 0, 1, 0); - return TRUE; + return PROPSHEET_InsertPage(hwndDlg, (HPROPSHEETPAGE)psInfo->nPages, hpage); } /****************************************************************************** @@ -2484,11 +2433,95 @@ */ static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage) { - if (IS_INTRESOURCE(hpageInsertAfter)) - FIXME("(%p, %d, %p): stub\n", hwndDlg, LOWORD(hpageInsertAfter), hpage); - else - FIXME("(%p, %p, %p): stub\n", hwndDlg, hpageInsertAfter, hpage); - return FALSE; + PropPageInfo * ppi, * prev_ppi; + PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr); + HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL); + TCITEMW item; + LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)hpage; + int index, propPageInfoSize = sizeof(PropPageInfo); + + TRACE("hpageafter %p, hpage %p\n", hpageInsertAfter, hpage); + /* + * Check if hpageInsertAfter is resource or number. + */ + index = PROPSHEET_GetPageIndex(hpageInsertAfter, psInfo, -1); + if (index == -1) + // hpageInsertAfter not found + index = (int)hpageInsertAfter; + else + index++; + if (index > psInfo->nPages) + index = psInfo->nPages; + /* + * Allocate a new PropPageInfo entry. + */ + ppi = Alloc(propPageInfoSize * (psInfo->nPages + 1)); + if (!ppi) + return FALSE; + + prev_ppi = psInfo->proppage; + + /* + * Fill in a new PropPageInfo entry. + */ + if (index > 0) + memcpy(ppi, prev_ppi, index * propPageInfoSize); + memset(&ppi[index], 0, propPageInfoSize); + if (index < psInfo->nPages) + memcpy(&ppi[index+1], &prev_ppi[index], (psInfo->nPages - index) * propPageInfoSize); + + psInfo->proppage = ppi; + + if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, index, FALSE)) + { + psInfo->proppage = prev_ppi; + Free(ppi); + return FALSE; + } + + psInfo->proppage[index].hpage = hpage; + + psInfo->nPages++; + + if (ppsp->dwFlags & PSP_PREMATURE) + { + /* Create the page but don't show it */ + if(!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppsp)) + { + psInfo->nPages--; + psInfo->proppage = prev_ppi; + Free(ppi); + return FALSE; + } + } + Free(prev_ppi); + + /* + * Add a new tab to the tab control. + */ + item.mask = TCIF_TEXT; + item.pszText = (LPWSTR) psInfo->proppage[index].pszText; + item.cchTextMax = MAX_TABTEXT_LENGTH; + + if (psInfo->hImageList) + { + SendMessageW(hwndTabControl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList); + } + + if ( psInfo->proppage[index].hasIcon ) + { + item.mask |= TCIF_IMAGE; + item.iImage = index; + } + + SendMessageW(hwndTabControl, TCM_INSERTITEMW, index, + (LPARAM)&item); + + + /* If it is the only page - show it */ + if(psInfo->nPages == 1) + PROPSHEET_SetCurSel(hwndDlg, 0, 1, 0); + return TRUE; } /******************************************************************************