From a6661ba9ad70dcde95272b48c8dba9d30005056f Mon Sep 17 00:00:00 2001 From: Peter Hater <7element@mail.bg> Date: Sun, 12 Feb 2017 21:16:31 +0300 Subject: [PATCH] comctl32/propsheet: Added PSM_INSERTPAGE implementation. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/comctl32/propsheet.c | 108 +++++++++++++++++++++++++--------------- dlls/comctl32/tests/propsheet.c | 18 +++---- 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index f575e16853e..caf71814f8c 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -32,7 +32,6 @@ * - Wizard 97 header resizing * - Enforcing of minimal wizard size * - Messages: - * o PSM_INSERTPAGE * o PSM_RECALCPAGESIZES * o PSM_SETHEADERSUBTITLE * o PSM_SETHEADERTITLE @@ -2244,70 +2243,111 @@ static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg, return msgResult; } - /****************************************************************************** - * PROPSHEET_AddPage + * PROPSHEET_InsertPage */ -static BOOL PROPSHEET_AddPage(HWND hwndDlg, - HPROPSHEETPAGE hpage) +static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage) { - PropPageInfo * ppi; - PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr); + PropSheetInfo *psInfo = GetPropW(hwndDlg, PropSheetInfoStr); + PropPageInfo *ppi, *prev_ppi = psInfo->proppage; HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL); - TCITEMW item; LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)hpage; + TCITEMW item; + int index; - TRACE("hpage %p\n", hpage); - /* - * Allocate and fill in a new PropPageInfo entry. - */ - ppi = ReAlloc(psInfo->proppage, sizeof(PropPageInfo) * (psInfo->nPages + 1)); + TRACE("hwndDlg %p, hpageInsertAfter %p, hpage %p\n", hwndDlg, hpageInsertAfter, hpage); + + if (IS_INTRESOURCE(hpageInsertAfter)) + index = LOWORD(hpageInsertAfter); + else + { + index = PROPSHEET_GetPageIndex(hpageInsertAfter, psInfo, -1); + if (index < 0) + { + TRACE("Could not find page to insert after!\n"); + return FALSE; + } + index++; + } + + if (index > psInfo->nPages) + index = psInfo->nPages; + + ppi = Alloc(sizeof(PropPageInfo) * (psInfo->nPages + 1)); if (!ppi) return FALSE; + /* + * Fill in a new PropPageInfo entry. + */ + if (index > 0) + memcpy(ppi, prev_ppi, index * sizeof(PropPageInfo)); + memset(&ppi[index], 0, sizeof(PropPageInfo)); + if (index < psInfo->nPages) + memcpy(&ppi[index + 1], &prev_ppi[index], (psInfo->nPages - index) * sizeof(PropPageInfo)); psInfo->proppage = ppi; - if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages, FALSE)) - return FALSE; - psInfo->proppage[psInfo->nPages].hpage = hpage; + if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, index, FALSE)) + { + psInfo->proppage = prev_ppi; + Free(ppi); + return FALSE; + } + + psInfo->proppage[index].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; + if (!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppsp)) + { + psInfo->proppage = prev_ppi; + Free(ppi); + return FALSE; + } } + Free(prev_ppi); + psInfo->nPages++; + if (index <= psInfo->active_page) + psInfo->active_page++; + /* * Add a new tab to the tab control. */ item.mask = TCIF_TEXT; - item.pszText = (LPWSTR) psInfo->proppage[psInfo->nPages].pszText; + 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[psInfo->nPages].hasIcon ) + if (psInfo->proppage[index].hasIcon) { item.mask |= TCIF_IMAGE; - item.iImage = psInfo->nPages; + item.iImage = index; } - SendMessageW(hwndTabControl, TCM_INSERTITEMW, psInfo->nPages + 1, - (LPARAM)&item); - - psInfo->nPages++; + SendMessageW(hwndTabControl, TCM_INSERTITEMW, index, (LPARAM)&item); /* If it is the only page - show it */ - if(psInfo->nPages == 1) + if (psInfo->nPages == 1) PROPSHEET_SetCurSel(hwndDlg, 0, 1, 0); + return TRUE; } /****************************************************************************** + * PROPSHEET_AddPage + */ +static BOOL PROPSHEET_AddPage(HWND hwndDlg, HPROPSHEETPAGE hpage) +{ + PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr); + TRACE("hwndDlg %p, hpage %p\n", hwndDlg, hpage); + return PROPSHEET_InsertPage(hwndDlg, UlongToPtr(psInfo->nPages), hpage); +} + +/****************************************************************************** * PROPSHEET_RemovePage */ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, @@ -2461,18 +2501,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags) } /****************************************************************************** - * PROPSHEET_InsertPage - */ -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; -} - -/****************************************************************************** * PROPSHEET_SetHeaderTitleW */ static void PROPSHEET_SetHeaderTitleW(HWND hwndDlg, int iPageIndex, LPCWSTR pszHeaderTitle) diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c index 1c284ffeb61..7547e793e8b 100644 --- a/dlls/comctl32/tests/propsheet.c +++ b/dlls/comctl32/tests/propsheet.c @@ -935,7 +935,7 @@ static void test_PSM_INSERTPAGE(void) /* add pages one by one */ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 5, (LPARAM)hpsp[1]); - todo_wine ok(ret == TRUE, "got %d\n", ret); + ok(ret == TRUE, "got %d\n", ret); /* try with invalid values */ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, 0); @@ -954,34 +954,34 @@ if (0) tab = (HWND)SendMessageA(hdlg, PSM_GETTABCONTROL, 0, 0); r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); - todo_wine ok(r == 2, "got %d\n", r); + ok(r == 2, "got %d\n", r); ret = SendMessageA(hdlg, PSM_INSERTPAGE, (WPARAM)hpsp[1], (LPARAM)hpsp[2]); - todo_wine ok(ret == TRUE, "got %d\n", ret); + ok(ret == TRUE, "got %d\n", ret); r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); - todo_wine ok(r == 3, "got %d\n", r); + ok(r == 3, "got %d\n", r); /* add property sheet page that can't be created */ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 1, (LPARAM)hpsp[3]); - todo_wine ok(ret == TRUE, "got %d\n", ret); + ok(ret == TRUE, "got %d\n", ret); r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); - todo_wine ok(r == 4, "got %d\n", r); + ok(r == 4, "got %d\n", r); /* select page that can't be created */ ret = SendMessageA(hdlg, PSM_SETCURSEL, 1, 0); - todo_wine ok(ret == TRUE, "got %d\n", ret); + ok(ret == TRUE, "got %d\n", ret); r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); - todo_wine ok(r == 3, "got %d\n", r); + ok(r == 3, "got %d\n", r); /* test PSP_PREMATURE flag with incorrect property sheet page */ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, (LPARAM)hpsp[4]); ok(ret == FALSE, "got %d\n", ret); r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); - todo_wine ok(r == 3, "got %d\n", r); + ok(r == 3, "got %d\n", r); DestroyPropertySheetPage(hpsp[4]); DestroyWindow(hdlg); -- 2.11.4.GIT