// Profile.h: interface of the CProfile class
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)
#define AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include    // for Windows NT
#include "resource.h"

#define PROCESS_SIZE        MAX_PATH

//
// Function pointer types for accessing Toolhelp32 functions dynamically.
// By dynamically accessing these functions, we can do so only on Windows
// 95 and still run on Windows NT, which does not have these functions.
//
#include   // for Windows 95
typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);

typedef struct _TASK_LIST {
    DWORD dwProcessId;
    CHAR ProcessName[PROCESS_SIZE];
} TASK_LIST, *PTASK_LIST;

enum {MAX_TASKS		=   256};

enum KEY_TYPE {NORMAL_KEY, PUSHED_KEY, DROPPABLE_KEY, ORIGINAL_KEY, REMAPPED_KEY, REMAPPED_PUSHED_KEY};

typedef struct ScanCode
{
	BYTE nScanCode;
	BYTE nPrefixedScanCode;	// 0x00, 0xE0 or 0xE1	cf. Keyboard Scan Code Specification -- 16
} ScanCode_t;

typedef struct ScanCodeMapping
{
	ScanCode_t current;
	ScanCode_t original;
} ScanCodeMapping_t;

class CKey;

typedef struct KeyboardLayout
{
	ScanCode_t scancode;
	int nBaseControlID;
	int nCurrentControlID;
	int nToolTipID;
	CKey *pBaseKey;
	CKey *pCurrentKey;
} KeyboardLayout_t;

static KeyboardLayout_t KeyboardLayouts[] = {
	{{0x01, 0x00}, IDC_ESC,				IDC_ESC_,			IDS_ESC},
	{{0x02, 0x00}, IDC_1,				IDC_1_,				IDS_1},
	{{0x03, 0x00}, IDC_2,				IDC_2_,				IDS_2},
	{{0x04, 0x00}, IDC_3,				IDC_3_,				IDS_3},
	{{0x05, 0x00}, IDC_4,				IDC_4_,				IDS_4},
	{{0x06, 0x00}, IDC_5,				IDC_5_,				IDS_5},
	{{0x07, 0x00}, IDC_6,				IDC_6_,				IDS_6},
	{{0x08, 0x00}, IDC_7,				IDC_7_,				IDS_7},
	{{0x09, 0x00}, IDC_8,				IDC_8_,				IDS_8},
	{{0x0a, 0x00}, IDC_9,				IDC_9_,				IDS_9},
	{{0x0b, 0x00}, IDC_0,				IDC_0_,				IDS_0_},
	{{0x0c, 0x00}, IDC_MINUS,			IDC_MINUS_,			IDS_MINUS},
	{{0x0d, 0x00}, IDC_EQUAL,			IDC_EQUAL_,			IDS_EQUAL},		// =		/// ^
	{{0x0e, 0x00}, IDC_BACKSPACE,		IDC_BACKSPACE_,		IDS_BACKSPACE},
	{{0x0f, 0x00}, IDC_TAB,				IDC_TAB_,			IDS_TAB},
	{{0x10, 0x00}, IDC_Q,				IDC_Q_,				IDS_Q},
	{{0x11, 0x00}, IDC_W,				IDC_W_,				IDS_W},
	{{0x12, 0x00}, IDC_E,				IDC_E_,				IDS_E},
	{{0x13, 0x00}, IDC_R,				IDC_R_,				IDS_R},
	{{0x14, 0x00}, IDC_T,				IDC_T_,				IDS_T},
	{{0x15, 0x00}, IDC_Y,				IDC_Y_,				IDS_Y},
	{{0x16, 0x00}, IDC_U,				IDC_U_,				IDS_U},
	{{0x17, 0x00}, IDC_I,				IDC_I_,				IDS_I},
	{{0x18, 0x00}, IDC_O,				IDC_O_,				IDS_O},
	{{0x19, 0x00}, IDC_P,				IDC_P_,				IDS_P},
	{{0x1a, 0x00}, IDC_SQUARE_BRA,		IDC_SQUARE_BRA_,	IDS_SQUARE_BRA},	// 101/104: [, 106/109: @
	{{0x1b, 0x00}, IDC_SQUARE_CKET,		IDC_SQUARE_CKET_,	IDS_SQUARE_CKET},	// 101/104: ], 106/109: [
	{{0x1c, 0x00}, IDC_ENTER,			IDC_ENTER_,			IDS_ENTER},
	{{0x1c, 0xe0}, IDC_NUMPADENTER,		IDC_NUMPADENTER_,	IDS_NUMPADENTER},
	{{0x1d, 0x00}, IDC_LEFT_CTRL,		IDC_LEFT_CTRL_,		IDS_LEFT_CTRL},
	{{0x1d, 0xe0}, IDC_RIGHT_CTRL,		IDC_RIGHT_CTRL_,	IDS_RIGHT_CTRL},
	{{0x1d, 0xe1}, IDC_PAUSE,			IDC_PAUSE_,			IDS_PAUSE},
	{{0x1e, 0x00}, IDC_A,				IDC_A_,				IDS_A},
	{{0x1f, 0x00}, IDC_S,				IDC_S_,				IDS_S},
	{{0x20, 0x00}, IDC_D,				IDC_D_,				IDS_D},
	{{0x21, 0x00}, IDC_F,				IDC_F_,				IDS_F},
	{{0x22, 0x00}, IDC_G,				IDC_G_,				IDS_G},
	{{0x23, 0x00}, IDC_H,				IDC_H_,				IDS_H},
	{{0x24, 0x00}, IDC_J,				IDC_J_,				IDS_J},
	{{0x25, 0x00}, IDC_K,				IDC_K_,				IDS_K},
	{{0x26, 0x00}, IDC_L,				IDC_L_,				IDS_L},
	{{0x27, 0x00}, IDC_SEMICOLON,		IDC_SEMICOLON_,		IDS_SEMICOLON},
	{{0x28, 0x00}, IDC_QUOTE,			IDC_QUOTE_,			IDS_QUOTE},		// 101/104: ', 106/109: :
	{{0x29, 0x00}, IDC_BACK_QUOTE,		IDC_BACK_QUOTE_,	IDS_BACK_QUOTE},	// 101/104: `, 106/109: hankaku/zenkaku
	{{0x2a, 0x00}, IDC_LEFT_SHIFT,		IDC_LEFT_SHIFT_,	IDS_LEFT_SHIFT},
	{{0x2b, 0x00}, IDC_BACKSLASH,		IDC_BACKSLASH_,		IDS_BACKSLASH},	// 101/104: \, 106/109: ]
	{{0x2c, 0x00}, IDC_Z,				IDC_Z_,				IDS_Z},
	{{0x2d, 0x00}, IDC_X,				IDC_X_,				IDS_X},
	{{0x2e, 0x00}, IDC_C,				IDC_C_,				IDS_C},
	{{0x2f, 0x00}, IDC_V,				IDC_V_,				IDS_V},
	{{0x30, 0x00}, IDC_B,				IDC_B_,				IDS_B},
	{{0x31, 0x00}, IDC_N,				IDC_N_,				IDS_N},
	{{0x32, 0x00}, IDC_M,				IDC_M_,				IDS_M},
	{{0x33, 0x00}, IDC_COMMA,			IDC_COMMA_,			IDS_COMMA},
	{{0x34, 0x00}, IDC_PERIOD,			IDC_PERIOD_,		IDS_PERIOD},
	{{0x35, 0x00}, IDC_SLASH,			IDC_SLASH_,			IDS_SLASH},
	{{0x35, 0xe0}, IDC_DIVIDE,			IDC_DIVIDE_,		IDS_DIVIDE},
	{{0x36, 0x00}, IDC_RIGHT_SHIFT,		IDC_RIGHT_SHIFT_,	IDS_RIGHT_SHIFT},
	{{0x37, 0x00}, IDC_MULTIPLY,		IDC_MULTIPLY_,		IDS_MULTIPLY},
	{{0x37, 0xe0}, IDC_PRINT_SCREEN,	IDC_PRINT_SCREEN_,	IDS_PRINT_SCREEN},
	{{0x38, 0x00}, IDC_LEFT_ALT,		IDC_LEFT_ALT_,		IDS_LEFT_ALT},
	{{0x38, 0xe0}, IDC_RIGHT_ALT,		IDC_RIGHT_ALT_,		IDS_RIGHT_ALT},
	{{0x39, 0x00}, IDC_SPACE,			IDC_SPACE_,			IDS_SPACE},
	{{0x3a, 0x00}, IDC_CAPS_LOCK,		IDC_CAPS_LOCK_,		IDS_CAPS_LOCK},
	{{0x3b, 0x00}, IDC_F1,				IDC_F1_,			IDS_F1},
	{{0x3c, 0x00}, IDC_F2,				IDC_F2_,			IDS_F2},
	{{0x3d, 0x00}, IDC_F3,				IDC_F3_,			IDS_F3},
	{{0x3e, 0x00}, IDC_F4,				IDC_F4_,			IDS_F4},
	{{0x3f, 0x00}, IDC_F5,				IDC_F5_,			IDS_F5},
	{{0x40, 0x00}, IDC_F6,				IDC_F6_,			IDS_F6},
	{{0x41, 0x00}, IDC_F7,				IDC_F7_,			IDS_F7},
	{{0x42, 0x00}, IDC_F8,				IDC_F8_,			IDS_F8},
	{{0x43, 0x00}, IDC_F9,				IDC_F9_,			IDS_F9},
	{{0x44, 0x00}, IDC_F10,				IDC_F10_,			IDS_F10},
	{{0x45, 0xe0}, IDC_NUM_LOCK,		IDC_NUM_LOCK_,		IDS_NUM_LOCK},
	{{0x46, 0x00}, IDC_SCROLL_LOCK,		IDC_SCROLL_LOCK_,	IDS_SCROLL_LOCK},
	{{0x47, 0x00}, IDC_NUMPAD7,			IDC_NUMPAD7_,		IDS_NUMPAD7},
	{{0x47, 0xe0}, IDC_HOME,			IDC_HOME_,			IDS_HOME},
	{{0x48, 0x00}, IDC_NUMPAD8,			IDC_NUMPAD8_,		IDS_NUMPAD8},
	{{0x48, 0xe0}, IDC_UP,				IDC_UP_,			IDS_UP},
	{{0x49, 0x00}, IDC_NUMPAD9,			IDC_NUMPAD9_,		IDS_NUMPAD9},
	{{0x49, 0xe0}, IDC_PAGE_UP,			IDC_PAGE_UP_,		IDS_PAGE_UP},
	{{0x4a, 0x00}, IDC_SUBTRACT,		IDC_SUBTRACT_,		IDS_SUBTRACT},
	{{0x4b, 0x00}, IDC_NUMPAD4,			IDC_NUMPAD4_,		IDS_NUMPAD4},
	{{0x4b, 0xe0}, IDC_LEFT,			IDC_LEFT_,			IDS_LEFT},
	{{0x4c, 0x00}, IDC_NUMPAD5,			IDC_NUMPAD5_,		IDS_NUMPAD5},
	{{0x4d, 0x00}, IDC_NUMPAD6,			IDC_NUMPAD6_,		IDS_NUMPAD6},
	{{0x4d, 0xe0}, IDC_RIGHT,			IDC_RIGHT_,			IDS_RIGHT},
	{{0x4e, 0x00}, IDC_ADD,				IDC_ADD_,			IDS_ADD},
	{{0x4f, 0x00}, IDC_NUMPAD1,			IDC_NUMPAD1_,		IDS_NUMPAD1},
	{{0x4f, 0xe0}, IDC_END,				IDC_END_,			IDS_END},
	{{0x50, 0x00}, IDC_NUMPAD2,			IDC_NUMPAD2_,		IDS_NUMPAD2},
	{{0x50, 0xe0}, IDC_DOWN,			IDC_DOWN_,			IDS_DOWN},
	{{0x51, 0x00}, IDC_NUMPAD3,			IDC_NUMPAD3_,		IDS_NUMPAD3},
	{{0x51, 0xe0}, IDC_PAGE_DOWN,		IDC_PAGE_DOWN_,		IDS_PAGE_DOWN},
	{{0x52, 0x00}, IDC_NUMPAD0,			IDC_NUMPAD0_,		IDS_NUMPAD0},
	{{0x52, 0xe0}, IDC_INSERT,			IDC_INSERT_,		IDS_INSERT},
	{{0x53, 0x00}, IDC_NUMPADDELETE,	IDC_NUMPADDELETE_,	IDS_NUMPADDELETE},
	{{0x53, 0xe0}, IDC_DELETE,			IDC_DELETE_,		IDS_DELETE},
	{{0x57, 0x00}, IDC_F11,				IDC_F11_,			IDS_F11},
	{{0x58, 0x00}, IDC_F12,				IDC_F12_,			IDS_F12},
	{{0x5b, 0xe0}, IDC_LEFT_WINDOWS,	IDC_LEFT_WINDOWS_,	IDS_LEFT_WINDOWS},
	{{0x5c, 0xe0}, IDC_RIGHT_WINDOWS,	IDC_RIGHT_WINDOWS_,	IDS_RIGHT_WINDOWS},
	{{0x5d, 0xe0}, IDC_APPLICATION,		IDC_APPLICATION_,	IDS_APPLICATION},
	{{0x5e, 0xe0}, IDC_ACPI_POWER,		IDC_ACPI_POWER_,	IDS_ACPI_POWER},
	{{0x5f, 0xe0}, IDC_ACPI_SLEEP,		IDC_ACPI_SLEEP_,	IDS_ACPI_SLEEP},
	{{0x63, 0xe0}, IDC_ACPI_WAKE,		IDC_ACPI_WAKE_,		IDS_ACPI_WAKE},
	{{0x70, 0x00}, IDC_KANA,			IDC_KANA_,			IDS_KANA},
	{{0x73, 0x00}, IDC_BACKSLASH2,		IDC_BACKSLASH2_,	IDS_BACKSLASH2},	// \  ,./\ 
	{{0x79, 0x00}, IDC_CONVERT,			IDC_CONVERT_,		IDS_CONVERT},
	{{0x7b, 0x00}, IDC_NONCONVERT,		IDC_NONCONVERT_,	IDS_NONCONVERT},
	{{0x7d, 0x00}, IDC_BACKSLASH1,		IDC_BACKSLASH1_,	IDS_BACKSLASH1},	// \  -^\ 
};

class CProfile
{
public:
	static void SetEnableCUA(int nApplicationID, BOOL bEnableCUA);
	static BOOL GetEnableCUA(int nApplicationID);
	static void ImportProperties();
	static void ExportProperties();
	static KeyboardLayout_t* GetKeyboardLayouts(int nKey);
	static int GetToolTipID(int nToolTipID);
	static void SetNoCursor();
	static void SetNormalCursor();
	static void SetDraggingCursor();
	static void SetScanCodeMap(ScanCodeMapping_t ScanCodeMappeing);
	static int GetCurrentControlID(ScanCode_t scancode);
	static int GetBaseControlID(ScanCode_t scancode);
	static BOOL GetScanCodeMap(ScanCode_t original, ScanCode_t *current);
	static void RestartComputer();
	static BOOL IsNT();
	static BOOL Is9x();
	static void SaveScanCodeMap();
	static void LoadScanCodeMap();
	static BOOL Is106Keyboard();
	static BOOL IsDialog(CString sz);
	static BOOL GetUseDefaultSetting(int nApplicationID);
	static void SetUseDialogSetting(int nApplicationID, BOOL bUseDialogSetting);
	static int GetApplicationIndex(CString szApplicationName);
	static void CopyData(CString szDestinationApplication, CString szSourceApplication);
	static void ReadKeyBind(int *pnCommandType, int *pnKey, char *szKeyBind);
	static char * Key2String(int nKey);
	static char * CommandType2String(int nCommandType);
	static int GetCurrentApplicationID(CComboBox *cApplicationList, CString szCurrentApplication);
	static int GetKillRingMax(int nApplicationID);
	static void SetKillRingMax(int nApplicationID, int nKillRingMax);
	static int GetCommandID(int nApplicationID, int nCommandType, int nKey);
	static void SetCommandID(int nApplicationID, int nCommandType, int nKey, int nCommandID);
	static void UpdateApplicationTitle(CComboBox *cApplicationList, CString szCurrentApplication, int nApplicationID, BOOL bSaveAndValidate);
	static void GetApplicationTitle(CComboBox *cApplicationList, CString &rList, int nIndex = -1);
	static BOOL IsDefault(CString sz);
	static int GetApplicationIndex(CString szApplicationName, BOOL bSaveAndValidate, int *nSettingStyle);
	static TASK_LIST m_TaskList[MAX_TASKS];
	static DWORD m_dwTasks;
	static void InitApplicationList(CComboBox *cApplicationList);
	static int GetSavedSettingCount();
	static void ClearData(CString szCurrentApplication);
	static void InitDllData();
	static void SaveRegistryData();
	static void LoadRegistryData();
	CProfile();
	virtual ~CProfile();

private:
	static void SaveKeyBind(CString szApplicationName, CString szCommandName, int nCommandType, int nKey);
	static BOOL DiableTokenPrivileges();
	static BOOL AdjustTokenPrivileges(LPCTSTR lpName);
	static void SaveCommand(CString szApplicationName, int nCommandID);
	static void SaveKeyBind(CString szApplicationName, int nCommandID, int nCommandType, int nKey);
	static void AddKeyBind2C_(CString szApplicationName, BYTE bVk);
	static void LevelUp();
	static BOOL ChangedKeyboardLayout();
	static BYTE PrefixedScanCodeID2Code(int nPrefixedScanCodeID);
	static DWORD GetScanCodeLength();
	static int PrefixedScanCode2ID(BYTE nPrefixedScanCode);
	static ScanCode_t CurrentScanCodeMap[4][256];
	static ScanCode_t ScanCodeMap[4][256];
	static int GetControlID(ScanCode_t scancode, BOOL bBase);
	static void Item2AppName(CString *sz);
	static int IsNotSameString(CComboBox *pApplication, CString szListItem);
	static int CountSeparator(CString szMainString, CString szSeparator);
	static void GetNthString(CString *szAppName, CString szWindowName, CString szSeparator, int n);
	static void GetAppName(CString *szAppName, char *pWindowName);
	static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
	static BOOL IsTheString(CString sz, UINT nID);
	static PPERF_DATA_BLOCK GetPerformanceData(CString szProcessName);
	static BOOL GetProcessInfo(CString *szProcessName, DWORD *dwProcessId);
	static LPBYTE GetCounters();
	static void SetDllData();
	static CXkeymacsData m_XkeymacsData[MAX_APP];
	static void DeleteAllRegistryData();
	static DWORD GetTaskListNT(PTASK_LIST pTask, DWORD dwNumTasks);
	static DWORD GetTaskList(PTASK_LIST pTask, DWORD dwNumTasks);
	static BOOL IsCommandType(int nCommandType, char *szKeyBind);
	static int KeyBind2Key(char *szKey);
	static int KeyBind2CommandType(char *szKeyBind);
	static CString WriteKeyBind(int nCommandType, int nKey);
	static void UpdateRegistryData(BOOL bSaveAndValidate);
};

typedef struct CommandTypeName
{
	int nCommandType;
	char *szCommandTypeName;
} CommandTypeName_t;

static const CommandTypeName_t CommandTypes[] = {
	{NONE,							""},
	{SHIFT,							"Shift+"},
	{CONTROL,						"Ctrl+"},
	{CONTROL+SHIFT,					"Ctrl+Shift+"},
	{META,							"Meta+"},
	{META+SHIFT,					"Meta+Shift+"},
	{CONTROL+META,					"Ctrl+Meta+"},
	{CONTROL+META+SHIFT,			"Ctrl+Meta+Shift+"},
	{CONTROLX+NONE,					"Ctrl+X "},
	{CONTROLX+SHIFT,				"Ctrl+X Shift+"},
	{CONTROLX+CONTROL,				"Ctrl+X Ctrl+"},
	{CONTROLX+CONTROL+SHIFT,		"Ctrl+X Ctrl+Shift+"},
	{CONTROLX+META,					"Ctrl+X Meta+"},
	{CONTROLX+META+SHIFT,			"Ctrl+X Meta+Shift+"},
	{CONTROLX+CONTROL+META,			"Ctrl+X Ctrl+Meta+"},
	{CONTROLX+CONTROL+META+SHIFT,	"Ctrl+X Ctrl+Meta+Shift+"},
};


#endif // !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)

(C) 2001-2005 oishi@cam.hi-ho.ne.jp