// Properties.cpp : implementation file
//

#include "stdafx.h"
#include "xkeymacs.h"
#include "Profile.h"
#include "Properties.h"

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

/////////////////////////////////////////////////////////////////////////////
// CProperties dialog


CProperties::CProperties(CWnd* pParent /*=NULL*/)
	: CDialog(CProperties::IDD, pParent)
{
	m_nApplicationID = 0;
	//{{AFX_DATA_INIT(CProperties)
	m_nSettingStyle = -1;
	m_nKillRingMax = 0;
	//}}AFX_DATA_INIT
}


void CProperties::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProperties)
	DDX_Control(pDX, IDC_KILL_RING_MAX, m_cKillRingMax);
	DDX_Control(pDX, IDC_USE_DIALOG_SETTING, m_cUseDialogSetting);
	DDX_Control(pDX, IDC_SELECT_ALL, m_cSelectAll);
	DDX_Control(pDX, IDC_CLEAR_ALL, m_cClearAll);
	DDX_Control(pDX, IDC_LOAD_DEFAULT, m_cLoadDefault);
	DDX_Control(pDX, IDC_APPLICATION, m_cApplication);
	DDX_Radio(pDX, IDC_SETTING_DEFAULT, m_nSettingStyle);
	DDX_Text(pDX, IDC_KILL_RING_MAX, m_nKillRingMax);
	DDV_MinMaxInt(pDX, m_nKillRingMax, 0, 2147483647);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CProperties, CDialog)
	//{{AFX_MSG_MAP(CProperties)
	ON_CBN_DROPDOWN(IDC_APPLICATION, OnDropdownApplication)
	ON_CBN_SELCHANGE(IDC_APPLICATION, OnSelchangeApplication)
	ON_BN_CLICKED(IDC_APPLY, OnApply)
	ON_BN_CLICKED(IDC_LOAD_DEFAULT, OnLoadDefault)
	ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)
	ON_BN_CLICKED(IDC_CLEAR_ALL, OnClearAll)
	ON_BN_CLICKED(IDC_SETTING_DEFAULT, OnSettingDefault)
	ON_BN_CLICKED(IDC_SETTING_DISABLE, OnSettingDisable)
	ON_BN_CLICKED(IDC_SETTING_SPECIFIC, OnSettingSpecific)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProperties message handlers

BOOL CProperties::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	while (m_sheet.GetPageCount()) {
		m_sheet.RemovePage(0);
	}

	m_sheet.AddPage(&m_basic);
	m_sheet.AddPage(&m_advanced);
	m_sheet.AddPage(&m_list);

	m_sheet.Create(this, WS_CHILD | WS_VISIBLE, 0);
	m_sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);
	m_sheet.ModifyStyle( 0, WS_TABSTOP );

	CRect rcSheet;
	GetDlgItem(IDC_TAB)->GetWindowRect(&rcSheet);
	ScreenToClient(&rcSheet);
	m_sheet.SetWindowPos(NULL, rcSheet.left - 11, rcSheet.top - 8, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);


	SetForegroundWindow();

	InitApplicationList();

	CProfile::LoadRegistryData();
	m_szCurrentApplication.LoadString(IDS_DEFAULT);
	SetDialogData(m_szCurrentApplication);
	EnableUseDefaultButton(FALSE);
	EnableLoadDefaultButton(FALSE);

	EnableControl(BASIC_TAB);

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

void CProperties::OnDropdownApplication() 
{
	// TODO: Add your control notification handler code here
	InitApplicationList();

	int nID = GetCurrentApplicationID();
	if (nID != CB_ERR) {
		m_cApplication.SetCurSel(nID);
	} else {
		GetDialogData();
		m_szCurrentApplication.LoadString(IDS_DEFAULT_TITLE);
		m_cApplication.SelectString(-1, m_szCurrentApplication);
		SetDialogData(m_szCurrentApplication);
	}
}

void CProperties::OnSelchangeApplication() 
{
	// TODO: Add your control notification handler code here
	GetDialogData();

	CProfile::GetApplicationTitle(&m_cApplication, m_szCurrentApplication, m_cApplication.GetCurSel());
	int nStart;
	if ((nStart = m_szCurrentApplication.ReverseFind('(')) != -1) {
		++nStart;
		m_szCurrentApplication =
			m_szCurrentApplication.Mid(nStart, m_szCurrentApplication.GetLength() - nStart - 1);
	}

	SetDialogData(m_szCurrentApplication);
	EnableControl(ACTIVE_TAB);
}

void CProperties::InitApplicationList()
{
	CProfile::InitApplicationList(&m_cApplication);
}

int CProperties::GetCurrentApplicationID()
{
	return CProfile::GetCurrentApplicationID(&m_cApplication, m_szCurrentApplication);
}

void CProperties::GetDialogData()
{
	if (m_nSettingStyle == SETTING_DEFAULT) {
		CProfile::ClearData(m_szCurrentApplication);
	} else {
		UpdateDialogData(m_szCurrentApplication, TRUE);

		if (m_sheet.GetActivePage() == &m_basic) {			// FIXME
			m_basic.GetDialogData();
		} else if (m_sheet.GetActivePage() == &m_advanced) {
			m_advanced.GetDialogData();
		} else if (m_sheet.GetActivePage() ==  &m_list) {
			m_list.GetDialogData();
		} else {
			ASSERT(0);
		}
	}
}

void CProperties::SetDialogData(CString szApplicationName)
{
	UpdateDialogData(szApplicationName, FALSE);

	if (m_sheet.GetActivePage() == &m_basic) {			// FIXME
		m_basic.SetDialogData(szApplicationName);
	} else if (m_sheet.GetActivePage() == &m_advanced) {
		m_advanced.SetDialogData(szApplicationName);
	} else if (m_sheet.GetActivePage() ==  &m_list) {
		m_list.SetDialogData(szApplicationName);
	} else {
		ASSERT(0);
	}
}

void CProperties::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)
{
	if (bSaveAndValidate) {	// GetDialogData
		UpdateData();
	}

	m_nApplicationID = CProfile::GetApplicationIndex(szApplicationName, bSaveAndValidate, &m_nSettingStyle);

	if (CProfile::IsDefault(szApplicationName)
	 || CProfile::IsDialog(szApplicationName)) {
		EnableUseDefaultButton(FALSE);
	} else {
		EnableUseDefaultButton(TRUE);
	}

	// application title
	CProfile::UpdateApplicationTitle(&m_cApplication, m_szCurrentApplication, m_nApplicationID, bSaveAndValidate);

	// kill-ring-max
	if (bSaveAndValidate) {	// GetDialogData
		CProfile::SetKillRingMax(m_nApplicationID, m_nKillRingMax);
	} else {				// SetDialogData
		m_nKillRingMax = CProfile::GetKillRingMax(m_nApplicationID);
	}

	// Use Dialog Setting
	if (bSaveAndValidate) {	// GetDialogData
		CProfile::SetUseDialogSetting(m_nApplicationID, m_cUseDialogSetting.GetCheck() == BST_CHECKED);
	} else {				// SetDialogData
		m_cUseDialogSetting.SetCheck(CProfile::GetUseDefaultSetting(m_nApplicationID) ? BST_CHECKED : BST_UNCHECKED);
	}

	if (!bSaveAndValidate) {	// SetDialogData
		UpdateData(FALSE);
	}
}

void CProperties::EnableControl(TAB_NAME tab)
{
	if (tab & ACTIVE_TAB) {
		if (m_sheet.GetActivePage() == &m_basic) {	// FIXME
			tab = BASIC_TAB;
		} else if (m_sheet.GetActivePage() == &m_advanced) {
			tab = ADVANCED_TAB;
		} else if (m_sheet.GetActivePage() == &m_list) {
			tab = LIST_TAB;
		}
	}

	BOOL bEnable = (m_nSettingStyle == SETTING_SPECIFIC);

	m_cKillRingMax.EnableWindow(bEnable);
	EnableLoadDefaultButton(bEnable);

	m_cSelectAll.EnableWindow(bEnable && tab & BASIC_TAB);
	m_cClearAll.EnableWindow(bEnable && tab & BASIC_TAB);

	EnableUseDialogSettingButton(bEnable);

	if (tab & BASIC_TAB) {
		m_basic.EnableControl();
	}
	if (tab & ADVANCED_TAB) {
		m_advanced.EnableControl();
	}
	if (tab & LIST_TAB) {
		m_list.EnableControl();
	}
}

void CProperties::EnableUseDialogSettingButton(BOOL bEnable)
{
	m_cUseDialogSetting.EnableWindow(bEnable);
	if (CProfile::IsDialog(m_szCurrentApplication)) {
		m_cUseDialogSetting.EnableWindow(FALSE);
	}
}

void CProperties::EnableLoadDefaultButton(BOOL bEnable)
{
	m_cLoadDefault.EnableWindow(bEnable);
	if (CProfile::IsDefault(m_szCurrentApplication)) {
		m_cLoadDefault.EnableWindow(FALSE);
	}
}

void CProperties::EnableUseDefaultButton(BOOL bEnable)
{
	if (GetDlgItem(IDC_SETTING_DEFAULT)) {
		GetDlgItem(IDC_SETTING_DEFAULT)->EnableWindow(bEnable);
	}
}

void CProperties::OnOK() 
{
	// TODO: Add extra validation here
	OnApply();

	CDialog::OnOK();
}

void CProperties::OnCancel() 
{
	// TODO: Add extra cleanup here
	CProfile::LoadRegistryData();

	CDialog::OnCancel();
}

void CProperties::OnApply() 
{
	// TODO: Add your control notification handler code here
	GetDialogData();
	CProfile::SaveRegistryData();
}

void CProperties::OnLoadDefault() 
{
	// TODO: Add your control notification handler code here
	CProfile::CopyData(m_szCurrentApplication, CString(MAKEINTRESOURCE(IDS_DEFAULT)));
	SetDialogData(m_szCurrentApplication);
}

void CProperties::OnSelectAll() 
{
	// TODO: Add your control notification handler code here
	m_basic.SetAllDialogData(1, TRUE);
}

void CProperties::OnClearAll() 
{
	// TODO: Add your control notification handler code here
	m_basic.SetAllDialogData(0, TRUE);
}

int CProperties::GetApplicationID()
{
	return m_nApplicationID;
}

CString CProperties::GetCurrentApplication()
{
	return m_szCurrentApplication;
}

void CProperties::OnSettingDefault() 
{
	// TODO: Add your control notification handler code here
	UpdateData();	// get data
	EnableControl(ACTIVE_TAB);
}

void CProperties::OnSettingDisable() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	EnableControl(ACTIVE_TAB);
}

void CProperties::OnSettingSpecific() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	EnableControl(ACTIVE_TAB);

	if (CProfile::GetApplicationIndex(m_szCurrentApplication) == MAX_APP) {
		CProfile::CopyData(m_szCurrentApplication, CString(MAKEINTRESOURCE(IDS_DEFAULT)));
		SetDialogData(m_szCurrentApplication);
	}
}

BOOL CProperties::IsEnableControl()
{
	return m_nSettingStyle == SETTING_SPECIFIC;
}

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