// File: CplMain.cpp

#include "precomp.h"
#include "resource.h"
#include "Conf.h"
#include "ConfCpl.h"
#include "confwnd.h"
#include "ConfPolicies.h"

//*** Global Data *****************************************************

// Global flag keeps setting that changed for windows msg broadcast
DWORD g_dwChangedSettings = 0;

BOOL g_fInOptionsDialog = FALSE;

static const int nMaxPropPages = 7;

INT_PTR CreatePropSheet(HWND hwndOwner, HINSTANCE hInst, int nStartPage)
{
	int pageMap[nMaxPropPages];
	ZeroMemory(&pageMap, sizeof(pageMap));

	PROPSHEETPAGE psp[nMaxPropPages];
	ZeroMemory(&psp, sizeof(psp));

	RegEntry rePol(POLICIES_KEY, HKEY_CURRENT_USER);
	RegEntry reAudio(AUDIO_KEY, HKEY_CURRENT_USER);

    ASSERT(nStartPage < nMaxPropPages);

    int nPages = 0;

    if (!rePol.GetNumber( REGVAL_POL_NO_GENERALPAGE,
								DEFAULT_POL_NO_GENERALPAGE ))
	{
        pageMap[OPTIONS_GENERAL_PAGE] = nPages;
		FillInPropertyPage(&psp[nPages++], IDD_OPT_GENERAL,
				UserDlgProc);
		ASSERT(nPages <= nMaxPropPages);
	}
	if (!rePol.GetNumber( REGVAL_POL_NO_SECURITYPAGE,
								DEFAULT_POL_NO_SECURITYPAGE ))
	{
		pageMap[OPTIONS_SECURITY_PAGE] = nPages;
		FillInPropertyPage(&psp[nPages++], IDD_SECURITY,
				SecurityDlgProc);
		ASSERT(nPages <= nMaxPropPages);

	}
	if (!rePol.GetNumber( REGVAL_POL_NO_AUDIOPAGE,
								DEFAULT_POL_NO_AUDIOPAGE ) &&
		!rePol.GetNumber( REGVAL_POL_NO_AUDIO,
								DEFAULT_POL_NO_AUDIO) &&
		ISSOUNDCARDPRESENT(reAudio.GetNumber( REGVAL_SOUNDCARDCAPS,
								SOUNDCARD_NONE)) )
	{
        pageMap[OPTIONS_AUDIO_PAGE] = nPages;
		FillInPropertyPage(&psp[nPages++], IDD_AUDIO,
				AudioDlgProc);
		ASSERT(nPages <= nMaxPropPages);
	}
	if (!rePol.GetNumber( REGVAL_POL_NO_VIDEOPAGE,
								DEFAULT_POL_NO_VIDEOPAGE ) &&
		(!rePol.GetNumber( REGVAL_POL_NO_VIDEO_SEND,
								DEFAULT_POL_NO_VIDEO_SEND) ||
		!rePol.GetNumber( REGVAL_POL_NO_VIDEO_RECEIVE,
								DEFAULT_POL_NO_VIDEO_RECEIVE)))
	{
        pageMap[OPTIONS_VIDEO_PAGE] = nPages;
		FillInPropertyPage(&psp[nPages++], IDD_VIDEO,
				VideoDlgProc);
		ASSERT(nPages <= nMaxPropPages);
	}

	// If no pages are allowed, tell the user and get out
	if ( !nPages ) {
		ConfMsgBox ( hwndOwner, (LPCTSTR)IDS_ALLPAGESDISABLED );
		return 0;
	}

	PROPSHEETHEADER psh;
	InitStruct(&psh);

	psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
	psh.hwndParent = hwndOwner;
	psh.hInstance = hInst;
	ASSERT(NULL == psh.hIcon);
	psh.pszCaption = (LPSTR)IDS_CPLNAME;
	psh.nPages = nPages;
	psh.nStartPage = pageMap[nStartPage];
	psh.ppsp = (LPCPROPSHEETPAGE) &psp;

	return (PropertySheet(&psh));
}


/*	L A U N C H  C O N F  C P L  */
/*-------------------------------------------------------------------------
	%%Function: LaunchConfCpl

-------------------------------------------------------------------------*/
VOID LaunchConfCpl(HWND hwnd, int nStartPage)
{

	if (g_fInOptionsDialog)
	{
		return;
	}

	g_fInOptionsDialog = TRUE;
    CreatePropSheet(hwnd, GetInstanceHandle(), nStartPage);
	g_fInOptionsDialog = FALSE;

	// Broadcast change notification if anything changed
	if (g_dwChangedSettings)
	{
		HandleConfSettingsChange(g_dwChangedSettings);
		g_dwChangedSettings = 0;
	}
}

BOOL CanLaunchConfCpl()
{
	return !g_fInOptionsDialog;
}