//Copyright (c) 1997-2000 Microsoft Corporation
#ifndef _INC_ACCWIZ_H
#define _INC_ACCWIZ_H

#include "schemes.h" // For SCHEMEDATALOCAL
#include "resource.h"

// Helper function
void LoadArrayFromStringTable(int nIdString, int *rgnValues, int *pnCountValues);

// Macros used to save debug info to/from the INI file
// JMC: HACK - Default to '1' for options!!!!!!!!
#define GET_SAVED_INT(xxx) xxx = GetPrivateProfileInt(__TEXT("Options"), __TEXT(#xxx), 1, __TEXT("AccWiz.ini"))
#define PUT_SAVED_INT(xxx) wsprintf(sz, __TEXT("%i"), xxx);WritePrivateProfileString(__TEXT("Options"), __TEXT(#xxx), sz, __TEXT("AccWiz.ini"))

// This class contains the general options for the whole wizard
class CAccWizOptions
{
public:
	CAccWizOptions()
	{
    }
	~CAccWizOptions()
	{
	}
    void InitAccWizOptions()
    {
		OSVERSIONINFO osvi;
		ZeroMemory(&osvi, sizeof(osvi));
		osvi.dwOSVersionInfoSize = sizeof(osvi);
		GetVersionEx(&osvi);
		m_bWin95 = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);

		m_nMinimalFontSize = -1; // This will be set by the welcome page

		///////////////////////////////////////////////
		// Calculate globals that we need
 		HDC hDC = GetDC(NULL);
		m_nLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY);
		ReleaseDC(NULL, hDC);



		///////////////////////////////////////////////
		// Get the default char set for fonts
		TCHAR szCharSet[20];
		if(LoadString(g_hInstDll,IDS_FONTCHARSET, szCharSet,sizeof(szCharSet)/sizeof(TCHAR))) {
			m_lfCharSet = (BYTE)_tcstoul(szCharSet,NULL,10);
		} else {
			m_lfCharSet = 0; // Default
		}

		///////////////////////////////////////////////
		// Get the standard MS Sans Serif fonts
		// JMC: HACK - Free these resources
		int rgnStandardMSSansSerifFontSizes[] = {8, 10, 12, 14, 18, 24};
		LOGFONT lf;
		ZeroMemory(&lf, sizeof(lf));
		lf.lfCharSet = m_lfCharSet;
		LoadString(g_hInstDll, IDS_SYSTEMFONTNAME, lf.lfFaceName, ARRAYSIZE(lf.lfFaceName));
		

		for(int i=0;i<6;i++)
		{
			lf.lfHeight = 0 - (int)((float)m_nLogPixelsY * (float)rgnStandardMSSansSerifFontSizes[i]/ (float)72 + (float).5);
			m_rgnStdMSSansSerifFonts[i] = CreateFontIndirect(&lf);

			// Create underlined version
			lf.lfUnderline = 1;
			m_rgnStdMSSansSerifFonts[i + 6] = CreateFontIndirect(&lf);
			lf.lfUnderline = 0;

		}
		
		// Store away original non-client metrics
		// Get original metrics
		GetNonClientMetrics(&m_ncmOrig, &m_lfIconOrig);

		// Load original Wiz Scheme settings
		m_schemeOriginal.LoadOriginal();

		// Copy to the Preview scheme and to the current scheme
		m_schemePreview = m_schemeOriginal;
		m_schemeCurrent = m_schemeOriginal;

		// This is set by the welcome page, so that the second part knows to update it's check boxes.
		// The second page clears this flag
		m_bWelcomePageTouched = FALSE;

		// this is the default windows settings (for Win2K not necessarilly for Whistler)
		m_schemeWindowsDefault.SetToWindowsDefault();
#ifdef _DEBUG
		m_schemeOriginal.Dump();
#endif
	}

	void RestoreOriginalColorsToPreview()
	{
		memcpy(m_schemePreview.m_rgb, m_schemeOriginal.m_rgb, sizeof(m_schemePreview.m_rgb));
	}

	void ApplyPreview()
	{
		m_schemeCurrent.ApplyChanges(m_schemePreview);
	}
    void ApplyOriginal()
    {
        m_schemeCurrent.ApplyChanges(m_schemeOriginal, &m_ncmOrig, &m_lfIconOrig);
	}
	
    void ApplyWindowsDefault();

	BOOL m_bWelcomePageTouched;

	int m_nLogPixelsY;

	int m_nMinimalFontSize;

	HFONT GetClosestMSSansSerif(int nPointSize, BOOL bUnderlined = FALSE)
	{
		// For Underlined fonts, add '6' the the index
		int nOffset = bUnderlined?6:0;

		if(nPointSize <= 8)
			return m_rgnStdMSSansSerifFonts[0 + nOffset];
		else if(nPointSize <= 10)
			return m_rgnStdMSSansSerifFonts[1 + nOffset];
		else if(nPointSize <= 12)
			return m_rgnStdMSSansSerifFonts[2 + nOffset];
		else if(nPointSize <= 14)
			return m_rgnStdMSSansSerifFonts[3 + nOffset];
		else if(nPointSize <= 18)
			return m_rgnStdMSSansSerifFonts[4 + nOffset];
		return m_rgnStdMSSansSerifFonts[5];
	}

	void ReportChanges(HWND hwndChanges)
	{
		m_schemeCurrent.ReportChanges(m_schemeOriginal, hwndChanges);
	}

	BOOL m_bWin95;
	BYTE m_lfCharSet;

	WIZSCHEME m_schemePreview;
	WIZSCHEME m_schemeOriginal;

protected:
	// Dialogs never modify these copies of the scheme
	WIZSCHEME m_schemeCurrent;
	WIZSCHEME m_schemeWindowsDefault;

	NONCLIENTMETRICS m_ncmOrig;
	LOGFONT m_lfIconOrig;

	HFONT m_rgnStdMSSansSerifFonts[6 * 2]; // 0-5 are for 8, 10, 12, 14, 18, 24.  6-11 are for the same things, but underlined

	friend class CWelcome2Pg; // TODO: HACK - This is only here to give CWelcome2Pg access to m_schemeCurrent
};

// This variable will be accessible to any derived wizard page.
// It contains information specific to this application
extern CAccWizOptions g_Options;


VOID WINAPI AccWiz_RunDllA(HWND hwnd, HINSTANCE hInstance, LPSTR pszCmdLine, INT nCmdShow);
VOID WINAPI AccWiz_RunDllW(HWND hwnd, HINSTANCE hInstance, LPWSTR pszCmdLine, INT nCmdShow);

#endif // _INC_ACCWIZ_H
