// macroprogramdlg.cpp : implementation file
//

#include "stdafx.h"
#include "macroprogramdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMacroProgramDlg dialog


CMacroProgramDlg::CMacroProgramDlg(CWnd* pParent,
								 MacroInterface *pMacroInterpreter)
	: CDialog(CMacroProgramDlg::IDD, pParent)
{
	m_pDialog = pParent;
	_pMacroInterface = pMacroInterpreter; 
	//{{AFX_DATA_INIT(CMacroProgramDlg)
	m_ProgramFile = _T("");
	m_MacroProcesses = _T("");
	//}}AFX_DATA_INIT
}
CMacroProgramDlg::~CMacroProgramDlg()
{	
	CMacroDlg *pMacroDlg;
	MACRODLG_POSITION pos;
	
	for(pos = _macroDlgList.begin(); pos != _macroDlgList.end(); ++pos) 
	{
		pMacroDlg = *pos;		
		delete pMacroDlg;
	}	
}


void CMacroProgramDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMacroProgramDlg)
	DDX_Text(pDX, IDC_PROGRAMFILE, m_ProgramFile);
	DDX_CBString(pDX, IDC_COMBO_MACROPROCESSES, m_MacroProcesses);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMacroProgramDlg, CDialog)
	ON_MESSAGE(WM_MODELESSEXIT, OnModelessExit)		
	//{{AFX_MSG_MAP(CMacroProgramDlg)
	ON_BN_CLICKED(ID_LOAD, OnLoad)
	ON_BN_CLICKED(ID_BROWSE, OnBrowse)
	ON_BN_CLICKED(ID_EXIT, OnExit)
	ON_CBN_SELCHANGE(IDC_COMBO_MACROPROCESSES, OnSelchangeComboMacroprocesses)
	ON_CBN_SELCHANGE(IDC_COMBO_MACRO_USAGE, OnSelchangeComboMacroUsage)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMacroProgramDlg message handlers

void CMacroProgramDlg::OnLoad() 
{
	UpdateData(TRUE);
	
	CMacroDlg *dlg = new CMacroDlg(this, _pMacroInterface);
	
	int len = m_ProgramFile.GetLength();

	if(dlg->Load((char *)m_ProgramFile.GetBuffer(len)) == -1)
		delete dlg;
	else
	{
		CMacroDlg *existingDlg;

		if((existingDlg = SearchDlg(dlg->ProcessName())) == NULL) //dialog is not created
		{
			_macroDlgList.push_back(dlg);
			CComboBox *pCB = (CComboBox *)GetDlgItem(IDC_COMBO_MACROPROCESSES);
			pCB->InsertString(-1,dlg->ProcessName());					
			pCB->SetTopIndex(0);
		}
		else
		{	// dialog is created, so replace existing one
			Replace(existingDlg, dlg);
		}
	}	
}
void CMacroProgramDlg::Replace(CMacroDlg *olddlg, CMacroDlg *newdlg)
{
MACRODLG_POSITION pos;

	//search for macro dialog <dlg>
	for(pos = _macroDlgList.begin(); 
	pos != _macroDlgList.end(); ++pos) 
	{
		if(olddlg == *pos){
			*pos = newdlg;
			delete olddlg;
		}
	}
}
CMacroDlg *
CMacroProgramDlg::SearchDlg(char * name)
{
MACRODLG_POSITION pos;
CMacroDlg *pDlg;

	//search for macro dialog servicing macroprocess <name>
	for(pos = _macroDlgList.begin(); 
	pos != _macroDlgList.end(); ++pos) 
	{
		pDlg = *pos;
		if(!strcmp(pDlg->ProcessName(), name))
			return pDlg;	
	}

	return NULL;
}

void CMacroProgramDlg::OnBrowse() 
{	
	InProcess(FALSE);

	CString initDir("c:\\");
	CFileDialog dlg(TRUE, "macro", "*.txt");
	dlg.m_ofn.lpstrInitialDir = initDir;

	if (dlg.DoModal() != IDOK) {
		return;
	}

	// Check for file existence
	FILE *fp;
	if ((fp = fopen(dlg.GetPathName(), "r")) == NULL) {
		char errorBuf[512];
		sprintf(errorBuf, "Couldn't open file \"%s\" for reading",
			dlg.GetPathName());

		AfxMessageBox(errorBuf);
		return;
	}
	fclose(fp);

	m_ProgramFile = dlg.GetPathName();
	UpdateData(FALSE);
	OnLoad();
}


void CMacroProgramDlg::OnExit() 
{
	/*CMacroDlg *pMacroDlg;
	MACRODLG_POSITION pos;
	
	for(pos = _macroDlgList.begin(); pos != _macroDlgList.end(); ++pos) 
	{
		pMacroDlg = *pos;		
		pMacroDlg->ShowWindow(SW_HIDE);
	}*/	

	if(m_pDialog != NULL)
		m_pDialog->PostMessage(WM_MODELESSEXIT,IDD_MACROPROGRAM_DLG);				
	else //handle modal dialog case
		CDialog::OnCancel();			
}

void CMacroProgramDlg::InProcess(Boolean state)
{
	_inProcess = state;
	if(_inProcess == TRUE)
	{		
		CWnd *button;
		button = GetDlgItem(ID_LOAD);
		button->EnableWindow(FALSE);
	}
	else
	{
		_pMacroInterface->stopProcess();
		CWnd *button;
		button = GetDlgItem(ID_LOAD);
		button->EnableWindow(TRUE);
	}
}

void CMacroProgramDlg::SetFile(CString s)
{
	m_ProgramFile = s;
	UpdateData(FALSE);
}
LRESULT CMacroProgramDlg::OnModelessExit(WPARAM wParam, LPARAM lParam)
{
	CMacroDlg *pMacroDlg;
	MACRODLG_POSITION pos;
	for(pos = _macroDlgList.begin(); pos != _macroDlgList.end(); ++pos) 
	{
		pMacroDlg = *pos;	
		if(pMacroDlg == (CMacroDlg*)wParam)
			pMacroDlg->ShowWindow(SW_HIDE);
	}
	return 0L;
}

void CMacroProgramDlg::OnSelchangeComboMacroprocesses() 
{
	CString s;
	CMacroDlg *existingDlg;

	CComboBox *pCB = (CComboBox *)GetDlgItem(IDC_COMBO_MACROPROCESSES);

	int i = pCB->GetCurSel();
	pCB->GetLBText(i,s);
	i = s.GetLength();

	if((existingDlg = SearchDlg(s.GetBuffer(i))) != NULL) //dialog is created
		// Refresh it if it's hidden
		existingDlg->Refresh();
}

BOOL CMacroProgramDlg::OnInitDialog()
{
	CComboBox* pCB;

	CDialog::OnInitDialog();

	pCB = (CComboBox*)GetDlgItem(IDC_COMBO_MACRO_USAGE);
	pCB->ResetContent();			

	pCB->InsertString(-1,DELAYSEC_MACRO_NAME);				
	pCB->InsertString(-1,DELAYMIN_MACRO_NAME);				
	pCB->InsertString(-1,HOME_MACRO_NAME);				
	pCB->InsertString(-1,WAIT_MACRO_NAME);
	pCB->InsertString(-1,EXIT_MACRO_NAME);
	pCB->SetCurSel(0);
	return 0;
}

void CMacroProgramDlg::OnSelchangeComboMacroUsage() 
{
CComboBox* pCB;
char desc[80];
char name[15];
Nat16 i;

	pCB = (CComboBox*)GetDlgItem(IDC_COMBO_MACRO_USAGE);

	i = pCB->GetCurSel();
	if(pCB->GetLBTextLen(i) <= sizeof(name))
	{
		pCB->GetLBText(i, name);
		_pMacroInterface->usage(name, desc);
		SetDlgItemText(IDC_MACRO_USAGE, desc);
	}	
}
