[PATCH] comctl32/propsheet: Added PSM_INSERTPAGE implementation
Nikolay Sivov
nsivov at codeweavers.com
Sun Feb 12 12:16:31 CST 2017
From: Peter Hater <7element at mail.bg>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
Minor formatting changes from original patch.
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 f575e16853..caf71814f8 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 1c284ffeb6..7547e793e8 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.0
More information about the wine-patches
mailing list