WindowsXP-SP1/admin/burnslib/src/proppage.cpp
2020-09-30 16:53:49 +02:00

345 lines
7.1 KiB
C++

// Copyright (c) 1997-1999 Microsoft Corporation
//
// Property Page base class class
//
// 9-9-97 sburns
#include "headers.hxx"
PropertyPage::PropertyPage(
unsigned dialogResID,
const DWORD helpMap_[],
bool deleteOnRelease_)
:
Dialog(dialogResID, helpMap_),
deleteOnRelease(deleteOnRelease_)
{
// LOG_CTOR(PropertyPage);
}
PropertyPage::~PropertyPage()
{
// LOG_DTOR(PropertyPage);
}
UINT CALLBACK
PropertyPage::PropSheetPageCallback(
HWND /* hwnd */ ,
UINT uMsg,
PROPSHEETPAGE* page)
{
if (uMsg == PSPCB_RELEASE)
{
// deletes the PropertyPage instance if it was created with the
// appropriate flag
PropertyPage* p = reinterpret_cast<PropertyPage*>(page->lParam);
if (p)
{
if (p->deleteOnRelease)
{
delete p;
}
}
}
return TRUE;
}
HPROPSHEETPAGE
PropertyPage::Create()
{
LOG_FUNCTION(PropertyPage::Create);
PROPSHEETPAGE page;
memset(&page, 0, sizeof(page));
page.dwSize = sizeof(page);
page.dwFlags = PSP_DEFAULT | PSP_USECALLBACK;
page.hInstance = GetResourceModuleHandle();
page.pszTemplate = reinterpret_cast<PCTSTR>(MAKEINTRESOURCEW(GetResID()));
page.pfnDlgProc = PropertyPage::propPageDialogProc;
page.pfnCallback = PropertyPage::PropSheetPageCallback;
// this pointer is retrieved by the dialog proc
page.lParam = reinterpret_cast<LPARAM>(this);
HPROPSHEETPAGE result = 0;
HRESULT hr = Win::CreatePropertySheetPage(page, result);
ASSERT(SUCCEEDED(hr));
return result;
}
bool
PropertyPage::OnApply(bool /* isClosing */ )
{
// LOG_FUNCTION2(
// PropertyPage::OnApply,
// isClosing ? L"closing" : L"not closing");
return false;
}
bool
PropertyPage::OnHelp()
{
LOG_FUNCTION(PropertyPage::OnHelp);
return false;
}
bool
PropertyPage::OnKillActive()
{
// LOG_FUNCTION(PropertyPage::OnKillActive);
return false;
}
bool
PropertyPage::OnSetActive()
{
// LOG_FUNCTION(PropertyPage::OnSetActive);
return false;
}
bool
PropertyPage::OnQueryCancel()
{
// LOG_FUNCTION(PropertyPage::OnQueryCancel);
return false;
}
bool
PropertyPage::OnReset()
{
// LOG_FUNCTION(PropertyPage::OnReset);
return false;
}
bool
PropertyPage::OnWizBack()
{
// LOG_FUNCTION(PropertyPage::OnWizBack);
return false;
}
bool
PropertyPage::OnWizNext()
{
// LOG_FUNCTION(PropertyPage::OnWizNext);
return false;
}
bool
PropertyPage::OnWizFinish()
{
// LOG_FUNCTION(PropertyPage::OnWizFinish);
return false;
}
// bool
// PropertyPage::OnHelp(const HELPINFO& helpinfo)
// {
// LOG_FUNCTION(PropertyPage::OnHelp);
//
// return false;
// }
PropertyPage*
PropertyPage::getPage(HWND pageDialog)
{
// LOG_FUNCTION(getPage);
ASSERT(Win::IsWindow(pageDialog));
Dialog* result = Dialog::GetInstance(pageDialog);
// don't assert ptr, it may not have been set. Some messages are
// sent before WM_INITDIALOG, which is the earliest we can set the
// pointer.
//
// for example, the LinkWindow control sends NM_CUSTOMDRAW before
// WM_INITDIALOG
return dynamic_cast<PropertyPage*>(result);
}
INT_PTR APIENTRY
PropertyPage::propPageDialogProc(
HWND dialog,
UINT message,
WPARAM wparam,
LPARAM lparam)
{
switch (message)
{
case WM_INITDIALOG:
{
// a pointer to the PropertyPage is in the lparam of the page struct,
// which is in the lparam to this function. Save this in the window
// structure so that it can later be retrieved by getPage.
ASSERT(lparam);
PROPSHEETPAGE* psp = reinterpret_cast<PROPSHEETPAGE*>(lparam);
ASSERT(psp);
if (psp)
{
Win::SetWindowLongPtr(dialog, DWLP_USER, psp->lParam);
PropertyPage* page = getPage(dialog);
if (page) // 447770 prefix warning
{
page->SetHWND(dialog);
page->OnInit();
}
}
return TRUE;
}
case WM_NOTIFY:
{
NMHDR* nmhdr = reinterpret_cast<NMHDR*>(lparam);
PropertyPage* page = getPage(dialog);
if (page)
{
ASSERT(page->hwnd == dialog);
bool result = false;
// LOG(String::format(L"%1!x!", nmhdr->code));
switch (nmhdr->code)
{
case PSN_APPLY:
{
PSHNOTIFY* pshn = reinterpret_cast<PSHNOTIFY*>(nmhdr);
result = page->OnApply(pshn->lParam ? true : false);
break;
}
case PSN_KILLACTIVE:
{
result = page->OnKillActive();
break;
}
case PSN_QUERYCANCEL:
{
result= page->OnQueryCancel();
break;
}
case PSN_RESET:
{
result = page->OnReset();
break;
}
case PSN_SETACTIVE:
{
result = page->OnSetActive();
break;
}
case PSN_WIZBACK:
{
result = page->OnWizBack();
break;
}
case PSN_WIZNEXT:
{
result = page->OnWizNext();
break;
}
case PSN_WIZFINISH:
{
result = page->OnWizFinish();
// DONT DO THIS!!! - the result is just there to mean that we have
// handled the message. It does reveal whether or
// not the OnWizFinish was successful. The
// the handler of OnWizFinish should call
// SetWindowLongPtr to set its result value
//Win::SetWindowLongPtr(dialog, DWLP_MSGRESULT, result ? TRUE : FALSE);
break;
}
case PSN_HELP:
{
result = page->OnHelp();
break;
}
case PSN_QUERYINITIALFOCUS:
case PSN_TRANSLATEACCELERATOR:
default:
{
result =
page->OnNotify(
nmhdr->hwndFrom,
nmhdr->idFrom,
nmhdr->code,
lparam);
break;
}
}
return result ? TRUE : FALSE;
}
return FALSE;
}
default:
{
return dialogProc(dialog, message, wparam, lparam);
}
}
}