Commit 08afc1a5 authored by Alexandre Julliard's avatar Alexandre Julliard

Serge Ivanov

Pierre Mageau Thy Nguyen Don Kelly Noomen Hamza Lots of bug fixes and new features in property sheets.
parent c69a80c3
...@@ -20,6 +20,7 @@ extern HMODULE COMCTL32_hModule; ...@@ -20,6 +20,7 @@ extern HMODULE COMCTL32_hModule;
#define IDC_FINISH_BUTTON 12325 #define IDC_FINISH_BUTTON 12325
#define IDC_SUNKEN_LINE 12326 #define IDC_SUNKEN_LINE 12326
#define IDS_CLOSE 4160
/* Toolbar customization dialog */ /* Toolbar customization dialog */
#define IDD_TBCUSTOMIZE 200 #define IDD_TBCUSTOMIZE 200
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include "winbase.h" #include "winbase.h"
#include "commctrl.h" #include "commctrl.h"
#include "prsht.h" #include "prsht.h"
#include "dialog.h"
#include "win.h"
#include "winnls.h" #include "winnls.h"
#include "comctl32.h" #include "comctl32.h"
#include "debugtools.h" #include "debugtools.h"
...@@ -33,13 +35,13 @@ typedef struct ...@@ -33,13 +35,13 @@ typedef struct
typedef struct tagPropPageInfo typedef struct tagPropPageInfo
{ {
int index; /* corresponds to the index in ppshheader->ppsp */
HPROPSHEETPAGE hpage; /* to keep track of pages not passed to PropertySheet */ HPROPSHEETPAGE hpage; /* to keep track of pages not passed to PropertySheet */
HWND hwndPage; HWND hwndPage;
BOOL isDirty; BOOL isDirty;
LPCWSTR pszText; LPCWSTR pszText;
BOOL hasHelp; BOOL hasHelp;
BOOL useCallback; BOOL useCallback;
BOOL hasIcon;
} PropPageInfo; } PropPageInfo;
typedef struct tagPropSheetInfo typedef struct tagPropSheetInfo
...@@ -47,13 +49,14 @@ typedef struct tagPropSheetInfo ...@@ -47,13 +49,14 @@ typedef struct tagPropSheetInfo
LPSTR strPropertiesFor; LPSTR strPropertiesFor;
int nPages; int nPages;
int active_page; int active_page;
LPCPROPSHEETHEADERA ppshheader; LPPROPSHEETHEADERA ppshheader;
BOOL isModeless; BOOL isModeless;
BOOL hasHelp; BOOL hasHelp;
BOOL hasApply; BOOL hasApply;
BOOL useCallback; BOOL useCallback;
BOOL restartWindows; BOOL restartWindows;
BOOL rebootSystem; BOOL rebootSystem;
BOOL activeValid;
PropPageInfo* proppage; PropPageInfo* proppage;
int x; int x;
int y; int y;
...@@ -76,6 +79,7 @@ const char * PropSheetInfoStr = "PropertySheetInfo"; ...@@ -76,6 +79,7 @@ const char * PropSheetInfoStr = "PropertySheetInfo";
#define MAX_CAPTION_LENGTH 255 #define MAX_CAPTION_LENGTH 255
#define MAX_TABTEXT_LENGTH 255 #define MAX_TABTEXT_LENGTH 255
#define MAX_BUTTONTEXT_LENGTH 64
/****************************************************************************** /******************************************************************************
* Prototypes * Prototypes
...@@ -93,15 +97,14 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, ...@@ -93,15 +97,14 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
PropSheetInfo * psInfo); PropSheetInfo * psInfo);
static int PROPSHEET_CreatePage(HWND hwndParent, int index, static int PROPSHEET_CreatePage(HWND hwndParent, int index,
const PropSheetInfo * psInfo, const PropSheetInfo * psInfo,
LPCPROPSHEETPAGEA ppshpage, LPCPROPSHEETPAGEA ppshpage);
BOOL showPage);
static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo); static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo);
static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg); static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg);
static BOOL PROPSHEET_Back(HWND hwndDlg); static BOOL PROPSHEET_Back(HWND hwndDlg);
static BOOL PROPSHEET_Next(HWND hwndDlg); static BOOL PROPSHEET_Next(HWND hwndDlg);
static BOOL PROPSHEET_Finish(HWND hwndDlg); static BOOL PROPSHEET_Finish(HWND hwndDlg);
static BOOL PROPSHEET_Apply(HWND hwndDlg); static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam);
static void PROPSHEET_Cancel(HWND hwndDlg); static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam);
static void PROPSHEET_Help(HWND hwndDlg); static void PROPSHEET_Help(HWND hwndDlg);
static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage); static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage);
static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage); static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage);
...@@ -114,8 +117,6 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, ...@@ -114,8 +117,6 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
HPROPSHEETPAGE hpage); HPROPSHEETPAGE hpage);
static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg, static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
WPARAM wParam, LPARAM lParam); WPARAM wParam, LPARAM lParam);
static LPCPROPSHEETPAGEA PROPSHEET_GetPSPPage(const PropSheetInfo * psInfo,
int index);
static BOOL PROPSHEET_AddPage(HWND hwndDlg, static BOOL PROPSHEET_AddPage(HWND hwndDlg,
HPROPSHEETPAGE hpage); HPROPSHEETPAGE hpage);
...@@ -126,6 +127,8 @@ static void PROPSHEET_CleanUp(); ...@@ -126,6 +127,8 @@ static void PROPSHEET_CleanUp();
static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo); static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo);
static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags); static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags);
static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg); static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg);
static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg);
static INT PROPSHEET_DoDialogBox( HWND hwnd, HWND owner);
BOOL WINAPI BOOL WINAPI
PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
...@@ -146,7 +149,14 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh, ...@@ -146,7 +149,14 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
psInfo->hasApply = !(dwFlags & PSH_NOAPPLYNOW); psInfo->hasApply = !(dwFlags & PSH_NOAPPLYNOW);
psInfo->useCallback = dwFlags & PSH_USECALLBACK; psInfo->useCallback = dwFlags & PSH_USECALLBACK;
psInfo->isModeless = dwFlags & PSH_MODELESS; psInfo->isModeless = dwFlags & PSH_MODELESS;
psInfo->ppshheader = lppsh;
psInfo->ppshheader = COMCTL32_Alloc(sizeof(PROPSHEETHEADERA));
*psInfo->ppshheader = *lppsh;
if (HIWORD(lppsh->pszCaption))
psInfo->ppshheader->pszCaption = HEAP_strdupA( GetProcessHeap(),
0, lppsh->pszCaption );
psInfo->nPages = lppsh->nPages; psInfo->nPages = lppsh->nPages;
if (dwFlags & PSH_USEPSTARTPAGE) if (dwFlags & PSH_USEPSTARTPAGE)
...@@ -157,9 +167,13 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh, ...@@ -157,9 +167,13 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
else else
psInfo->active_page = lppsh->u2.nStartPage; psInfo->active_page = lppsh->u2.nStartPage;
if (psInfo->active_page < 0 || psInfo->active_page >= psInfo->nPages)
psInfo->active_page = 0;
psInfo->restartWindows = FALSE; psInfo->restartWindows = FALSE;
psInfo->rebootSystem = FALSE; psInfo->rebootSystem = FALSE;
psInfo->hImageList = 0; psInfo->hImageList = 0;
psInfo->activeValid = FALSE;
return TRUE; return TRUE;
} }
...@@ -179,8 +193,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp, ...@@ -179,8 +193,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
DWORD dwFlags; DWORD dwFlags;
int width, height; int width, height;
if (psInfo->ppshheader->dwFlags & PSH_PROPSHEETPAGE) psInfo->proppage[index].hpage = (HPROPSHEETPAGE)lppsp;
psInfo->proppage[index].hpage = 0;
psInfo->proppage[index].hwndPage = 0; psInfo->proppage[index].hwndPage = 0;
psInfo->proppage[index].isDirty = FALSE; psInfo->proppage[index].isDirty = FALSE;
...@@ -190,6 +203,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp, ...@@ -190,6 +203,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
dwFlags = lppsp->dwFlags; dwFlags = lppsp->dwFlags;
psInfo->proppage[index].useCallback = dwFlags & PSP_USECALLBACK; psInfo->proppage[index].useCallback = dwFlags & PSP_USECALLBACK;
psInfo->proppage[index].hasHelp = dwFlags & PSP_HASHELP; psInfo->proppage[index].hasHelp = dwFlags & PSP_HASHELP;
psInfo->proppage[index].hasIcon = dwFlags & (PSP_USEHICON | PSP_USEICONID);
/* as soon as we have a page with the help flag, set the sheet flag on */ /* as soon as we have a page with the help flag, set the sheet flag on */
if (psInfo->proppage[index].hasHelp) if (psInfo->proppage[index].hasHelp)
...@@ -312,16 +326,59 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp, ...@@ -312,16 +326,59 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
else else
hIcon = lppsp->u2.hIcon; hIcon = lppsp->u2.hIcon;
if (psInfo->hImageList == 0) if ( hIcon )
{
if (psInfo->hImageList == 0 )
psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1); psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1);
ImageList_AddIcon(psInfo->hImageList, hIcon); ImageList_AddIcon(psInfo->hImageList, hIcon);
} }
}
return TRUE; return TRUE;
} }
/****************************************************************************** /******************************************************************************
* PROPSHEET_DoDialogBox
*
* Copied from windows/dialog.c:DIALOG_DoDialogBox
*/
static INT PROPSHEET_DoDialogBox( HWND hwnd, HWND owner)
{
WND * wndPtr;
DIALOGINFO * dlgInfo;
MSG msg;
INT retval;
/* Owner must be a top-level window */
owner = WIN_GetTopParent( owner );
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
if (!dlgInfo->flags & DF_END) /* was EndDialog called in WM_INITDIALOG ? */
{
EnableWindow( owner, FALSE );
ShowWindow( hwnd, SW_SHOW );
while (GetMessageA(&msg, 0, 0, 0))
{
if (!PROPSHEET_IsDialogMessage( hwnd, &msg))
{
TranslateMessage( &msg );
DispatchMessageA( &msg );
}
if (dlgInfo->flags & DF_END) break;
}
EnableWindow( owner, TRUE );
}
retval = dlgInfo->idResult;
WIN_ReleaseWndPtr(wndPtr);
DestroyWindow( hwnd );
return retval;
}
/******************************************************************************
* PROPSHEET_CreateDialog * PROPSHEET_CreateDialog
* *
* Creates the actual property sheet. * Creates the actual property sheet.
...@@ -361,18 +418,14 @@ BOOL PROPSHEET_CreateDialog(PropSheetInfo* psInfo) ...@@ -361,18 +418,14 @@ BOOL PROPSHEET_CreateDialog(PropSheetInfo* psInfo)
if (psInfo->useCallback) if (psInfo->useCallback)
(*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp); (*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
if (psInfo->ppshheader->dwFlags & PSH_MODELESS)
ret = CreateDialogIndirectParamA(psInfo->ppshheader->hInstance, ret = CreateDialogIndirectParamA(psInfo->ppshheader->hInstance,
(LPDLGTEMPLATEA) temp, (LPDLGTEMPLATEA) temp,
psInfo->ppshheader->hwndParent, psInfo->ppshheader->hwndParent,
(DLGPROC) PROPSHEET_DialogProc, (DLGPROC) PROPSHEET_DialogProc,
(LPARAM)psInfo); (LPARAM)psInfo);
else
ret = DialogBoxIndirectParamA(psInfo->ppshheader->hInstance, if (!(psInfo->ppshheader->dwFlags & PSH_MODELESS))
(LPDLGTEMPLATEA) temp, ret = PROPSHEET_DoDialogBox((HWND)ret, psInfo->ppshheader->hwndParent);
psInfo->ppshheader->hwndParent,
(DLGPROC) PROPSHEET_DialogProc,
(LPARAM)psInfo);
COMCTL32_Free(temp); COMCTL32_Free(temp);
...@@ -846,6 +899,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, ...@@ -846,6 +899,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL); HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
TCITEMA item; TCITEMA item;
int i, nTabs; int i, nTabs;
int iImage = 0;
char tabtext[MAX_TABTEXT_LENGTH] = "Tab text"; char tabtext[MAX_TABTEXT_LENGTH] = "Tab text";
item.mask = TCIF_TEXT; item.mask = TCIF_TEXT;
...@@ -859,13 +913,20 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, ...@@ -859,13 +913,20 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
*/ */
if (psInfo->hImageList) if (psInfo->hImageList)
{ {
item.mask |= TCIF_IMAGE;
SendMessageA(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList); SendMessageA(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
} }
for (i = 0; i < nTabs; i++) for (i = 0; i < nTabs; i++)
{ {
item.iImage = i; if ( psInfo->proppage[i].hasIcon )
{
item.mask |= TCIF_IMAGE;
item.iImage = iImage++;
}
else
{
item.mask &= ~TCIF_IMAGE;
}
WideCharToMultiByte(CP_ACP, 0, WideCharToMultiByte(CP_ACP, 0,
(LPCWSTR)psInfo->proppage[i].pszText, (LPCWSTR)psInfo->proppage[i].pszText,
...@@ -885,8 +946,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, ...@@ -885,8 +946,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
static int PROPSHEET_CreatePage(HWND hwndParent, static int PROPSHEET_CreatePage(HWND hwndParent,
int index, int index,
const PropSheetInfo * psInfo, const PropSheetInfo * psInfo,
LPCPROPSHEETPAGEA ppshpage, LPCPROPSHEETPAGEA ppshpage)
BOOL showPage)
{ {
DLGTEMPLATE* pTemplate; DLGTEMPLATE* pTemplate;
HWND hwndPage; HWND hwndPage;
...@@ -909,21 +969,23 @@ static int PROPSHEET_CreatePage(HWND hwndParent, ...@@ -909,21 +969,23 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF) if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
{ {
((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD; ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD | DS_CONTROL;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~DS_MODALFRAME; ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~DS_MODALFRAME;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_CAPTION; ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_CAPTION;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_SYSMENU; ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_SYSMENU;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_POPUP; ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_POPUP;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_DISABLED; ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_DISABLED;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_VISIBLE;
} }
else else
{ {
pTemplate->style |= WS_CHILD; pTemplate->style |= WS_CHILD | DS_CONTROL;
pTemplate->style &= ~DS_MODALFRAME; pTemplate->style &= ~DS_MODALFRAME;
pTemplate->style &= ~WS_CAPTION; pTemplate->style &= ~WS_CAPTION;
pTemplate->style &= ~WS_SYSMENU; pTemplate->style &= ~WS_SYSMENU;
pTemplate->style &= ~WS_POPUP; pTemplate->style &= ~WS_POPUP;
pTemplate->style &= ~WS_DISABLED; pTemplate->style &= ~WS_DISABLED;
pTemplate->style &= ~WS_VISIBLE;
} }
if (psInfo->proppage[index].useCallback) if (psInfo->proppage[index].useCallback)
...@@ -964,23 +1026,6 @@ static int PROPSHEET_CreatePage(HWND hwndParent, ...@@ -964,23 +1026,6 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
rc.top + padding.y, rc.top + padding.y,
0, 0, SWP_NOSIZE); 0, 0, SWP_NOSIZE);
if (showPage)
{
NMHDR hdr;
hdr.hwndFrom = hwndParent;
hdr.code = PSN_SETACTIVE;
/*
* Send the notification before showing the page.
*/
SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
ShowWindow(hwndPage, SW_SHOW);
}
else
ShowWindow(hwndPage, SW_HIDE);
return TRUE; return TRUE;
} }
...@@ -992,19 +1037,50 @@ static int PROPSHEET_CreatePage(HWND hwndParent, ...@@ -992,19 +1037,50 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo) static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
{ {
if (index == psInfo->active_page) if (index == psInfo->active_page)
{
if (GetTopWindow(hwndDlg) != psInfo->proppage[index].hwndPage)
SetWindowPos(psInfo->proppage[index].hwndPage, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
return TRUE; return TRUE;
}
if (psInfo->active_page != -1)
ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE); ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE);
if (psInfo->proppage[index].hwndPage != 0) if (psInfo->proppage[index].hwndPage == 0)
{
LPCPROPSHEETPAGEA ppshpage;
PSHNOTIFY psn;
ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[index].hpage;
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.code = PSN_SETACTIVE;
psn.hdr.idFrom = 0;
psn.lParam = 0;
/* Send the notification before showing the page. */
SendMessageA(psInfo->proppage[index].hwndPage,
WM_NOTIFY, 0, (LPARAM) &psn);
/*
* TODO: check return value.
*/
}
ShowWindow(psInfo->proppage[index].hwndPage, SW_SHOW); ShowWindow(psInfo->proppage[index].hwndPage, SW_SHOW);
else
if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
{ {
LPCPROPSHEETPAGEA ppshpage = PROPSHEET_GetPSPPage(psInfo, index); HWND hwndTabCtrl;
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage, TRUE);
/* Synchronize current selection with tab control */
hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
SendMessageA(hwndTabCtrl, TCM_SETCURSEL, index, 0);
} }
psInfo->active_page = index; psInfo->active_page = index;
psInfo->activeValid = TRUE;
return TRUE; return TRUE;
} }
...@@ -1015,32 +1091,32 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo) ...@@ -1015,32 +1091,32 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
static BOOL PROPSHEET_Back(HWND hwndDlg) static BOOL PROPSHEET_Back(HWND hwndDlg)
{ {
BOOL res; BOOL res;
NMHDR hdr; PSHNOTIFY psn;
HWND hwndPage; HWND hwndPage;
HWND hwndBack = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
if (psInfo->active_page <= 0) if (psInfo->active_page < 0)
return FALSE; return FALSE;
hdr.hwndFrom = hwndDlg; psn.hdr.code = PSN_WIZBACK;
hdr.code = PSN_WIZBACK; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr) == -1) if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) == -1)
return FALSE; return FALSE;
if (psInfo->active_page > 0)
{
res = PROPSHEET_CanSetCurSel(hwndDlg); res = PROPSHEET_CanSetCurSel(hwndDlg);
if(res != FALSE) if(res != FALSE)
{ {
res = PROPSHEET_SetCurSel(hwndDlg, psInfo->active_page - 1, 0); res = PROPSHEET_SetCurSel(hwndDlg, psInfo->active_page - 1, 0);
} }
}
/* if we went to page 0, disable Back button */
if (res && (psInfo->active_page == 0))
EnableWindow(hwndBack, FALSE);
return TRUE; return TRUE;
} }
...@@ -1050,21 +1126,23 @@ static BOOL PROPSHEET_Back(HWND hwndDlg) ...@@ -1050,21 +1126,23 @@ static BOOL PROPSHEET_Back(HWND hwndDlg)
*/ */
static BOOL PROPSHEET_Next(HWND hwndDlg) static BOOL PROPSHEET_Next(HWND hwndDlg)
{ {
NMHDR hdr; PSHNOTIFY psn;
HWND hwndPage; HWND hwndPage;
LRESULT msgResult = 0; LRESULT msgResult = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
if (psInfo->active_page < 0 || psInfo->active_page == psInfo->nPages - 1) if (psInfo->active_page < 0)
return FALSE; return FALSE;
hdr.hwndFrom = hwndDlg; psn.hdr.code = PSN_WIZNEXT;
hdr.code = PSN_WIZNEXT; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr); msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
TRACE("msg result %ld\n", msgResult); TRACE("msg result %ld\n", msgResult);
...@@ -1084,7 +1162,7 @@ static BOOL PROPSHEET_Next(HWND hwndDlg) ...@@ -1084,7 +1162,7 @@ static BOOL PROPSHEET_Next(HWND hwndDlg)
*/ */
static BOOL PROPSHEET_Finish(HWND hwndDlg) static BOOL PROPSHEET_Finish(HWND hwndDlg)
{ {
NMHDR hdr; PSHNOTIFY psn;
HWND hwndPage; HWND hwndPage;
LRESULT msgResult = 0; LRESULT msgResult = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
...@@ -1093,12 +1171,14 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg) ...@@ -1093,12 +1171,14 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
if (psInfo->active_page < 0) if (psInfo->active_page < 0)
return FALSE; return FALSE;
hdr.hwndFrom = hwndDlg; psn.hdr.code = PSN_WIZFINISH;
hdr.code = PSN_WIZFINISH; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr); msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
TRACE("msg result %ld\n", msgResult); TRACE("msg result %ld\n", msgResult);
...@@ -1106,7 +1186,7 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg) ...@@ -1106,7 +1186,7 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
return FALSE; return FALSE;
if (psInfo->isModeless) if (psInfo->isModeless)
psInfo->active_page = -1; psInfo->activeValid = FALSE;
else else
EndDialog(hwndDlg, TRUE); EndDialog(hwndDlg, TRUE);
...@@ -1116,11 +1196,11 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg) ...@@ -1116,11 +1196,11 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
/****************************************************************************** /******************************************************************************
* PROPSHEET_Apply * PROPSHEET_Apply
*/ */
static BOOL PROPSHEET_Apply(HWND hwndDlg) static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam)
{ {
int i; int i;
NMHDR hdr;
HWND hwndPage; HWND hwndPage;
PSHNOTIFY psn;
LRESULT msgResult; LRESULT msgResult;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
...@@ -1128,31 +1208,49 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg) ...@@ -1128,31 +1208,49 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg)
if (psInfo->active_page < 0) if (psInfo->active_page < 0)
return FALSE; return FALSE;
hdr.hwndFrom = hwndDlg; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
/* /*
* Send PSN_KILLACTIVE to the current page. * Send PSN_KILLACTIVE to the current page.
*/ */
hdr.code = PSN_KILLACTIVE; psn.hdr.code = PSN_KILLACTIVE;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr) != FALSE) if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) != FALSE)
return FALSE; return FALSE;
/* /*
* Send PSN_APPLY to all pages. * Send PSN_APPLY to all pages.
*/ */
hdr.code = PSN_APPLY; psn.hdr.code = PSN_APPLY;
psn.lParam = lParam;
for (i = 0; i < psInfo->nPages; i++) for (i = 0; i < psInfo->nPages; i++)
{ {
hwndPage = psInfo->proppage[i].hwndPage; hwndPage = psInfo->proppage[i].hwndPage;
msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr); if (hwndPage)
{
msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
if (msgResult == PSNRET_INVALID_NOCHANGEPAGE) if (msgResult == PSNRET_INVALID_NOCHANGEPAGE)
return FALSE; return FALSE;
} }
}
if(lParam)
{
psInfo->activeValid = FALSE;
}
else if(psInfo->active_page >= 0)
{
psn.hdr.code = PSN_SETACTIVE;
psn.lParam = 0;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
}
return TRUE; return TRUE;
} }
...@@ -1160,29 +1258,42 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg) ...@@ -1160,29 +1258,42 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg)
/****************************************************************************** /******************************************************************************
* PROPSHEET_Cancel * PROPSHEET_Cancel
*/ */
static void PROPSHEET_Cancel(HWND hwndDlg) static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam)
{ {
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
HWND hwndPage; HWND hwndPage;
NMHDR hdr; PSHNOTIFY psn;
int i;
if (psInfo->active_page < 0) if (psInfo->active_page < 0)
return; return;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
hdr.hwndFrom = hwndDlg; psn.hdr.code = PSN_QUERYCANCEL;
hdr.code = PSN_QUERYCANCEL; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr)) if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))
return; return;
hdr.code = PSN_RESET; psn.hdr.code = PSN_RESET;
psn.lParam = lParam;
SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr); for (i = 0; i < psInfo->nPages; i++)
{
hwndPage = psInfo->proppage[i].hwndPage;
if (hwndPage)
SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
}
if (psInfo->isModeless) if (psInfo->isModeless)
psInfo->active_page = -1; /* makes PSM_GETCURRENTPAGEHWND return NULL */ {
/* makes PSM_GETCURRENTPAGEHWND return NULL */
psInfo->activeValid = FALSE;
}
else else
EndDialog(hwndDlg, FALSE); EndDialog(hwndDlg, FALSE);
} }
...@@ -1195,16 +1306,18 @@ static void PROPSHEET_Help(HWND hwndDlg) ...@@ -1195,16 +1306,18 @@ static void PROPSHEET_Help(HWND hwndDlg)
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
HWND hwndPage; HWND hwndPage;
NMHDR hdr; PSHNOTIFY psn;
if (psInfo->active_page < 0) if (psInfo->active_page < 0)
return; return;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
hdr.hwndFrom = hwndDlg; psn.hdr.code = PSN_HELP;
hdr.code = PSN_HELP; psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr); SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
} }
/****************************************************************************** /******************************************************************************
...@@ -1319,19 +1432,24 @@ static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg) ...@@ -1319,19 +1432,24 @@ static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg)
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
HWND hwndPage; HWND hwndPage;
NMHDR hdr; PSHNOTIFY psn;
if (!psInfo || psInfo->active_page < 0) if (!psInfo)
return FALSE; return FALSE;
if (psInfo->active_page < 0)
return TRUE;
/* /*
* Notify the current page. * Notify the current page.
*/ */
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
psn.hdr.code = PSN_KILLACTIVE;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
hdr.hwndFrom = hwndDlg; return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
hdr.code = PSN_KILLACTIVE;
return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
} }
/****************************************************************************** /******************************************************************************
...@@ -1345,17 +1463,8 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, ...@@ -1345,17 +1463,8 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
HWND hwndPage; HWND hwndPage;
HWND hwndHelp = GetDlgItem(hwndDlg, IDHELP); HWND hwndHelp = GetDlgItem(hwndDlg, IDHELP);
NMHDR hdr;
if (psInfo->active_page < 0)
return FALSE;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; /* hpage takes precedence over index */
hdr.hwndFrom = hwndDlg;
/*
* hpage takes precedence over index.
*/
if (hpage != NULL) if (hpage != NULL)
index = PROPSHEET_GetPageIndex(hpage, psInfo); index = PROPSHEET_GetPageIndex(hpage, psInfo);
...@@ -1374,9 +1483,15 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, ...@@ -1374,9 +1483,15 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
if (hwndPage) if (hwndPage)
{ {
int result; int result;
hdr.code = PSN_SETACTIVE; PSHNOTIFY psn;
psn.hdr.code = PSN_SETACTIVE;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
result = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
result = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
/* /*
* TODO: check return value. * TODO: check return value.
*/ */
...@@ -1472,32 +1587,6 @@ static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg, ...@@ -1472,32 +1587,6 @@ static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
return msgResult; return msgResult;
} }
/******************************************************************************
* PROPSHEET_GetPSPPage
*/
static LPCPROPSHEETPAGEA PROPSHEET_GetPSPPage(const PropSheetInfo * psInfo,
int index)
{
BOOL usePSP = psInfo->ppshheader->dwFlags & PSH_PROPSHEETPAGE;
LPCPROPSHEETPAGEA lppsp;
int realIndex = psInfo->proppage[index].index;
if (usePSP)
{
BYTE* pByte;
lppsp = psInfo->ppshheader->u3.ppsp;
pByte = (BYTE*) lppsp;
pByte += (lppsp->dwSize * realIndex);
lppsp = (LPCPROPSHEETPAGEA)pByte;
}
else
lppsp = (LPCPROPSHEETPAGEA) psInfo->ppshheader->u3.phpage[realIndex];
return lppsp;
}
/****************************************************************************** /******************************************************************************
* PROPSHEET_AddPage * PROPSHEET_AddPage
...@@ -1520,13 +1609,13 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg, ...@@ -1520,13 +1609,13 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg,
(psInfo->nPages + 1)); (psInfo->nPages + 1));
PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages); PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages);
psInfo->proppage[psInfo->nPages].index = -1;
psInfo->proppage[psInfo->nPages].hpage = hpage; psInfo->proppage[psInfo->nPages].hpage = hpage;
/* if (ppsp->dwFlags & PSP_PREMATURE)
* Create the page but don't show it. {
*/ /* Create the page but don't show it */
PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp, FALSE); PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp);
}
/* /*
* Add a new tab to the tab control. * Add a new tab to the tab control.
...@@ -1544,6 +1633,10 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg, ...@@ -1544,6 +1633,10 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg,
psInfo->nPages++; psInfo->nPages++;
/* If it is the only page - show it */
if(psInfo->nPages == 1)
PROPSHEET_ShowPage(hwndDlg, 0, psInfo);
return TRUE; return TRUE;
} }
...@@ -1560,7 +1653,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, ...@@ -1560,7 +1653,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
PropPageInfo* oldPages; PropPageInfo* oldPages;
if (!psInfo) { if (!psInfo) {
FIXME("No psInfo for propertysheet at windows 0x%04x, returning FALSE...\n", hwndDlg);
return FALSE; return FALSE;
} }
oldPages = psInfo->proppage; oldPages = psInfo->proppage;
...@@ -1601,26 +1693,31 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, ...@@ -1601,26 +1693,31 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
} }
else else
{ {
TRACE("Removing the only page, close the dialog!\n");
if (psInfo->isModeless)
psInfo->active_page = -1; psInfo->active_page = -1;
else if (!psInfo->isModeless)
{
EndDialog(hwndDlg, FALSE); EndDialog(hwndDlg, FALSE);
return TRUE; return TRUE;
} }
} }
}
if (index < psInfo->active_page) else if (index < psInfo->active_page)
psInfo->active_page--; psInfo->active_page--;
/* Destroy page dialog window. /* Destroy page dialog window */
* If it's last page in modal dialog, it has been destroyed by EndDialog
*/
if (psInfo->isModeless || psInfo->nPages > 1)
DestroyWindow(psInfo->proppage[index].hwndPage); DestroyWindow(psInfo->proppage[index].hwndPage);
/* Free page resources */
if(psInfo->proppage[index].hpage)
{
PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[index].hpage;
if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[index].pszText)
HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[index].pszText);
DestroyPropertySheetPage(psInfo->proppage[index].hpage);
}
/* Remove the tab */ /* Remove the tab */
SendMessageA(hwndTabControl, TCM_DELETEITEM, index, 0); SendMessageA(hwndTabControl, TCM_DELETEITEM, index, 0);
...@@ -1649,27 +1746,27 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, ...@@ -1649,27 +1746,27 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
*/ */
static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags) static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
{ {
HWND hwndButton; HWND hwndBack = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
HWND hwndNext = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
HWND hwndFinish = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
TRACE("%ld\n", dwFlags); TRACE("%ld\n", dwFlags);
EnableWindow(hwndBack, FALSE);
EnableWindow(hwndNext, FALSE);
EnableWindow(hwndFinish, FALSE);
if (dwFlags & PSWIZB_BACK) if (dwFlags & PSWIZB_BACK)
{ EnableWindow(hwndBack, TRUE);
hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
EnableWindow(hwndButton, TRUE);
}
if (dwFlags & PSWIZB_NEXT) if (dwFlags & PSWIZB_NEXT)
{ {
/* Hide the Finish button */ /* Hide the Finish button */
hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON); ShowWindow(hwndFinish, SW_HIDE);
ShowWindow(hwndButton, SW_HIDE);
/* Show and enable the Next button */ /* Show and enable the Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON); ShowWindow(hwndNext, SW_SHOW);
EnableWindow(hwndNext, TRUE);
ShowWindow(hwndButton, SW_SHOW);
EnableWindow(hwndButton, TRUE);
/* Set the Next button as the default pushbutton */ /* Set the Next button as the default pushbutton */
SendMessageA(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0); SendMessageA(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
...@@ -1678,17 +1775,13 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags) ...@@ -1678,17 +1775,13 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
if ((dwFlags & PSWIZB_FINISH) || (dwFlags & PSWIZB_DISABLEDFINISH)) if ((dwFlags & PSWIZB_FINISH) || (dwFlags & PSWIZB_DISABLEDFINISH))
{ {
/* Hide the Next button */ /* Hide the Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON); ShowWindow(hwndNext, SW_HIDE);
ShowWindow(hwndButton, SW_HIDE);
/* Show the Finish button */ /* Show the Finish button */
hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON); ShowWindow(hwndFinish, SW_SHOW);
ShowWindow(hwndButton, SW_SHOW);
if (dwFlags & PSWIZB_FINISH) if (dwFlags & PSWIZB_FINISH)
EnableWindow(hwndButton, TRUE); EnableWindow(hwndFinish, TRUE);
else
EnableWindow(hwndButton, FALSE);
/* Set the Finish button as the default pushbutton */ /* Set the Finish button as the default pushbutton */
SendMessageA(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0); SendMessageA(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
...@@ -1725,10 +1818,32 @@ static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo) ...@@ -1725,10 +1818,32 @@ static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo)
*/ */
static void PROPSHEET_CleanUp(HWND hwndDlg) static void PROPSHEET_CleanUp(HWND hwndDlg)
{ {
int i;
PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropA(hwndDlg, PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropA(hwndDlg,
PropSheetInfoStr); PropSheetInfoStr);
TRACE("\n"); TRACE("\n");
if (HIWORD(psInfo->ppshheader->pszCaption))
HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->ppshheader->pszCaption);
COMCTL32_Free((LPVOID)psInfo->ppshheader);
for (i = 0; i < psInfo->nPages; i++)
{
PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[i].hpage;
if(psInfo->proppage[i].hwndPage)
DestroyWindow(psInfo->proppage[i].hwndPage);
if(psp)
{
if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[i].pszText)
HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[i].pszText);
DestroyPropertySheetPage(psInfo->proppage[i].hpage);
}
}
COMCTL32_Free(psInfo->proppage); COMCTL32_Free(psInfo->proppage);
COMCTL32_Free(psInfo->strPropertiesFor); COMCTL32_Free(psInfo->strPropertiesFor);
ImageList_Destroy(psInfo->hImageList); ImageList_Destroy(psInfo->hImageList);
...@@ -1744,21 +1859,27 @@ INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh) ...@@ -1744,21 +1859,27 @@ INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh)
int bRet = 0; int bRet = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GlobalAlloc(GPTR, PropSheetInfo* psInfo = (PropSheetInfo*) GlobalAlloc(GPTR,
sizeof(PropSheetInfo)); sizeof(PropSheetInfo));
LPCPROPSHEETPAGEA lppsp;
int i; int i;
BYTE* pByte;
PROPSHEET_CollectSheetInfo(lppsh, psInfo); PROPSHEET_CollectSheetInfo(lppsh, psInfo);
psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) * psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) *
lppsh->nPages); lppsh->nPages);
pByte = (BYTE*) psInfo->ppshheader->u3.ppsp;
for (i = 0; i < lppsh->nPages; i++) for (i = 0; i < lppsh->nPages; i++)
{ {
psInfo->proppage[i].index = i;
if (!(lppsh->dwFlags & PSH_PROPSHEETPAGE)) if (!(lppsh->dwFlags & PSH_PROPSHEETPAGE))
psInfo->proppage[i].hpage = psInfo->ppshheader->u3.phpage[i]; psInfo->proppage[i].hpage = psInfo->ppshheader->u3.phpage[i];
lppsp = PROPSHEET_GetPSPPage(psInfo, i); else
PROPSHEET_CollectPageInfo(lppsp, psInfo, i); {
psInfo->proppage[i].hpage = CreatePropertySheetPageA((LPCPROPSHEETPAGEA)pByte);
pByte += ((LPPROPSHEETPAGEA)pByte)->dwSize;
}
PROPSHEET_CollectPageInfo((LPCPROPSHEETPAGEA)psInfo->proppage[i].hpage,
psInfo, i);
} }
bRet = PROPSHEET_CreateDialog(psInfo); bRet = PROPSHEET_CreateDialog(psInfo);
...@@ -1786,6 +1907,18 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( ...@@ -1786,6 +1907,18 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
*ppsp = *lpPropSheetPage; *ppsp = *lpPropSheetPage;
if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) && HIWORD( ppsp->u1.pszTemplate ) )
ppsp->u1.pszTemplate = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->u1.pszTemplate );
if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) )
ppsp->u2.pszIcon = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->u2.pszIcon );
if ((ppsp->dwFlags & PSP_USETITLE) && HIWORD( ppsp->pszTitle ))
ppsp->pszTitle = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->pszTitle );
else if ( !(ppsp->dwFlags & PSP_USETITLE) )
ppsp->pszTitle = NULL;
return (HPROPSHEETPAGE)ppsp; return (HPROPSHEETPAGE)ppsp;
} }
...@@ -1804,12 +1937,78 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage ...@@ -1804,12 +1937,78 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
*/ */
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage) BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
{ {
PROPSHEETPAGEA *psp = (PROPSHEETPAGEA *)hPropPage;
if (!psp)
return FALSE;
if ( !(psp->dwFlags & PSP_DLGINDIRECT) && HIWORD( psp->u1.pszTemplate ) )
HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u1.pszTemplate);
if ( (psp->dwFlags & PSP_USEICONID) && HIWORD( psp->u2.pszIcon ) )
HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u2.pszIcon);
if ((psp->dwFlags & PSP_USETITLE) && HIWORD( psp->pszTitle ))
HeapFree(GetProcessHeap(), 0, (LPVOID)psp->pszTitle);
COMCTL32_Free(hPropPage); COMCTL32_Free(hPropPage);
return TRUE; return TRUE;
} }
/****************************************************************************** /******************************************************************************
* PROPSHEET_IsDialogMessage
*/
static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd, PropSheetInfoStr);
if (!psInfo || (hwnd != lpMsg->hwnd && !IsChild(hwnd, lpMsg->hwnd)))
return FALSE;
if (lpMsg->message == WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0x8000))
{
int new_page = 0;
INT dlgCode = SendMessageA(lpMsg->hwnd, WM_GETDLGCODE, 0, (LPARAM)lpMsg);
if (!(dlgCode & DLGC_WANTMESSAGE))
{
switch (lpMsg->wParam)
{
case VK_TAB:
if (GetKeyState(VK_SHIFT) & 0x8000)
new_page = -1;
else
new_page = 1;
break;
case VK_NEXT: new_page = 1; break;
case VK_PRIOR: new_page = -1; break;
}
}
if (new_page)
{
if (PROPSHEET_CanSetCurSel(hwnd) != FALSE)
{
new_page += psInfo->active_page;
if (new_page < 0)
new_page = psInfo->nPages - 1;
else if (new_page >= psInfo->nPages)
new_page = 0;
PROPSHEET_SetCurSel(hwnd, new_page, 0);
}
return TRUE;
}
}
return IsDialogMessageA(hwnd, lpMsg);
}
/******************************************************************************
* PROPSHEET_DialogProc * PROPSHEET_DialogProc
*/ */
BOOL WINAPI BOOL WINAPI
...@@ -1823,6 +2022,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1823,6 +2022,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
char* strCaption = (char*)COMCTL32_Alloc(MAX_CAPTION_LENGTH); char* strCaption = (char*)COMCTL32_Alloc(MAX_CAPTION_LENGTH);
HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL); HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
LPCPROPSHEETPAGEA ppshpage; LPCPROPSHEETPAGEA ppshpage;
int idx;
SetPropA(hwnd, PropSheetInfoStr, (HANDLE)psInfo); SetPropA(hwnd, PropSheetInfoStr, (HANDLE)psInfo);
...@@ -1859,17 +2059,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1859,17 +2059,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (psInfo->ppshheader->dwFlags & PSH_WIZARD) if (psInfo->ppshheader->dwFlags & PSH_WIZARD)
{ {
HWND hwndBack = GetDlgItem(hwnd, IDC_BACK_BUTTON);
if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo)) if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo))
{ {
PROPSHEET_AdjustSizeWizard(hwnd, psInfo); PROPSHEET_AdjustSizeWizard(hwnd, psInfo);
PROPSHEET_AdjustButtonsWizard(hwnd, psInfo); PROPSHEET_AdjustButtonsWizard(hwnd, psInfo);
} }
/* Disable Back button if we start at page 0 */
if (psInfo->active_page == 0)
EnableWindow(hwndBack, FALSE);
} }
else else
{ {
...@@ -1884,8 +2078,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1884,8 +2078,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
(*(psInfo->ppshheader->pfnCallback))(hwnd, (*(psInfo->ppshheader->pfnCallback))(hwnd,
PSCB_INITIALIZED, (LPARAM)0); PSCB_INITIALIZED, (LPARAM)0);
ppshpage = PROPSHEET_GetPSPPage(psInfo, psInfo->active_page); idx = psInfo->active_page;
PROPSHEET_CreatePage(hwnd, psInfo->active_page, psInfo, ppshpage, TRUE); ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[idx].hpage;
psInfo->active_page = -1;
PROPSHEET_SetCurSel(hwnd, idx, psInfo->proppage[idx].hpage);
if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD)) if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
SendMessageA(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0); SendMessageA(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
...@@ -1913,7 +2110,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1913,7 +2110,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE; return TRUE;
case WM_CLOSE: case WM_CLOSE:
PROPSHEET_Cancel(hwnd); PROPSHEET_Cancel(hwnd, 1);
return TRUE; return TRUE;
case WM_COMMAND: case WM_COMMAND:
...@@ -1927,11 +2124,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1927,11 +2124,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON); HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
if (PROPSHEET_Apply(hwnd) == FALSE) if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
break; break;
EnableWindow(hwndApplyBtn, FALSE);
if (wID == IDOK) if (wID == IDOK)
{ {
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd, PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd,
...@@ -1946,10 +2141,12 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1946,10 +2141,12 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
result = ID_PSREBOOTSYSTEM; result = ID_PSREBOOTSYSTEM;
if (psInfo->isModeless) if (psInfo->isModeless)
psInfo->active_page = -1; psInfo->activeValid = FALSE;
else else
EndDialog(hwnd, result); EndDialog(hwnd, result);
} }
else
EnableWindow(hwndApplyBtn, FALSE);
break; break;
} }
...@@ -1967,7 +2164,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -1967,7 +2164,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break; break;
case IDCANCEL: case IDCANCEL:
PROPSHEET_Cancel(hwnd); PROPSHEET_Cancel(hwnd, 0);
break; break;
case IDHELP: case IDHELP:
...@@ -2005,7 +2202,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -2005,7 +2202,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
PropSheetInfoStr); PropSheetInfoStr);
HWND hwndPage = 0; HWND hwndPage = 0;
if (psInfo->active_page != -1) if (psInfo->activeValid && psInfo->active_page != -1)
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage; hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
SetWindowLongA(hwnd, DWL_MSGRESULT, hwndPage); SetWindowLongA(hwnd, DWL_MSGRESULT, hwndPage);
...@@ -2049,13 +2246,15 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -2049,13 +2246,15 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_CANCELTOCLOSE: case PSM_CANCELTOCLOSE:
{ {
char buf[MAX_BUTTONTEXT_LENGTH];
HWND hwndOK = GetDlgItem(hwnd, IDOK); HWND hwndOK = GetDlgItem(hwnd, IDOK);
HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL); HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
EnableWindow(hwndCancel, FALSE); EnableWindow(hwndCancel, FALSE);
SetWindowTextA(hwndOK, "Close"); /* FIXME: hardcoded string */ if (LoadStringA(COMCTL32_hModule, IDS_CLOSE, buf, sizeof(buf)))
SetWindowTextA(hwndOK, buf);
return TRUE; return FALSE;
} }
case PSM_RESTARTWINDOWS: case PSM_RESTARTWINDOWS:
...@@ -2082,7 +2281,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -2082,7 +2281,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_APPLY: case PSM_APPLY:
{ {
BOOL msgResult = PROPSHEET_Apply(hwnd); BOOL msgResult = PROPSHEET_Apply(hwnd, 0);
SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult); SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
...@@ -2121,8 +2320,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -2121,8 +2320,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_ISDIALOGMESSAGE: case PSM_ISDIALOGMESSAGE:
{ {
FIXME("Unimplemented msg PSM_ISDIALOGMESSAGE\n"); BOOL msgResult = PROPSHEET_IsDialogMessage(hwnd, (LPMSG)lParam);
return 0; SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
} }
case PSM_PRESSBUTTON: case PSM_PRESSBUTTON:
......
...@@ -10,8 +10,8 @@ BEGIN ...@@ -10,8 +10,8 @@ BEGIN
DEFPUSHBUTTON "OK", IDOK,72,138,50,14 DEFPUSHBUTTON "OK", IDOK,72,138,50,14
PUSHBUTTON "Cancel", IDCANCEL,127,138,50,14 PUSHBUTTON "Cancel", IDCANCEL,127,138,50,14
PUSHBUTTON "&Apply", IDC_APPLY_BUTTON,181,138,50,14 PUSHBUTTON "&Apply", IDC_APPLY_BUTTON,181,138,50,14
PUSHBUTTON "Help", IDHELP,235,138,50,14 PUSHBUTTON "Help", IDHELP,235,138,50,14,WS_TABSTOP|WS_GROUP
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS,7,7,278,125 CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_TABSTOP,7,7,278,125
END END
...@@ -24,7 +24,7 @@ BEGIN ...@@ -24,7 +24,7 @@ BEGIN
DEFPUSHBUTTON "&Next >", IDC_NEXT_BUTTON,121,138,50,14 DEFPUSHBUTTON "&Next >", IDC_NEXT_BUTTON,121,138,50,14
PUSHBUTTON "< &Back", IDC_BACK_BUTTON,71,138,50,14 PUSHBUTTON "< &Back", IDC_BACK_BUTTON,71,138,50,14
PUSHBUTTON "Cancel", IDCANCEL,178,138,50,14 PUSHBUTTON "Cancel", IDCANCEL,178,138,50,14
PUSHBUTTON "Help", IDHELP,235,138,50,14 PUSHBUTTON "Help", IDHELP,235,138,50,14,WS_GROUP
LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
END END
...@@ -96,6 +96,10 @@ IDT_CHECK BITMAP LOADONCALL DISCARDABLE ...@@ -96,6 +96,10 @@ IDT_CHECK BITMAP LOADONCALL DISCARDABLE
'0D 11 02 99 0E 11 01 99 00 00 1F 99 00 01' '0D 11 02 99 0E 11 01 99 00 00 1F 99 00 01'
} }
STRINGTABLE DISCARDABLE
{
IDS_CLOSE "Close"
}
IDB_STD_SMALL BITMAP LOADONCALL DISCARDABLE IDB_STD_SMALL BITMAP LOADONCALL DISCARDABLE
{ {
...@@ -398,89 +402,266 @@ IDB_STD_LARGE BITMAP LOADONCALL DISCARDABLE ...@@ -398,89 +402,266 @@ IDB_STD_LARGE BITMAP LOADONCALL DISCARDABLE
/* BINRES idb_view_small.bmp */ /* BINRES idb_view_small.bmp */
IDB_VIEW_SMALL BITMAP LOADONCALL DISCARDABLE IDB_VIEW_SMALL BITMAP LOADONCALL DISCARDABLE
{ {
'42 4D 2A 05 00 00 00 00 00 00 76 00 00 00 28 00' '42 4D 36 10 00 00 00 00 00 00 36 04 00 00 28 00'
'00 00 C0 00 00 00 10 00 00 00 01 00 04 00 02 00' '00 00 C0 00 00 00 10 00 00 00 01 00 08 00 00 00'
'00 00 B4 04 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 00'
'00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80' '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
'00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF' '00 00 C0 C0 C0 00 C0 DC C0 00 F0 CA A6 00 04 04'
'04 00 08 08 08 00 0C 0C 0C 00 11 11 11 00 16 16'
'16 00 1C 1C 1C 00 22 22 22 00 29 29 29 00 55 55'
'55 00 4D 4D 4D 00 42 42 42 00 39 39 39 00 80 7C'
'FF 00 50 50 FF 00 93 00 D6 00 FF EC CC 00 C6 D6'
'EF 00 D6 E7 E7 00 90 A9 AD 00 00 00 33 00 00 00'
'66 00 00 00 99 00 00 00 CC 00 00 33 00 00 00 33'
'33 00 00 33 66 00 00 33 99 00 00 33 CC 00 00 33'
'FF 00 00 66 00 00 00 66 33 00 00 66 66 00 00 66'
'99 00 00 66 CC 00 00 66 FF 00 00 99 00 00 00 99'
'33 00 00 99 66 00 00 99 99 00 00 99 CC 00 00 99'
'FF 00 00 CC 00 00 00 CC 33 00 00 CC 66 00 00 CC'
'99 00 00 CC CC 00 00 CC FF 00 00 FF 66 00 00 FF'
'99 00 00 FF CC 00 33 00 00 00 33 00 33 00 33 00'
'66 00 33 00 99 00 33 00 CC 00 33 00 FF 00 33 33'
'00 00 33 33 33 00 33 33 66 00 33 33 99 00 33 33'
'CC 00 33 33 FF 00 33 66 00 00 33 66 33 00 33 66'
'66 00 33 66 99 00 33 66 CC 00 33 66 FF 00 33 99'
'00 00 33 99 33 00 33 99 66 00 33 99 99 00 33 99'
'CC 00 33 99 FF 00 33 CC 00 00 33 CC 33 00 33 CC'
'66 00 33 CC 99 00 33 CC CC 00 33 CC FF 00 33 FF'
'33 00 33 FF 66 00 33 FF 99 00 33 FF CC 00 33 FF'
'FF 00 66 00 00 00 66 00 33 00 66 00 66 00 66 00'
'99 00 66 00 CC 00 66 00 FF 00 66 33 00 00 66 33'
'33 00 66 33 66 00 66 33 99 00 66 33 CC 00 66 33'
'FF 00 66 66 00 00 66 66 33 00 66 66 66 00 66 66'
'99 00 66 66 CC 00 66 99 00 00 66 99 33 00 66 99'
'66 00 66 99 99 00 66 99 CC 00 66 99 FF 00 66 CC'
'00 00 66 CC 33 00 66 CC 99 00 66 CC CC 00 66 CC'
'FF 00 66 FF 00 00 66 FF 33 00 66 FF 99 00 66 FF'
'CC 00 CC 00 FF 00 FF 00 CC 00 99 99 00 00 99 33'
'99 00 99 00 99 00 99 00 CC 00 99 00 00 00 99 33'
'33 00 99 00 66 00 99 33 CC 00 99 00 FF 00 99 66'
'00 00 99 66 33 00 99 33 66 00 99 66 99 00 99 66'
'CC 00 99 33 FF 00 99 99 33 00 99 99 66 00 99 99'
'99 00 99 99 CC 00 99 99 FF 00 99 CC 00 00 99 CC'
'33 00 66 CC 66 00 99 CC 99 00 99 CC CC 00 99 CC'
'FF 00 99 FF 00 00 99 FF 33 00 99 CC 66 00 99 FF'
'99 00 99 FF CC 00 99 FF FF 00 CC 00 00 00 99 00'
'33 00 CC 00 66 00 CC 00 99 00 CC 00 CC 00 99 33'
'00 00 CC 33 33 00 CC 33 66 00 CC 33 99 00 CC 33'
'CC 00 CC 33 FF 00 CC 66 00 00 CC 66 33 00 99 66'
'66 00 CC 66 99 00 CC 66 CC 00 99 66 FF 00 CC 99'
'00 00 CC 99 33 00 CC 99 66 00 CC 99 99 00 CC 99'
'CC 00 CC 99 FF 00 CC CC 00 00 CC CC 33 00 CC CC'
'66 00 CC CC 99 00 CC CC CC 00 CC CC FF 00 CC FF'
'00 00 CC FF 33 00 99 FF 66 00 CC FF 99 00 CC FF'
'CC 00 CC FF FF 00 CC 00 33 00 FF 00 66 00 FF 00'
'99 00 CC 33 00 00 FF 33 33 00 FF 33 66 00 FF 33'
'99 00 FF 33 CC 00 FF 33 FF 00 FF 66 00 00 FF 66'
'33 00 CC 66 66 00 FF 66 99 00 FF 66 CC 00 CC 66'
'FF 00 FF 99 00 00 FF 99 33 00 FF 99 66 00 FF 99'
'99 00 FF 99 CC 00 FF 99 FF 00 FF CC 00 00 FF CC'
'33 00 FF CC 66 00 FF CC 99 00 FF CC CC 00 FF CC'
'FF 00 FF FF 33 00 CC FF 66 00 FF FF 99 00 FF FF'
'CC 00 66 66 FF 00 66 FF 66 00 66 FF FF 00 FF 66'
'66 00 FF 66 FF 00 FF FF 66 00 21 00 A5 00 5F 5F'
'5F 00 77 77 77 00 86 86 86 00 96 96 96 00 CB CB'
'CB 00 B2 B2 B2 00 D7 D7 D7 00 DD DD DD 00 E3 E3'
'E3 00 EA EA EA 00 F1 F1 F1 00 F8 F8 F8 00 F0 FB'
'FF 00 A4 A0 A0 00 80 80 80 00 00 00 FF 00 00 FF'
'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
'00 00 FF FF FF 00 C0 77 00 00 08 77 02 70 04 00' '00 00 FF FF FF 00 07 07 07 07 07 07 07 07 07 07'
'00 08 07 77 74 44 0A 77 00 04 44 47 04 77 00 04' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'44 47 04 77 00 18 47 70 00 07 00 07 00 07 77 74' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'44 47 04 77 00 04 71 77 08 44 00 06 47 77 71 00' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'0E 77 02 71 0E 77 02 71 14 77 02 70 0C 00 02 77' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'0E 70 0A 00 02 07 04 77 00 00 12 77 00 08 74 F4' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'70 00 06 77 00 10 4F 47 00 07 4F 47 00 07 12 77' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'00 06 44 77 44 00 04 77 00 06 11 17 4F 00 06 FF' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'00 08 47 77 11 17 0C 77 00 04 11 17 08 00 04 77' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'00 04 11 17 0E 00 00 08 07 77 70 78 08 88 02 80' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'10 77 02 0B 08 FB 02 07 04 77 00 00 0A 77 04 44' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'04 77 00 04 74 47 0A 77 02 44 06 77 02 44 06 77' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'00 14 47 70 00 07 00 07 00 07 77 44 06 77 02 71' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 00'
'04 11 02 4F 06 FF 00 04 47 71 04 11 0A 77 02 71' '00 00 00 00 00 07 07 07 07 04 04 04 07 07 07 07'
'04 11 02 0F 04 FF 00 06 F0 77 71 00 04 11 02 0F' '07 07 07 07 07 07 07 07 00 00 00 07 07 07 07 07'
'0C BF 00 06 07 77 70 00 0A 77 00 08 80 77 70 77' '07 07 07 07 07 07 07 00 00 07 07 07 07 07 07 07'
'08 07 00 04 70 0F 08 BF 02 07 04 77 00 00 0A 77' '07 07 07 07 07 07 07 07 07 04 04 04 04 07 07 07'
'00 04 4F F4 34 77 06 44 04 77 00 06 71 77 4F 00' '07 07 07 01 07 07 04 04 04 04 04 04 04 04 04 07'
'06 FF 00 0A 47 77 71 77 70 00 08 00 00 08 77 71' '07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 07'
'77 0F 04 FF 02 F0 04 77 00 06 71 77 0B 00 0C FB' '07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 07'
'00 08 07 77 70 78 08 88 02 80 10 77 02 0B 08 FB' '07 07 07 01 07 07 07 07 92 92 92 92 92 92 92 92'
'02 07 04 77 00 00 0A 77 00 04 4F F4 22 77 00 18' '92 92 92 92 92 07 07 07 07 00 00 00 00 00 00 00'
'47 70 00 07 00 07 00 07 77 44 77 44 04 77 00 06' '00 00 00 00 00 00 07 07 07 00 07 00 07 00 07 00'
'71 77 4F 00 06 FF 00 08 47 77 71 77 08 44 00 0A' '07 00 07 00 07 00 07 07 6D 6D 6D 6D 6D 6D 6D 6D'
'40 77 71 77 0F 00 04 FF 00 10 F0 44 47 71 77 0F' '6D 6D 6D 6D 6D 07 07 07 07 07 07 07 07 07 07 07'
'BF B0 04 00 00 0A 0F BF 07 77 70 00 0A 77 00 08' '07 07 07 07 07 07 07 07 07 04 FF 04 07 00 00 00'
'80 77 70 77 08 07 00 04 70 0F 08 BF 00 06 07 70' '07 07 07 07 07 07 07 07 FF FF 00 07 00 00 00 00'
'77 00 00 00 0A 77 00 04 4F 44 0A 77 00 04 44 47' '00 00 07 07 07 07 07 FF 00 07 00 00 00 00 07 00'
'04 77 00 04 44 47 04 77 00 04 44 47 16 77 00 06' '00 07 00 00 00 07 07 07 04 04 07 07 04 04 07 07'
'74 44 47 00 04 77 00 06 71 77 4F 00 06 FF 00 0A' '07 07 01 01 01 07 04 FF FF FF FF FF FF FF 04 07'
'47 77 71 77 4F 00 04 7F 00 0C 77 40 77 71 77 0F' '07 07 01 01 01 07 07 07 07 07 07 07 07 07 07 07'
'04 FF 00 10 F0 BF 47 71 77 0B FB F0 08 FB 04 07' '07 07 01 01 01 07 00 00 00 00 00 00 00 00 07 07'
'00 04 70 78 06 88 00 04 22 80 10 77 02 0B 08 FB' '07 07 01 01 01 07 07 00 00 00 00 00 00 00 00 00'
'04 07 02 77 00 00 02 70 04 00 00 08 07 77 44 47' '00 00 00 00 92 07 07 07 07 00 07 EC EC EC EC EC'
'0A 77 00 28 4F 47 00 07 4F 47 00 07 4F 47 00 07' 'EC EC EC EC EC 00 07 07 07 07 07 07 07 07 07 07'
'47 70 00 07 00 07 00 07 0C 77 00 06 71 77 4F 00' '07 07 07 07 07 07 07 00 00 00 00 00 00 00 00 00'
'06 FF 00 0A 47 77 71 77 47 00 04 F1 00 0C 17 40' '00 00 00 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'77 71 77 0F 04 FF 00 10 F0 FB 47 71 77 0F BF B0' '04 04 04 04 07 07 07 07 07 04 04 07 07 07 07 07'
'08 BF 02 07 06 70 06 88 00 08 AA 80 77 70 06 77' '07 07 07 07 07 07 07 07 FF FF 00 07 00 00 00 00'
'04 07 00 04 70 0F 08 BF 02 00 04 77 00 00 18 77' '00 00 07 07 07 07 07 FF 00 07 07 07 07 07 07 07'
'02 44 06 77 02 44 06 77 02 44 22 77 00 06 71 77' '07 07 07 07 07 07 07 07 04 04 07 07 07 07 07 07'
'4F 00 06 FF 00 0A 47 77 71 77 4F 00 04 71 00 0E' '07 01 01 01 01 01 04 FF FF FF FF FF FF FF 04 07'
'7F 40 77 71 77 0F FF 00 04 00 00 0C BF 47 71 77' '07 01 01 01 01 01 07 07 07 07 07 07 07 07 07 07'
'0B F0 04 00 06 FB 00 08 07 77 00 07 08 77 00 08' '07 01 01 01 01 01 00 FF FF FF FF FF FF 00 07 07'
'70 11 77 11 0A 77 0A 00 02 77 04 07 00 00 02 77' '07 01 01 01 01 01 07 00 FF DD DD DD DD D6 D6 D6'
'04 44 2A 77 00 14 47 70 00 07 00 07 00 07 77 74' 'D6 D6 D6 00 92 07 07 07 07 00 07 07 07 07 07 07'
'04 44 04 77 00 04 71 77 08 44 00 30 47 77 71 77' '07 07 07 07 EC 00 07 07 07 00 07 07 00 07 00 07'
'47 11 F7 17 40 77 71 77 0F FF 0F 0B FB 47 71 77' '00 07 00 07 07 00 07 00 FF DD DD DD DD D6 D6 D6'
'0F BF 00 0F 06 BF 00 06 07 00 77 00 0C 00 00 06' 'D6 D6 D6 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'71 11 17 00 0C 70 04 BF 02 07 04 70 04 77 00 00' '04 FF FF 04 07 07 07 07 07 07 07 07 07 07 07 07'
'00 06 77 4F F4 00 3C 77 00 06 44 77 44 00 04 77' '07 07 07 07 07 07 07 07 FF FF 00 07 07 07 07 07'
'02 71 0E 77 00 06 71 77 4F 00 04 71 00 10 1F 40' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'77 71 77 0F FF 00 04 BF 00 0C 47 71 77 0B FB F0' '07 07 07 07 07 07 07 07 04 04 04 04 04 04 07 07'
'08 FB 00 04 07 77 04 07 0C 77 02 11 0E 77 04 00' '07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'02 77 06 07 02 77 00 00 00 06 77 4F F4 00 0A 77' '07 07 07 01 07 07 07 00 00 00 00 00 00 00 00 00'
'00 04 74 44 0C 77 00 04 44 47 04 77 00 04 44 47' '07 07 07 01 07 07 00 FF FF FF FF FF FF 00 07 07'
'04 77 10 44 00 08 77 44 77 44 04 77 02 71 06 77' '07 07 07 01 07 07 07 00 FF DD DD DD DD DD DD D6'
'00 0E 74 44 47 77 71 77 47 00 06 F7 00 08 40 77' 'D6 D6 D6 00 92 07 07 07 07 00 07 EC EC EC EC EC'
'71 77 04 00 00 0E 0B F4 44 47 71 77 0F 00 0C BF' 'EC EC EC EC EC 00 07 07 07 07 07 07 07 07 07 07'
'02 07 06 70 0A 77 00 06 71 11 17 00 10 77 02 70' '07 07 07 07 07 07 07 00 FF DD DD DD DD DD DD D6'
'04 77 00 04 70 77 00 00 00 06 77 4F 44 00 0A 77' 'D6 D6 D6 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'00 08 74 F4 70 00 08 77 00 10 4F 47 00 07 4F 47' '04 FF FF 04 07 07 07 07 07 07 07 07 07 07 07 07'
'00 07 12 77 02 74 04 44 04 77 02 71 06 77 00 0C' '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'74 FF 47 77 71 77 08 44 00 06 40 77 71 00 04 77' '07 07 07 07 07 07 07 00 00 07 07 07 07 07 07 07'
'00 04 74 BF 04 B4 00 06 77 71 77 00 0E 00 00 04' '07 07 07 07 07 07 07 07 04 04 07 07 04 04 07 07'
'77 07 04 77 02 07 08 77 00 06 11 77 11 00 14 77' '07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'02 07 04 77 00 00 00 06 77 44 47 00 0A 77 00 04' '07 07 07 01 07 07 04 04 04 04 04 04 04 04 04 00'
'74 47 0C 77 02 44 06 77 02 44 08 77 00 0E 70 00' '07 07 07 01 07 07 00 FF FF FF FF FF FF 00 04 04'
'07 00 07 00 07 00 06 77 02 44 04 77 02 71 06 77' '04 07 07 01 07 07 07 00 FF DD DD DD DD DD DD DD'
'00 0C 74 FF 47 77 71 77 04 4C 00 0A CC 4C 40 77' 'D6 D6 D6 00 92 07 07 07 07 00 07 07 07 07 07 07'
'71 00 04 77 00 10 74 FB F4 47 77 71 77 70 04 BF' '07 07 07 07 EC 00 07 07 07 00 07 07 00 07 00 07'
'02 B0 0A 77 02 70 2C 77 00 00 42 77 00 06 74 44' '00 07 00 07 07 00 07 00 FF DD DD DD DD DD DD DD'
'47 00 04 77 02 71 06 77 00 0C 74 44 47 77 71 77' 'D6 D6 D6 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'08 44 00 06 47 77 71 00 04 77 02 74 04 44 04 77' '04 FF 04 04 07 07 07 07 07 07 07 07 07 07 04 04'
'02 71 04 77 04 00 02 07 32 77 02 07 04 77 00 00' '04 07 07 07 07 07 07 07 00 00 00 07 07 07 07 07'
'92 77 02 70 2C 77 00 00 00 01' '07 07 07 07 07 07 07 FF 00 07 00 00 00 00 07 00'
'00 07 00 00 00 07 07 07 07 04 04 04 04 07 07 07'
'07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'07 07 07 01 07 07 04 FF 07 FF 07 FF 07 07 04 00'
'07 07 07 01 07 07 00 FF FF FF FF FF FF 00 FB FF'
'04 07 07 01 07 07 07 00 FF DD DD DD DD 1F 1F 1F'
'D6 D6 D6 00 92 07 00 07 07 00 07 EC EC EC EC EC'
'EC EC 02 02 EC 00 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 00 FF DD DD DD DD DD DD DD'
'D6 FB D6 00 6D 07 07 00 00 00 00 00 00 07 07 07'
'04 04 04 07 07 07 07 07 07 07 07 07 07 07 04 FF'
'04 07 00 00 00 07 07 07 FF FF 00 07 00 00 00 00'
'00 00 07 07 07 07 07 FF 00 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'07 07 07 01 07 07 04 07 FF 01 FF 01 01 07 04 00'
'07 07 07 01 07 07 00 FF FF FF FF FF FF 00 FF FB'
'04 07 07 01 07 07 07 00 FF DD DD DD DD DD DD DD'
'1F D6 D6 00 92 07 07 00 07 00 07 00 EC EC EC EC'
'EC EC FA FA EC 00 07 07 07 00 07 07 07 07 07 07'
'00 07 00 07 07 00 07 00 FF DD DD DD DD DD DD DD'
'D6 FB D6 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 04 04'
'07 07 07 07 07 07 07 07 FF FF 00 07 00 00 00 00'
'00 00 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'07 07 07 01 07 07 04 FF 07 01 07 01 07 FF 04 00'
'07 07 07 01 07 07 00 FF FF FF 00 00 00 00 FB FF'
'04 07 07 01 07 07 07 00 FF DD DD DD DD DD DD DD'
'DD 1F D6 00 92 07 07 07 00 00 00 07 07 07 07 07'
'07 07 07 07 07 00 01 01 07 07 01 01 07 07 07 07'
'07 07 07 07 07 07 07 00 FF DD DD DD DD DD FB DD'
'DD FB D6 92 FB 07 07 07 04 04 04 04 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 FF FF 00 07 07 07 07 07'
'07 07 07 07 07 07 07 00 00 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 04 04 04 04 04 07 07'
'07 07 07 01 07 07 04 04 04 04 04 04 04 04 04 07'
'07 07 07 01 07 07 04 07 01 01 FF 07 01 07 04 00'
'07 07 07 01 07 07 00 FF FF FF 00 FF 00 FB FF FB'
'04 07 07 01 07 07 07 00 FF FF FF FF FF FF FF FF'
'FF 1F C3 00 07 07 00 00 07 07 00 00 00 00 00 00'
'00 00 00 00 00 00 07 01 01 01 01 07 07 00 07 00'
'07 00 07 00 07 00 07 00 FF FF FF FF FF FF FF FB'
'FF FB C3 FB 07 07 07 07 04 FF FF 04 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 FF 00 07 00 00 00 00 07 00'
'00 07 00 00 00 07 07 07 04 04 07 07 04 04 07 07'
'07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 01 07 07 04 FF 07 01 07 01 01 FF 04 00'
'07 07 07 01 07 07 00 FF FF FF 00 00 FB FF FB FF'
'04 07 07 01 07 07 07 00 D6 D6 D6 D6 D6 D6 D6 00'
'00 1F 00 00 07 07 07 07 00 07 00 07 07 07 07 07'
'07 07 07 07 07 07 07 07 01 01 07 07 07 07 07 07'
'07 07 07 07 07 07 07 00 D6 D6 D6 D6 D6 D6 D6 92'
'FB FB FB 92 92 07 07 07 04 FF FF 04 07 07 07 07'
'07 07 07 07 07 07 07 04 04 04 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 00 00 00 07 07 07 07 07'
'07 07 07 07 07 07 07 FF 00 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 04 04 07 07 04 04 07 07'
'07 07 07 01 07 07 07 07 07 07 07 04 04 04 04 07'
'07 07 07 01 07 07 04 07 FF 07 FF 07 FF 07 04 00'
'07 07 07 01 07 07 00 00 00 00 00 FB FF 04 04 04'
'04 07 07 01 07 07 07 07 00 D6 D6 D6 D6 D6 00 07'
'07 1F 07 07 07 07 07 00 07 00 07 00 07 07 07 07'
'07 07 07 07 07 07 07 01 01 01 01 07 07 07 07 07'
'07 07 07 07 07 07 07 07 00 D6 D6 D6 D6 FB FB FB'
'FB FB FB FB FB FB 07 07 04 FF 04 04 07 07 07 07'
'07 07 07 07 07 07 07 04 FF 04 07 00 00 00 07 07'
'07 07 07 07 07 07 07 07 FF FF 00 07 00 00 00 00'
'00 00 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 04 04 04 04 04 07 07'
'07 07 07 01 07 07 07 07 07 07 07 04 FF FF 04 07'
'07 07 07 01 07 07 04 04 04 04 04 04 04 04 04 00'
'07 07 07 01 07 07 07 07 07 04 FB FF FB 04 FB 04'
'07 07 07 01 07 07 07 07 07 00 00 00 00 00 07 07'
'07 1F 07 07 07 07 00 07 07 07 07 07 00 07 07 07'
'07 07 07 07 07 07 01 01 07 07 01 01 07 07 07 07'
'07 07 07 07 07 07 07 07 07 00 00 00 00 00 07 92'
'FB FB FB 92 07 07 07 07 04 04 04 07 07 07 07 07'
'07 07 07 07 07 07 07 04 04 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 FF FF 00 07 00 00 00 00'
'00 00 07 07 07 07 92 92 92 92 92 92 92 92 92 92'
'92 92 92 92 92 92 07 07 07 07 07 07 04 04 07 07'
'07 07 07 01 07 07 07 07 07 07 07 04 FF FF 04 07'
'07 07 07 01 07 07 04 FC 04 FC FC FC 04 FC 04 00'
'07 07 07 01 07 07 07 07 07 04 FF FB FF 04 04 07'
'07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 1F'
'1F 1F 1F 1F 07 07 07 07 07 00 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 FF FB'
'07 FB 07 FB 92 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 FF FF 00 07 07 07 07 07'
'07 07 07 07 07 07 92 FF FF 92 FF FF FF FF 92 FF'
'FF 92 FF FF FF 92 07 07 07 04 04 04 04 07 07 07'
'07 07 07 01 07 07 07 07 07 07 07 04 04 04 04 07'
'07 07 07 01 07 07 04 04 04 04 04 04 04 04 04 07'
'07 07 07 01 07 07 07 07 07 04 04 04 04 04 07 07'
'07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 07'
'1F 1F 1F 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 FB 07'
'07 FB 07 07 FB 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 92 92 92 92 92 92 92 92 92 92'
'92 92 92 92 92 92 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 1F 07 07 07 07 07 07 07 00 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07'
'07 FB 07 07 07 07'
} }
......
...@@ -201,7 +201,11 @@ DECL_WINELIB_TYPE_AW(LPFNPSPCALLBACK) ...@@ -201,7 +201,11 @@ DECL_WINELIB_TYPE_AW(LPFNPSPCALLBACK)
#define PSP_HASHELP 0x0020 #define PSP_HASHELP 0x0020
#define PSP_USEREFPARENT 0x0040 #define PSP_USEREFPARENT 0x0040
#define PSP_USECALLBACK 0x0080 #define PSP_USECALLBACK 0x0080
#define PSP_PREMATURE 0x0400
#define PSP_HIDEHEADER 0x00000800
#define PSP_USEHEADERTITLE 0x00001000
#define PSP_USEHEADERSUBTITLE 0x00002000
#define PSPCB_RELEASE 1 #define PSPCB_RELEASE 1
#define PSPCB_CREATE 2 #define PSPCB_CREATE 2
...@@ -218,10 +222,26 @@ DECL_WINELIB_TYPE_AW(LPFNPSPCALLBACK) ...@@ -218,10 +222,26 @@ DECL_WINELIB_TYPE_AW(LPFNPSPCALLBACK)
#define PSH_HASHELP 0x0200 #define PSH_HASHELP 0x0200
#define PSH_MODELESS 0x0400 #define PSH_MODELESS 0x0400
#define PSH_RTLREADING 0x0800 #define PSH_RTLREADING 0x0800
#define PSH_WIZARDCONTEXTHELP 0x00001000
#define PSH_WIZARD97 0x00002000
#define PSH_WATERMARK 0x00008000
#define PSH_USEHBMWATERMARK 0x00010000
#define PSH_USEHPLWATERMARK 0x00020000
#define PSH_STRETCHWATERMARK 0x00040000
#define PSH_HEADER 0x00080000
#define PSH_USEHBMHEADER 0x00100000
#define PSH_USEPAGELANG 0x00200000
#define PSCB_INITIALIZED 1 #define PSCB_INITIALIZED 1
#define PSCB_PRECREATE 2 #define PSCB_PRECREATE 2
typedef struct _PSHNOTIFY
{
NMHDR hdr;
LPARAM lParam;
} PSHNOTIFY, *LPPSHNOTIFY;
#define PSN_FIRST (0U-200U) #define PSN_FIRST (0U-200U)
#define PSN_LAST (0U-299U) #define PSN_LAST (0U-299U)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment