windows-nt/Source/XPSP1/NT/shell/osshell/accessib/accwiz/pgbase.h
2020-09-26 16:20:57 +08:00

278 lines
7 KiB
C++

//Copyright (c) 1997-2000 Microsoft Corporation
#ifndef __WIZARD_PAGE_BASECLASS_H
#define __WIZARD_PAGE_BASECLASS_H
//
// Special "Wizard Page Messages"
//
#include "AccWiz.h" // JMC: TODO: Maybe move this somewhere else
class CWizardPageOrder
{
public:
CWizardPageOrder()
{
m_nCount = 0;
for(int i=0;i<ARRAYSIZE(m_rgdwPageIds);i++)
m_rgdwPageIds[i] = 0;
}
BOOL AddPages(DWORD nInsertAfter, DWORD *rgdwIds, int nCount)
{
// First remove the pages if they are already there
RemovePages(rgdwIds, nCount);
int nStart = m_nCount - 1; // This will add to the end of the array
if(0xFFFFFFFF != nInsertAfter)
{
for(nStart = 0;nStart < m_nCount;nStart++)
if(m_rgdwPageIds[nStart] == nInsertAfter) break;
if(nStart >= m_nCount)
{
_ASSERTE(FALSE); // The specified insert after was not in the array
return FALSE;
}
}
// Check to see if we have enough space.
if(nCount + m_nCount > ARRAYSIZE(m_rgdwPageIds))
{
_ASSERTE(FALSE); // We don't have space
return FALSE;
}
// Move current allocation upwards
for(int i=m_nCount-1;i>nStart;i--)
m_rgdwPageIds[i + nCount] = m_rgdwPageIds[i];
// Insert new values
for(i = 0;i<nCount;i++)
m_rgdwPageIds[nStart + i + 1] = rgdwIds[i];
// Set new value for m_nCount
m_nCount += nCount;
return TRUE;
}
BOOL RemovePages(DWORD *rgdwIds, int nCount)
{
// NOTE: This will scan the array and find the max and min locations
// of all the elements in rgdwIds. It then removes everything from min to max.
// This is needed in case a sub page added more sub pages.
int nMin = m_nCount + 1;
int nMax = 0;
for(int i=0;i<m_nCount;i++)
{
for(int j=0;j<nCount;j++)
{
if(m_rgdwPageIds[i] == rgdwIds[j])
{
nMin = min(i, nMin);
nMax = max(i, nMax);
}
}
}
if(nMax < nMin)
{
// _ASSERTE(FALSE); // we could not find the range
return FALSE;
}
// Move elements down
int nCountElementsToRemove = nMax - nMin + 1;
for(i=0;i<m_nCount - (nMax + 1);i++)
m_rgdwPageIds[nMin + i] = m_rgdwPageIds[nMin + i + nCountElementsToRemove];
// Figure out new m_nCount;
m_nCount -= nCountElementsToRemove;
return TRUE;
}
DWORD GetNextPage(DWORD dwPageId)
{
DWORD dwNextPage = 0;
// Find the specified page
for(int i=0;i<m_nCount;i++)
if(m_rgdwPageIds[i] == dwPageId) break;
if(i>=m_nCount)
{
_ASSERTE(FALSE); // We could not find the current page
return 0;
}
// If we are not on the last page, return the 'next' page
if(i < (m_nCount-1))
dwNextPage = m_rgdwPageIds[i+1];
return dwNextPage;
}
DWORD GetPrevPage(DWORD dwPageId)
{
DWORD dwPrevPage = 0;
// Find the specified page
for(int i=0;i<m_nCount;i++)
if(m_rgdwPageIds[i] == dwPageId) break;
if(i>=m_nCount)
{
_ASSERTE(FALSE); // We could not find the current page
return 0;
}
// If we are not on the first page, return the 'prev' page
if(i > 0)
dwPrevPage = m_rgdwPageIds[i - 1];
return dwPrevPage;
}
DWORD GetFirstPage()
{
_ASSERTE(m_nCount); // only call if we have values in the class
return m_rgdwPageIds[0];
}
BOOL GrowArray(int nNewMax)
{
_ASSERTE(FALSE); // Not yet implemented
return FALSE;
}
protected:
int m_nCount;
DWORD m_rgdwPageIds[100]; // JMC: NOTE: We hard code a max of 100 pages that this
// object can support. 100 is reasonable, since wizards
// cannot currently support more than 100 pages.
};
class WizardPage
{
public:
WizardPage(LPPROPSHEETPAGE ppsp, int nIdTitle, int nIdSubTitle);
virtual ~WizardPage(VOID);
//
// Object is to apply settings to the system so that they take effect.
//
virtual LRESULT ApplySettings(VOID)
{ return 0; }
//
// Object reports if user has changed something in the wizard page.
//
virtual BOOL Changed(VOID)
{ return FALSE; }
//
// Object is to restore the original settings in effect when the page
// was first opened.
// Don't appy these to the system. Object will receive an
// ApplySettings notification when this is required.
//
virtual VOID RestoreOriginalSettings(VOID)
{ /* By default, nothing happens */ }
//
// Object is to restore the settings most previously applied.
// Don't appy these to the system. Object will receive an
// ApplySettings notification when this is required.
//
virtual VOID RestorePreviousSettings(VOID)
{ /* By default, nothing happens */ }
// This static member contains the order for all wizard pages in the app
static CWizardPageOrder sm_WizPageOrder;
protected:
HWND m_hwnd; // Dialog's hwnd.
DWORD m_dwPageId;
virtual BOOL AdjustWizPageOrder()
{
// Default does nothing
return TRUE;
}
//
// Derived classes override these to respond to page create/release
// notifications.
//
virtual UINT OnPropSheetPageCreate(HWND hwnd, LPPROPSHEETPAGE ppsp)
{ return 1; }
virtual UINT OnPropSheetPageRelease(HWND hwnd, LPPROPSHEETPAGE ppsp)
{ return 1; }
//
// Method for performing operations common to all wizard pages in response
// to given messages. This is the function given to the PROPSHEETPAGE struct.
//
static INT_PTR DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
protected:
//
// Prevent copying.
//
WizardPage(const WizardPage& rhs);
WizardPage& operator = (const WizardPage& rhs);
static UINT PropSheetPageCallback(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp);
virtual LRESULT HandleMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ return 0; }
virtual LRESULT OnInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ return 1; }
//
// Property sheet notifications.
//
virtual LRESULT OnPSN_Apply(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{ return 0; }
virtual LRESULT OnPSN_Help(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{ return 0; }
virtual LRESULT OnPSN_KillActive(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{ return 0; }
virtual LRESULT OnPSN_QueryCancel(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh);
virtual LRESULT OnPSN_Reset(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{ return 0; }
virtual LRESULT OnPSN_SetActive(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh);
virtual LRESULT OnPSN_WizBack(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{
AdjustWizPageOrder();
SetWindowLongPtr(hwnd, DWLP_MSGRESULT,
sm_WizPageOrder.GetPrevPage(m_dwPageId));
return TRUE;
}
virtual LRESULT OnPSN_WizNext(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{
AdjustWizPageOrder();
SetWindowLongPtr(hwnd, DWLP_MSGRESULT,
sm_WizPageOrder.GetNextPage(m_dwPageId));
return TRUE;
}
virtual LRESULT OnPSN_WizFinish(HWND hwnd, INT idCtl, LPPSHNOTIFY pnmh)
{ return 0; }
virtual LRESULT OnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ return 0; }
virtual LRESULT OnDrawItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ return 0; }
virtual LRESULT OnTimer(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ return 0; }
virtual BOOL OnMsgNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh)
{ return 0; }
LRESULT OnPSM_QuerySiblings(HWND hwnd, WPARAM wParam, LPARAM lParam);
LRESULT OnNotify(HWND hwnd, WPARAM wParam, LPARAM lParam);
};
#endif // __WIZARD_PAGE_H