comctl32/propsheet: Added PSM_INSERTPAGE implementation.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Peter Hater 2017-02-12 21:16:31 +03:00 committed by Alexandre Julliard
parent 28d9215961
commit a6661ba9ad
2 changed files with 77 additions and 49 deletions

View File

@ -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,69 +2243,110 @@ 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
*/
@ -2460,18 +2500,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
*/

View File

@ -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);