// OptionsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "xkeymacs.h"
#include "OptionsDlg.h"
#include "MainFrm.h"
#include "Profile.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COptionsDlg dialog


COptionsDlg::COptionsDlg(CWnd *pParent /*=NULL*/)
	: CDialog(COptionsDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(COptionsDlg)
	//}}AFX_DATA_INIT
}

COptionsDlg::~COptionsDlg()
{
}

void COptionsDlg::DoDataExchange(CDataExchange *pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COptionsDlg)
	DDX_Control(pDX, IDC_M_, m_cM_);
	DDX_Control(pDX, IDC_ALT, m_cAlt);
	DDX_Control(pDX, IDC_SHIFT, m_cShift);
	DDX_Control(pDX, IDC_CTRL, m_cCtrl);
	DDX_Control(pDX, IDC_C_X_, m_cCx);
	DDX_Control(pDX, IDC_FILE_COMPLETION, m_cFileCompletion);
	DDX_Control(pDX, IDC_AUTO_RUN, m_cAutoRun);
	DDX_Control(pDX, IDOK, m_cOK);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)
	//{{AFX_MSG_MAP(COptionsDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptionsDlg message handlers

BOOL COptionsDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	// clear all check
	m_cAutoRun.SetCheck(0);
	m_cCx.SetCheck(0);
	m_cM_.SetCheck(0);
	m_cShift.SetCheck(0);
	m_cCtrl.SetCheck(0);
	m_cAlt.SetCheck(0);

	// for auto run
	{
		TCHAR szFileName[MAX_PATH] = {'\0'};
		GetModuleFileName(NULL, szFileName, sizeof(szFileName));
		HKEY hKey = NULL;

		if (RegOpenKeyEx(HKEY_CURRENT_USER,  CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS
		 || RegOpenKeyEx(HKEY_LOCAL_MACHINE, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
			DWORD dwType = REG_SZ;
			TCHAR szSavedFileName[MAX_PATH] = {'\0'};
			DWORD dwBufLen = sizeof(szSavedFileName);
			RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), NULL, &dwType,
							(LPBYTE)szSavedFileName, &dwBufLen);
			RegCloseKey(hKey);

			if (!strnicmp(szFileName, szSavedFileName, sizeof(szFileName))) {
				m_cAutoRun.SetCheck(1);
			}
		}
	}

	// for file and directory name completion
	if (CProfile::IsNT()) {
		HKEY hKey = NULL;

		if (RegOpenKeyEx(HKEY_CURRENT_USER,  CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS
		 || RegOpenKeyEx(HKEY_LOCAL_MACHINE, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
			DWORD dwType = REG_DWORD;
			DWORD dwCompletionChar = 0;
			DWORD dwcbData = sizeof(dwCompletionChar);
			RegQueryValueEx(hKey, CString(MAKEINTRESOURCE(IDS_COMPLETION_CHAR)), NULL, &dwType,
							(LPBYTE)&dwCompletionChar, &dwcbData);
			RegCloseKey(hKey);
			if (dwCompletionChar == 0x9) {
				m_cFileCompletion.SetCheck(1);
			}
		}
	} else if (CProfile::Is9x()) {
		m_cFileCompletion.EnableWindow(FALSE);
	}

	// for icons in the taskbar's status area
	m_cCx.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), 0));
	m_cM_.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), 0));
	m_cShift.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), 0));
	m_cCtrl.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), 0));
	m_cAlt.SetCheck(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), 0));

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void COptionsDlg::OnOK() 
{
	// TODO: Add extra validation here
	// for auto run
	{
		TCHAR szFileName[MAX_PATH] = {'\0'};
		GetModuleFileName(NULL, szFileName, sizeof(szFileName));
		HKEY hKey = NULL;

		DWORD dwDisposition;
		if (RegCreateKeyEx(HKEY_CURRENT_USER, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_AUTORUN)), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) {
			if (m_cAutoRun.GetCheck() == 1) {
				RegSetValueEx(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), 0, REG_SZ, (LPBYTE)szFileName, strlen(szFileName));
			} else {
				RegDeleteValue(hKey, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)));
			}
			RegCloseKey(hKey);
		}
	}

	// for file and directory name completion
	if (CProfile::IsNT()) {
		HKEY hKey = NULL;

		if (RegCreateKeyEx(HKEY_CURRENT_USER, CString(MAKEINTRESOURCE(IDS_REGSUBKEY_FILE_COMPLETION)), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
			DWORD dwCompletionChar;
			if (m_cFileCompletion.GetCheck() == 1) {
				dwCompletionChar = 0x9;	// use enum
			} else {
				dwCompletionChar = 0x0;
			}
			RegSetValueEx(hKey, CString(MAKEINTRESOURCE(IDS_COMPLETION_CHAR)), 0, REG_DWORD,
						  (LPBYTE)&dwCompletionChar, sizeof(dwCompletionChar));
			RegCloseKey(hKey);
		}
	}

	// for icons in the taskbar's status area
	{
		// write data in registry
		AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), m_cCx.GetCheck());
		AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), m_cM_.GetCheck());
		AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), m_cShift.GetCheck());
		AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), m_cCtrl.GetCheck());
		AfxGetApp()->WriteProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), m_cAlt.GetCheck());

		// set dll data
		CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();
		pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(CX_ICON, m_cCx.GetCheck());
		pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(META_ICON, m_cM_.GetCheck());
		pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(SHIFT_ICON, m_cShift.GetCheck());
		pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(CTRL_ICON, m_cCtrl.GetCheck());
		pMainFrame->m_pXkeymacsDll->EnableShell_NotifyIcon(ALT_ICON, m_cAlt.GetCheck());
	}

	CDialog::OnOK();
}

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