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;
#define IDC_FINISH_BUTTON 12325
#define IDC_SUNKEN_LINE 12326
#define IDS_CLOSE 4160
/* Toolbar customization dialog */
#define IDD_TBCUSTOMIZE 200
......
......@@ -13,6 +13,8 @@
#include "winbase.h"
#include "commctrl.h"
#include "prsht.h"
#include "dialog.h"
#include "win.h"
#include "winnls.h"
#include "comctl32.h"
#include "debugtools.h"
......@@ -33,13 +35,13 @@ typedef struct
typedef struct tagPropPageInfo
{
int index; /* corresponds to the index in ppshheader->ppsp */
HPROPSHEETPAGE hpage; /* to keep track of pages not passed to PropertySheet */
HWND hwndPage;
BOOL isDirty;
LPCWSTR pszText;
BOOL hasHelp;
BOOL useCallback;
BOOL hasIcon;
} PropPageInfo;
typedef struct tagPropSheetInfo
......@@ -47,13 +49,14 @@ typedef struct tagPropSheetInfo
LPSTR strPropertiesFor;
int nPages;
int active_page;
LPCPROPSHEETHEADERA ppshheader;
LPPROPSHEETHEADERA ppshheader;
BOOL isModeless;
BOOL hasHelp;
BOOL hasApply;
BOOL useCallback;
BOOL restartWindows;
BOOL rebootSystem;
BOOL activeValid;
PropPageInfo* proppage;
int x;
int y;
......@@ -76,6 +79,7 @@ const char * PropSheetInfoStr = "PropertySheetInfo";
#define MAX_CAPTION_LENGTH 255
#define MAX_TABTEXT_LENGTH 255
#define MAX_BUTTONTEXT_LENGTH 64
/******************************************************************************
* Prototypes
......@@ -93,15 +97,14 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
PropSheetInfo * psInfo);
static int PROPSHEET_CreatePage(HWND hwndParent, int index,
const PropSheetInfo * psInfo,
LPCPROPSHEETPAGEA ppshpage,
BOOL showPage);
LPCPROPSHEETPAGEA ppshpage);
static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo);
static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg);
static BOOL PROPSHEET_Back(HWND hwndDlg);
static BOOL PROPSHEET_Next(HWND hwndDlg);
static BOOL PROPSHEET_Finish(HWND hwndDlg);
static BOOL PROPSHEET_Apply(HWND hwndDlg);
static void PROPSHEET_Cancel(HWND hwndDlg);
static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam);
static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam);
static void PROPSHEET_Help(HWND hwndDlg);
static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage);
static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage);
......@@ -114,8 +117,6 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
HPROPSHEETPAGE hpage);
static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
WPARAM wParam, LPARAM lParam);
static LPCPROPSHEETPAGEA PROPSHEET_GetPSPPage(const PropSheetInfo * psInfo,
int index);
static BOOL PROPSHEET_AddPage(HWND hwndDlg,
HPROPSHEETPAGE hpage);
......@@ -126,6 +127,8 @@ static void PROPSHEET_CleanUp();
static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo);
static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags);
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
PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
......@@ -146,7 +149,14 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
psInfo->hasApply = !(dwFlags & PSH_NOAPPLYNOW);
psInfo->useCallback = dwFlags & PSH_USECALLBACK;
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;
if (dwFlags & PSH_USEPSTARTPAGE)
......@@ -157,9 +167,13 @@ static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
else
psInfo->active_page = lppsh->u2.nStartPage;
if (psInfo->active_page < 0 || psInfo->active_page >= psInfo->nPages)
psInfo->active_page = 0;
psInfo->restartWindows = FALSE;
psInfo->rebootSystem = FALSE;
psInfo->hImageList = 0;
psInfo->activeValid = FALSE;
return TRUE;
}
......@@ -179,8 +193,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
DWORD dwFlags;
int width, height;
if (psInfo->ppshheader->dwFlags & PSH_PROPSHEETPAGE)
psInfo->proppage[index].hpage = 0;
psInfo->proppage[index].hpage = (HPROPSHEETPAGE)lppsp;
psInfo->proppage[index].hwndPage = 0;
psInfo->proppage[index].isDirty = FALSE;
......@@ -190,6 +203,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
dwFlags = lppsp->dwFlags;
psInfo->proppage[index].useCallback = dwFlags & PSP_USECALLBACK;
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 */
if (psInfo->proppage[index].hasHelp)
......@@ -312,16 +326,59 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
else
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);
ImageList_AddIcon(psInfo->hImageList, hIcon);
}
}
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
*
* Creates the actual property sheet.
......@@ -361,18 +418,14 @@ BOOL PROPSHEET_CreateDialog(PropSheetInfo* psInfo)
if (psInfo->useCallback)
(*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
if (psInfo->ppshheader->dwFlags & PSH_MODELESS)
ret = CreateDialogIndirectParamA(psInfo->ppshheader->hInstance,
(LPDLGTEMPLATEA) temp,
psInfo->ppshheader->hwndParent,
(DLGPROC) PROPSHEET_DialogProc,
(LPARAM)psInfo);
else
ret = DialogBoxIndirectParamA(psInfo->ppshheader->hInstance,
(LPDLGTEMPLATEA) temp,
psInfo->ppshheader->hwndParent,
(DLGPROC) PROPSHEET_DialogProc,
(LPARAM)psInfo);
if (!(psInfo->ppshheader->dwFlags & PSH_MODELESS))
ret = PROPSHEET_DoDialogBox((HWND)ret, psInfo->ppshheader->hwndParent);
COMCTL32_Free(temp);
......@@ -846,6 +899,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
TCITEMA item;
int i, nTabs;
int iImage = 0;
char tabtext[MAX_TABTEXT_LENGTH] = "Tab text";
item.mask = TCIF_TEXT;
......@@ -859,13 +913,20 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
*/
if (psInfo->hImageList)
{
item.mask |= TCIF_IMAGE;
SendMessageA(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
}
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,
(LPCWSTR)psInfo->proppage[i].pszText,
......@@ -885,8 +946,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
static int PROPSHEET_CreatePage(HWND hwndParent,
int index,
const PropSheetInfo * psInfo,
LPCPROPSHEETPAGEA ppshpage,
BOOL showPage)
LPCPROPSHEETPAGEA ppshpage)
{
DLGTEMPLATE* pTemplate;
HWND hwndPage;
......@@ -909,21 +969,23 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
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 &= ~WS_CAPTION;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_SYSMENU;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_POPUP;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_DISABLED;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_VISIBLE;
}
else
{
pTemplate->style |= WS_CHILD;
pTemplate->style |= WS_CHILD | DS_CONTROL;
pTemplate->style &= ~DS_MODALFRAME;
pTemplate->style &= ~WS_CAPTION;
pTemplate->style &= ~WS_SYSMENU;
pTemplate->style &= ~WS_POPUP;
pTemplate->style &= ~WS_DISABLED;
pTemplate->style &= ~WS_VISIBLE;
}
if (psInfo->proppage[index].useCallback)
......@@ -964,23 +1026,6 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
rc.top + padding.y,
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;
}
......@@ -992,19 +1037,50 @@ static int PROPSHEET_CreatePage(HWND hwndParent,
static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
{
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;
}
if (psInfo->active_page != -1)
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);
else
if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
{
LPCPROPSHEETPAGEA ppshpage = PROPSHEET_GetPSPPage(psInfo, index);
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage, TRUE);
HWND hwndTabCtrl;
/* Synchronize current selection with tab control */
hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
SendMessageA(hwndTabCtrl, TCM_SETCURSEL, index, 0);
}
psInfo->active_page = index;
psInfo->activeValid = TRUE;
return TRUE;
}
......@@ -1015,32 +1091,32 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
static BOOL PROPSHEET_Back(HWND hwndDlg)
{
BOOL res;
NMHDR hdr;
PSHNOTIFY psn;
HWND hwndPage;
HWND hwndBack = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
if (psInfo->active_page <= 0)
if (psInfo->active_page < 0)
return FALSE;
hdr.hwndFrom = hwndDlg;
hdr.code = PSN_WIZBACK;
psn.hdr.code = PSN_WIZBACK;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
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;
if (psInfo->active_page > 0)
{
res = PROPSHEET_CanSetCurSel(hwndDlg);
if(res != FALSE)
{
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;
}
......@@ -1050,21 +1126,23 @@ static BOOL PROPSHEET_Back(HWND hwndDlg)
*/
static BOOL PROPSHEET_Next(HWND hwndDlg)
{
NMHDR hdr;
PSHNOTIFY psn;
HWND hwndPage;
LRESULT msgResult = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
if (psInfo->active_page < 0 || psInfo->active_page == psInfo->nPages - 1)
if (psInfo->active_page < 0)
return FALSE;
hdr.hwndFrom = hwndDlg;
hdr.code = PSN_WIZNEXT;
psn.hdr.code = PSN_WIZNEXT;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
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);
......@@ -1084,7 +1162,7 @@ static BOOL PROPSHEET_Next(HWND hwndDlg)
*/
static BOOL PROPSHEET_Finish(HWND hwndDlg)
{
NMHDR hdr;
PSHNOTIFY psn;
HWND hwndPage;
LRESULT msgResult = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
......@@ -1093,12 +1171,14 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
if (psInfo->active_page < 0)
return FALSE;
hdr.hwndFrom = hwndDlg;
hdr.code = PSN_WIZFINISH;
psn.hdr.code = PSN_WIZFINISH;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
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);
......@@ -1106,7 +1186,7 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
return FALSE;
if (psInfo->isModeless)
psInfo->active_page = -1;
psInfo->activeValid = FALSE;
else
EndDialog(hwndDlg, TRUE);
......@@ -1116,11 +1196,11 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg)
/******************************************************************************
* PROPSHEET_Apply
*/
static BOOL PROPSHEET_Apply(HWND hwndDlg)
static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam)
{
int i;
NMHDR hdr;
HWND hwndPage;
PSHNOTIFY psn;
LRESULT msgResult;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
......@@ -1128,31 +1208,49 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg)
if (psInfo->active_page < 0)
return FALSE;
hdr.hwndFrom = hwndDlg;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
/*
* Send PSN_KILLACTIVE to the current page.
*/
hdr.code = PSN_KILLACTIVE;
psn.hdr.code = PSN_KILLACTIVE;
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;
/*
* 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++)
{
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)
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;
}
......@@ -1160,29 +1258,42 @@ static BOOL PROPSHEET_Apply(HWND hwndDlg)
/******************************************************************************
* PROPSHEET_Cancel
*/
static void PROPSHEET_Cancel(HWND hwndDlg)
static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
HWND hwndPage;
NMHDR hdr;
PSHNOTIFY psn;
int i;
if (psInfo->active_page < 0)
return;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
hdr.hwndFrom = hwndDlg;
hdr.code = PSN_QUERYCANCEL;
psn.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;
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)
psInfo->active_page = -1; /* makes PSM_GETCURRENTPAGEHWND return NULL */
{
/* makes PSM_GETCURRENTPAGEHWND return NULL */
psInfo->activeValid = FALSE;
}
else
EndDialog(hwndDlg, FALSE);
}
......@@ -1195,16 +1306,18 @@ static void PROPSHEET_Help(HWND hwndDlg)
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
HWND hwndPage;
NMHDR hdr;
PSHNOTIFY psn;
if (psInfo->active_page < 0)
return;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
hdr.hwndFrom = hwndDlg;
hdr.code = PSN_HELP;
psn.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)
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
PropSheetInfoStr);
HWND hwndPage;
NMHDR hdr;
PSHNOTIFY psn;
if (!psInfo || psInfo->active_page < 0)
if (!psInfo)
return FALSE;
if (psInfo->active_page < 0)
return TRUE;
/*
* Notify the current page.
*/
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;
hdr.code = PSN_KILLACTIVE;
return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
}
/******************************************************************************
......@@ -1345,17 +1463,8 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
PropSheetInfoStr);
HWND hwndPage;
HWND hwndHelp = GetDlgItem(hwndDlg, IDHELP);
NMHDR hdr;
if (psInfo->active_page < 0)
return FALSE;
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
hdr.hwndFrom = hwndDlg;
/*
* hpage takes precedence over index.
*/
/* hpage takes precedence over index */
if (hpage != NULL)
index = PROPSHEET_GetPageIndex(hpage, psInfo);
......@@ -1374,9 +1483,15 @@ static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
if (hwndPage)
{
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.
*/
......@@ -1472,32 +1587,6 @@ static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
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
......@@ -1520,13 +1609,13 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg,
(psInfo->nPages + 1));
PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages);
psInfo->proppage[psInfo->nPages].index = -1;
psInfo->proppage[psInfo->nPages].hpage = hpage;
/*
* Create the page but don't show it.
*/
PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp, FALSE);
if (ppsp->dwFlags & PSP_PREMATURE)
{
/* Create the page but don't show it */
PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp);
}
/*
* Add a new tab to the tab control.
......@@ -1544,6 +1633,10 @@ static BOOL PROPSHEET_AddPage(HWND hwndDlg,
psInfo->nPages++;
/* If it is the only page - show it */
if(psInfo->nPages == 1)
PROPSHEET_ShowPage(hwndDlg, 0, psInfo);
return TRUE;
}
......@@ -1560,7 +1653,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
PropPageInfo* oldPages;
if (!psInfo) {
FIXME("No psInfo for propertysheet at windows 0x%04x, returning FALSE...\n", hwndDlg);
return FALSE;
}
oldPages = psInfo->proppage;
......@@ -1601,26 +1693,31 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
}
else
{
TRACE("Removing the only page, close the dialog!\n");
if (psInfo->isModeless)
psInfo->active_page = -1;
else
if (!psInfo->isModeless)
{
EndDialog(hwndDlg, FALSE);
return TRUE;
}
}
if (index < psInfo->active_page)
}
else if (index < psInfo->active_page)
psInfo->active_page--;
/* Destroy page dialog window.
* If it's last page in modal dialog, it has been destroyed by EndDialog
*/
if (psInfo->isModeless || psInfo->nPages > 1)
/* Destroy page dialog window */
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 */
SendMessageA(hwndTabControl, TCM_DELETEITEM, index, 0);
......@@ -1649,27 +1746,27 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
*/
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);
EnableWindow(hwndBack, FALSE);
EnableWindow(hwndNext, FALSE);
EnableWindow(hwndFinish, FALSE);
if (dwFlags & PSWIZB_BACK)
{
hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
EnableWindow(hwndButton, TRUE);
}
EnableWindow(hwndBack, TRUE);
if (dwFlags & PSWIZB_NEXT)
{
/* Hide the Finish button */
hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
ShowWindow(hwndFinish, SW_HIDE);
/* Show and enable the Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
ShowWindow(hwndButton, SW_SHOW);
EnableWindow(hwndButton, TRUE);
ShowWindow(hwndNext, SW_SHOW);
EnableWindow(hwndNext, TRUE);
/* Set the Next button as the default pushbutton */
SendMessageA(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
......@@ -1678,17 +1775,13 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
if ((dwFlags & PSWIZB_FINISH) || (dwFlags & PSWIZB_DISABLEDFINISH))
{
/* Hide the Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
ShowWindow(hwndNext, SW_HIDE);
/* Show the Finish button */
hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
ShowWindow(hwndButton, SW_SHOW);
ShowWindow(hwndFinish, SW_SHOW);
if (dwFlags & PSWIZB_FINISH)
EnableWindow(hwndButton, TRUE);
else
EnableWindow(hwndButton, FALSE);
EnableWindow(hwndFinish, TRUE);
/* Set the Finish button as the default pushbutton */
SendMessageA(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
......@@ -1725,10 +1818,32 @@ static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, PropSheetInfo* psInfo)
*/
static void PROPSHEET_CleanUp(HWND hwndDlg)
{
int i;
PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropA(hwndDlg,
PropSheetInfoStr);
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->strPropertiesFor);
ImageList_Destroy(psInfo->hImageList);
......@@ -1744,21 +1859,27 @@ INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh)
int bRet = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GlobalAlloc(GPTR,
sizeof(PropSheetInfo));
LPCPROPSHEETPAGEA lppsp;
int i;
BYTE* pByte;
PROPSHEET_CollectSheetInfo(lppsh, psInfo);
psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) *
lppsh->nPages);
pByte = (BYTE*) psInfo->ppshheader->u3.ppsp;
for (i = 0; i < lppsh->nPages; i++)
{
psInfo->proppage[i].index = i;
if (!(lppsh->dwFlags & PSH_PROPSHEETPAGE))
psInfo->proppage[i].hpage = psInfo->ppshheader->u3.phpage[i];
lppsp = PROPSHEET_GetPSPPage(psInfo, i);
PROPSHEET_CollectPageInfo(lppsp, psInfo, i);
else
{
psInfo->proppage[i].hpage = CreatePropertySheetPageA((LPCPROPSHEETPAGEA)pByte);
pByte += ((LPPROPSHEETPAGEA)pByte)->dwSize;
}
PROPSHEET_CollectPageInfo((LPCPROPSHEETPAGEA)psInfo->proppage[i].hpage,
psInfo, i);
}
bRet = PROPSHEET_CreateDialog(psInfo);
......@@ -1786,6 +1907,18 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
*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;
}
......@@ -1804,12 +1937,78 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
*/
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);
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
*/
BOOL WINAPI
......@@ -1823,6 +2022,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
char* strCaption = (char*)COMCTL32_Alloc(MAX_CAPTION_LENGTH);
HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
LPCPROPSHEETPAGEA ppshpage;
int idx;
SetPropA(hwnd, PropSheetInfoStr, (HANDLE)psInfo);
......@@ -1859,17 +2059,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (psInfo->ppshheader->dwFlags & PSH_WIZARD)
{
HWND hwndBack = GetDlgItem(hwnd, IDC_BACK_BUTTON);
if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo))
{
PROPSHEET_AdjustSizeWizard(hwnd, psInfo);
PROPSHEET_AdjustButtonsWizard(hwnd, psInfo);
}
/* Disable Back button if we start at page 0 */
if (psInfo->active_page == 0)
EnableWindow(hwndBack, FALSE);
}
else
{
......@@ -1884,8 +2078,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
(*(psInfo->ppshheader->pfnCallback))(hwnd,
PSCB_INITIALIZED, (LPARAM)0);
ppshpage = PROPSHEET_GetPSPPage(psInfo, psInfo->active_page);
PROPSHEET_CreatePage(hwnd, psInfo->active_page, psInfo, ppshpage, TRUE);
idx = psInfo->active_page;
ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[idx].hpage;
psInfo->active_page = -1;
PROPSHEET_SetCurSel(hwnd, idx, psInfo->proppage[idx].hpage);
if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
SendMessageA(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
......@@ -1913,7 +2110,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
case WM_CLOSE:
PROPSHEET_Cancel(hwnd);
PROPSHEET_Cancel(hwnd, 1);
return TRUE;
case WM_COMMAND:
......@@ -1927,11 +2124,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
if (PROPSHEET_Apply(hwnd) == FALSE)
if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
break;
EnableWindow(hwndApplyBtn, FALSE);
if (wID == IDOK)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd,
......@@ -1946,10 +2141,12 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
result = ID_PSREBOOTSYSTEM;
if (psInfo->isModeless)
psInfo->active_page = -1;
psInfo->activeValid = FALSE;
else
EndDialog(hwnd, result);
}
else
EnableWindow(hwndApplyBtn, FALSE);
break;
}
......@@ -1967,7 +2164,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
case IDCANCEL:
PROPSHEET_Cancel(hwnd);
PROPSHEET_Cancel(hwnd, 0);
break;
case IDHELP:
......@@ -2005,7 +2202,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
PropSheetInfoStr);
HWND hwndPage = 0;
if (psInfo->active_page != -1)
if (psInfo->activeValid && psInfo->active_page != -1)
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
SetWindowLongA(hwnd, DWL_MSGRESULT, hwndPage);
......@@ -2049,13 +2246,15 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_CANCELTOCLOSE:
{
char buf[MAX_BUTTONTEXT_LENGTH];
HWND hwndOK = GetDlgItem(hwnd, IDOK);
HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
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:
......@@ -2082,7 +2281,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_APPLY:
{
BOOL msgResult = PROPSHEET_Apply(hwnd);
BOOL msgResult = PROPSHEET_Apply(hwnd, 0);
SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
......@@ -2121,8 +2320,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case PSM_ISDIALOGMESSAGE:
{
FIXME("Unimplemented msg PSM_ISDIALOGMESSAGE\n");
return 0;
BOOL msgResult = PROPSHEET_IsDialogMessage(hwnd, (LPMSG)lParam);
SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_PRESSBUTTON:
......
......@@ -10,8 +10,8 @@ BEGIN
DEFPUSHBUTTON "OK", IDOK,72,138,50,14
PUSHBUTTON "Cancel", IDCANCEL,127,138,50,14
PUSHBUTTON "&Apply", IDC_APPLY_BUTTON,181,138,50,14
PUSHBUTTON "Help", IDHELP,235,138,50,14
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS,7,7,278,125
PUSHBUTTON "Help", IDHELP,235,138,50,14,WS_TABSTOP|WS_GROUP
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_TABSTOP,7,7,278,125
END
......@@ -24,7 +24,7 @@ BEGIN
DEFPUSHBUTTON "&Next >", IDC_NEXT_BUTTON,121,138,50,14
PUSHBUTTON "< &Back", IDC_BACK_BUTTON,71,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
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
END
......@@ -96,6 +96,10 @@ IDT_CHECK BITMAP LOADONCALL DISCARDABLE
'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
{
......@@ -398,89 +402,266 @@ IDB_STD_LARGE BITMAP LOADONCALL DISCARDABLE
/* BINRES idb_view_small.bmp */
IDB_VIEW_SMALL BITMAP LOADONCALL DISCARDABLE
{
'42 4D 2A 05 00 00 00 00 00 00 76 00 00 00 28 00'
'00 00 C0 00 00 00 10 00 00 00 01 00 04 00 02 00'
'00 00 B4 04 00 00 00 00 00 00 00 00 00 00 00 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 08 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 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 FF FF FF 00 C0 77 00 00 08 77 02 70 04 00'
'00 08 07 77 74 44 0A 77 00 04 44 47 04 77 00 04'
'44 47 04 77 00 18 47 70 00 07 00 07 00 07 77 74'
'44 47 04 77 00 04 71 77 08 44 00 06 47 77 71 00'
'0E 77 02 71 0E 77 02 71 14 77 02 70 0C 00 02 77'
'0E 70 0A 00 02 07 04 77 00 00 12 77 00 08 74 F4'
'70 00 06 77 00 10 4F 47 00 07 4F 47 00 07 12 77'
'00 06 44 77 44 00 04 77 00 06 11 17 4F 00 06 FF'
'00 08 47 77 11 17 0C 77 00 04 11 17 08 00 04 77'
'00 04 11 17 0E 00 00 08 07 77 70 78 08 88 02 80'
'10 77 02 0B 08 FB 02 07 04 77 00 00 0A 77 04 44'
'04 77 00 04 74 47 0A 77 02 44 06 77 02 44 06 77'
'00 14 47 70 00 07 00 07 00 07 77 44 06 77 02 71'
'04 11 02 4F 06 FF 00 04 47 71 04 11 0A 77 02 71'
'04 11 02 0F 04 FF 00 06 F0 77 71 00 04 11 02 0F'
'0C BF 00 06 07 77 70 00 0A 77 00 08 80 77 70 77'
'08 07 00 04 70 0F 08 BF 02 07 04 77 00 00 0A 77'
'00 04 4F F4 34 77 06 44 04 77 00 06 71 77 4F 00'
'06 FF 00 0A 47 77 71 77 70 00 08 00 00 08 77 71'
'77 0F 04 FF 02 F0 04 77 00 06 71 77 0B 00 0C FB'
'00 08 07 77 70 78 08 88 02 80 10 77 02 0B 08 FB'
'02 07 04 77 00 00 0A 77 00 04 4F F4 22 77 00 18'
'47 70 00 07 00 07 00 07 77 44 77 44 04 77 00 06'
'71 77 4F 00 06 FF 00 08 47 77 71 77 08 44 00 0A'
'40 77 71 77 0F 00 04 FF 00 10 F0 44 47 71 77 0F'
'BF B0 04 00 00 0A 0F BF 07 77 70 00 0A 77 00 08'
'80 77 70 77 08 07 00 04 70 0F 08 BF 00 06 07 70'
'77 00 00 00 0A 77 00 04 4F 44 0A 77 00 04 44 47'
'04 77 00 04 44 47 04 77 00 04 44 47 16 77 00 06'
'74 44 47 00 04 77 00 06 71 77 4F 00 06 FF 00 0A'
'47 77 71 77 4F 00 04 7F 00 0C 77 40 77 71 77 0F'
'04 FF 00 10 F0 BF 47 71 77 0B FB F0 08 FB 04 07'
'00 04 70 78 06 88 00 04 22 80 10 77 02 0B 08 FB'
'04 07 02 77 00 00 02 70 04 00 00 08 07 77 44 47'
'0A 77 00 28 4F 47 00 07 4F 47 00 07 4F 47 00 07'
'47 70 00 07 00 07 00 07 0C 77 00 06 71 77 4F 00'
'06 FF 00 0A 47 77 71 77 47 00 04 F1 00 0C 17 40'
'77 71 77 0F 04 FF 00 10 F0 FB 47 71 77 0F BF B0'
'08 BF 02 07 06 70 06 88 00 08 AA 80 77 70 06 77'
'04 07 00 04 70 0F 08 BF 02 00 04 77 00 00 18 77'
'02 44 06 77 02 44 06 77 02 44 22 77 00 06 71 77'
'4F 00 06 FF 00 0A 47 77 71 77 4F 00 04 71 00 0E'
'7F 40 77 71 77 0F FF 00 04 00 00 0C BF 47 71 77'
'0B F0 04 00 06 FB 00 08 07 77 00 07 08 77 00 08'
'70 11 77 11 0A 77 0A 00 02 77 04 07 00 00 02 77'
'04 44 2A 77 00 14 47 70 00 07 00 07 00 07 77 74'
'04 44 04 77 00 04 71 77 08 44 00 30 47 77 71 77'
'47 11 F7 17 40 77 71 77 0F FF 0F 0B FB 47 71 77'
'0F BF 00 0F 06 BF 00 06 07 00 77 00 0C 00 00 06'
'71 11 17 00 0C 70 04 BF 02 07 04 70 04 77 00 00'
'00 06 77 4F F4 00 3C 77 00 06 44 77 44 00 04 77'
'02 71 0E 77 00 06 71 77 4F 00 04 71 00 10 1F 40'
'77 71 77 0F FF 00 04 BF 00 0C 47 71 77 0B FB F0'
'08 FB 00 04 07 77 04 07 0C 77 02 11 0E 77 04 00'
'02 77 06 07 02 77 00 00 00 06 77 4F F4 00 0A 77'
'00 04 74 44 0C 77 00 04 44 47 04 77 00 04 44 47'
'04 77 10 44 00 08 77 44 77 44 04 77 02 71 06 77'
'00 0E 74 44 47 77 71 77 47 00 06 F7 00 08 40 77'
'71 77 04 00 00 0E 0B F4 44 47 71 77 0F 00 0C BF'
'02 07 06 70 0A 77 00 06 71 11 17 00 10 77 02 70'
'04 77 00 04 70 77 00 00 00 06 77 4F 44 00 0A 77'
'00 08 74 F4 70 00 08 77 00 10 4F 47 00 07 4F 47'
'00 07 12 77 02 74 04 44 04 77 02 71 06 77 00 0C'
'74 FF 47 77 71 77 08 44 00 06 40 77 71 00 04 77'
'00 04 74 BF 04 B4 00 06 77 71 77 00 0E 00 00 04'
'77 07 04 77 02 07 08 77 00 06 11 77 11 00 14 77'
'02 07 04 77 00 00 00 06 77 44 47 00 0A 77 00 04'
'74 47 0C 77 02 44 06 77 02 44 08 77 00 0E 70 00'
'07 00 07 00 07 00 06 77 02 44 04 77 02 71 06 77'
'00 0C 74 FF 47 77 71 77 04 4C 00 0A CC 4C 40 77'
'71 00 04 77 00 10 74 FB F4 47 77 71 77 70 04 BF'
'02 B0 0A 77 02 70 2C 77 00 00 42 77 00 06 74 44'
'47 00 04 77 02 71 06 77 00 0C 74 44 47 77 71 77'
'08 44 00 06 47 77 71 00 04 77 02 74 04 44 04 77'
'02 71 04 77 04 00 02 07 32 77 02 07 04 77 00 00'
'92 77 02 70 2C 77 00 00 00 01'
'00 00 FF FF 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'
'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 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 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 00'
'00 00 00 00 00 07 07 07 07 04 04 04 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 00 00 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 07 04 04 04 04 07 07 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 07 07 07 07 07 07 07'
'07 07 07 01 07 07 07 07 07 07 07 07 07 07 07 07'
'07 07 07 01 07 07 07 07 92 92 92 92 92 92 92 92'
'92 92 92 92 92 07 07 07 07 00 00 00 00 00 00 00'
'00 00 00 00 00 00 07 07 07 00 07 00 07 00 07 00'
'07 00 07 00 07 00 07 07 6D 6D 6D 6D 6D 6D 6D 6D'
'6D 6D 6D 6D 6D 07 07 07 07 07 07 07 07 07 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 FF FF 00 07 00 00 00 00'
'00 00 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 01 01 01 07 04 FF FF FF FF FF FF FF 04 07'
'07 07 01 01 01 07 07 07 07 07 07 07 07 07 07 07'
'07 07 01 01 01 07 00 00 00 00 00 00 00 00 07 07'
'07 07 01 01 01 07 07 00 00 00 00 00 00 00 00 00'
'00 00 00 00 92 07 07 07 07 00 07 EC EC EC EC EC'
'EC EC EC EC EC 00 07 07 07 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 00 00 00 00 00 00 00 00 00'
'00 00 00 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'04 04 04 04 07 07 07 07 07 04 04 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 07 FF 00 07 07 07 07 07 07 07'
'07 07 07 07 07 07 07 07 04 04 07 07 07 07 07 07'
'07 01 01 01 01 01 04 FF FF FF FF FF FF FF 04 07'
'07 01 01 01 01 01 07 07 07 07 07 07 07 07 07 07'
'07 01 01 01 01 01 00 FF FF FF FF FF FF 00 07 07'
'07 01 01 01 01 01 07 00 FF DD DD DD DD D6 D6 D6'
'D6 D6 D6 00 92 07 07 07 07 00 07 07 07 07 07 07'
'07 07 07 07 EC 00 07 07 07 00 07 07 00 07 00 07'
'00 07 00 07 07 00 07 00 FF DD DD DD DD D6 D6 D6'
'D6 D6 D6 00 6D 07 07 07 07 07 07 07 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 FF 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 07 07 07 04 04 04 04 04 04 07 07'
'07 07 07 01 07 07 04 FF FF FF FF FF FF FF 04 07'
'07 07 07 01 07 07 07 00 00 00 00 00 00 00 00 00'
'07 07 07 01 07 07 00 FF FF FF FF FF FF 00 07 07'
'07 07 07 01 07 07 07 00 FF DD DD DD DD DD DD D6'
'D6 D6 D6 00 92 07 07 07 07 00 07 EC EC EC EC EC'
'EC EC EC EC 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 D6'
'D6 D6 D6 00 6D 07 07 07 07 07 07 07 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 00 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 04 FF FF FF FF FF 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 00 FF FF FF FF FF FF 00 04 04'
'04 07 07 01 07 07 07 00 FF DD DD DD DD DD DD DD'
'D6 D6 D6 00 92 07 07 07 07 00 07 07 07 07 07 07'
'07 07 07 07 EC 00 07 07 07 00 07 07 00 07 00 07'
'00 07 00 07 07 00 07 00 FF DD DD DD DD DD DD DD'
'D6 D6 D6 00 6D 07 07 07 07 07 07 07 07 07 07 07'
'04 FF 04 04 07 07 07 07 07 07 07 07 07 07 04 04'
'04 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 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)
#define PSP_HASHELP 0x0020
#define PSP_USEREFPARENT 0x0040
#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_CREATE 2
......@@ -218,10 +222,26 @@ DECL_WINELIB_TYPE_AW(LPFNPSPCALLBACK)
#define PSH_HASHELP 0x0200
#define PSH_MODELESS 0x0400
#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_PRECREATE 2
typedef struct _PSHNOTIFY
{
NMHDR hdr;
LPARAM lParam;
} PSHNOTIFY, *LPPSHNOTIFY;
#define PSN_FIRST (0U-200U)
#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