// ModuleSVNManagerDlg.cpp : ʵ���ļ�
//

#include "stdafx.h"
#include "ModuleSVNManager.h"
#include "ModuleSVNManagerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// ����Ӧ�ó��򡰹��ڡ��˵���� CAboutDlg �Ի���

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// �Ի�������
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ֧��

// ʵ��
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CModuleSVNManagerDlg �Ի���




CModuleSVNManagerDlg::CModuleSVNManagerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CModuleSVNManagerDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CModuleSVNManagerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, LIST_DB_MOD, m_list_modDB);
}

BEGIN_MESSAGE_MAP(CModuleSVNManagerDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(BTN_OPERATION, &CModuleSVNManagerDlg::OnBnClickedOperation)
	ON_NOTIFY(NM_CLICK, LIST_DB_MOD, &CModuleSVNManagerDlg::OnNMClickDbMod)
	ON_NOTIFY(NM_DBLCLK, LIST_DB_MOD, &CModuleSVNManagerDlg::OnNMDblclkDbMod)
	ON_NOTIFY(NM_RDBLCLK, LIST_DB_MOD, &CModuleSVNManagerDlg::OnNMRDblclkDbMod)
	ON_BN_CLICKED(IDOK, &CModuleSVNManagerDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, &CModuleSVNManagerDlg::OnBnClickedCancel)
	ON_NOTIFY(LVN_ITEMCHANGED, LIST_DB_MOD, &CModuleSVNManagerDlg::OnLvnItemchangedDbMod)
	ON_BN_CLICKED(BTN_DELETE, &CModuleSVNManagerDlg::OnBnClickedDelete)
END_MESSAGE_MAP()


// CModuleSVNManagerDlg ��Ϣ��������

BOOL CModuleSVNManagerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// ��������...���˵������ӵ�ϵͳ�˵��С�

	// IDM_ABOUTBOX ������ϵͳ���Χ�ڡ�
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// ���ô˶Ի����ͼ�ꡣ��Ӧ�ó��������ڲ��ǶԻ���ʱ����ܽ��Զ�
	//  ִ�д˲���
	SetIcon(m_hIcon, TRUE);			// ���ô�ͼ��
	SetIcon(m_hIcon, FALSE);		// ����Сͼ��

	// TODO: �ڴ����Ӷ���ij�ʼ������
	LoadData();
	InitCtrl();
	FillData2List();

	return TRUE;  // ���ǽ��������õ��ؼ������򷵻� TRUE
}

void CModuleSVNManagerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// �����Ի���������С����ť������Ҫ����Ĵ���
//  �����Ƹ�ͼ�ꡣ����ʹ���ĵ�/��ͼģ�͵� MFC Ӧ�ó���
//  �⽫�ɿ���Զ���ɡ�

void CModuleSVNManagerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // ���ڻ��Ƶ��豸������

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// ʹͼ���ڹ����������о���
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// ����ͼ��
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//���û��϶���С������ʱϵͳ���ô˺���ȡ�ù��
//��ʾ��
HCURSOR CModuleSVNManagerDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CModuleSVNManagerDlg::LoadData()
{
	// �������ݿ�;
	m_vtDbModInfo.clear();
	CDataImpl::GetInstance()->QueryModInfo(m_vtDbModInfo);

	// ���ж�ȡ�ļ�����;
	CString strLine;
	CStdioFile sfile;
	CFileException exp;
	if ( sfile.Open(Global::g_ModConfig.szModSavePath, CFile::modeRead, &exp) ) {
		while (sfile.ReadString(strLine)) {
			// Format:[MODULE],Name,svn url,svn version;
			if ( !strLine.IsEmpty() ) {
				TCHAR szModule[MAX_PATH] = {0};
				TCHAR szModName[MAX_PATH] = {0};
				TCHAR szModAddress[MAX_PATH] = {0};
				TCHAR szModVersion[MAX_PATH] = {0};

				int nRet = _stscanf_s (strLine.GetString(), _T("%[^,],%[^,],%[^,],%[^,]"), szModule, MAX_PATH, szModName, MAX_PATH, szModAddress, MAX_PATH, szModVersion, MAX_PATH);
				//int nRet = sscanf(strLine.GetString(),  _T("%[^,],%[^,],%[^,],%[^,]"), szModule, szModName, szModAddress, szModVersion);
				if ( nRet == 4 ) {
					SetCheck(szModName);
				}
			}
		}
		sfile.Close();
	}
}

void CModuleSVNManagerDlg::InitCtrl()
{
	int nIndex = 0;
	// ��ʼ���豸�б�;
	m_list_modDB.InsertColumn(nIndex, "���");
	m_list_modDB.SetColumnWidth(nIndex++, 100);
	m_list_modDB.InsertColumn(nIndex, "SVN�汾");
	m_list_modDB.SetColumnWidth(nIndex++, 100);
	m_list_modDB.InsertColumn(nIndex, "SVN��ַ");
	m_list_modDB.SetColumnWidth(nIndex++, 360);
	m_list_modDB.SetExtendedStyle(m_list_modDB.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
}

void CModuleSVNManagerDlg::FillData2List()
{
	int nIndex = 0;
	// ����db����;
	m_list_modDB.DeleteAllItems();
	for (std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); it++ ) {
		nIndex = m_list_modDB.InsertItem(nIndex, (*it)->strName.c_str());
		m_list_modDB.SetItemText(nIndex, 1, (*it)->strVersion.c_str());
		m_list_modDB.SetItemText(nIndex, 2, (*it)->strAddress.c_str());
		m_list_modDB.SetCheck(nIndex, (*it)->_check);
		m_list_modDB.SetItemData(nIndex, (DWORD_PTR)(*it));
		// �ƶ�����λ��;
		nIndex++;
	}
}

void CModuleSVNManagerDlg::SetCheck(std::string strModName)
{
	for (std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); it++ ) {
		if ( _tcsicmp((*it)->strName.c_str(), strModName.c_str()) == 0 ) {
			(*it)->_check = true;
		}
	}
}

void CModuleSVNManagerDlg::InsertList_modDB(STModInfo *pModInfo)
{
	m_vtDbModInfo.push_back(pModInfo);
	int nCount = m_list_modDB.GetItemCount();
	// ��������;
	m_list_modDB.InsertItem(nCount, pModInfo->strName.c_str());
	m_list_modDB.SetItemText(nCount, 1, pModInfo->strVersion.c_str());
	m_list_modDB.SetItemText(nCount, 2, pModInfo->strAddress.c_str());
	m_list_modDB.SetItemData(nCount, (DWORD_PTR)pModInfo);
}

void CModuleSVNManagerDlg::SetEditLockStatus(BOOL bLock /* = TRUE */)
{
	GetDlgItem(ET_MOD_NAME)->EnableWindow(!bLock);
	GetDlgItem(ET_MOD_VER)->EnableWindow(!bLock);
	GetDlgItem(ET_MOD_ADDR)->EnableWindow(!bLock);
	if ( bLock )
		SetDlgItemText(BTN_OPERATION, _T("�޸�"));
	else
	{
		CString strText;
		GetDlgItemText(BTN_OPERATION, strText);
		if ( strText == _T("�޸�") )
			SetDlgItemText(BTN_OPERATION, _T("����"));
		else
			SetDlgItemText(BTN_OPERATION, _T("����"));
	}
}

void CModuleSVNManagerDlg::OnBnClickedOperation()
{
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	CString strOptName = _T("");
	GetDlgItemText(BTN_OPERATION, strOptName);

	CString strModName, strModVer, strModAddr;
	GetDlgItemText(ET_MOD_NAME, strModName);
	GetDlgItemText(ET_MOD_VER, strModVer);
	GetDlgItemText(ET_MOD_ADDR, strModAddr);

	if ( strModName.IsEmpty() ) {
		MessageBox(_T("ģ�����գ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
		return;
	}

	if ( strModVer.IsEmpty() ) {
		MessageBox(_T("�汾�ſգ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
		return;
	}

	if ( strModAddr.IsEmpty() ) {
		MessageBox(_T("SVN��ַ�գ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
		return;
	}

	if ( strOptName == _T("����") )	{
		// �������ݿ�;
		STModInfo* pModInfo = new STModInfo();
		pModInfo->strName = strModName.GetString();
		pModInfo->strVersion = strModVer.GetString();
		pModInfo->strAddress =  strModAddr.GetString();
		pModInfo->_check = false;

		if ( CDataImpl::GetInstance()->InsertModInfo(*pModInfo) )
		{
			MessageBox(_T("���ӳɹ���"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
			// ��������;
			InsertList_modDB(pModInfo);
		}
		else
		{
			MessageBox(_T("����ʧ�ܣ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
		}
	}
	else if ( strOptName == _T("�޸�")) {
		// �����ؼ�;
		SetEditLockStatus(FALSE);
	}
	else if (strOptName == _T("����")) {
		// ��ȡѡ����;
		POSITION pos = m_list_modDB.GetFirstSelectedItemPosition();
		if ( pos ) {
			int nSelIndex = m_list_modDB.GetNextSelectedItem(pos);
			if ( nSelIndex != -1) {
				STModInfo *pModInfo = (STModInfo*)m_list_modDB.GetItemData(nSelIndex);
				if ( pModInfo ) {
					// �޸�ֵ;
					pModInfo->strVersion = strModVer.GetString();
					pModInfo->strAddress = strModAddr.GetString();
					// �������ݿ�;
					if ( CDataImpl::GetInstance()->UpdateModInfo(*pModInfo) )
					{
						MessageBox(_T("�޸ijɹ���"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
						// ��������;
						m_list_modDB.SetItemText(nSelIndex, 1, pModInfo->strVersion.c_str());
						m_list_modDB.SetItemText(nSelIndex, 2, pModInfo->strAddress.c_str());
						m_list_modDB.SetItemData(nSelIndex, (DWORD_PTR)pModInfo);
						//UpdateData(FALSE);
					}
					else
						MessageBox(_T("�޸�ʧ�ܣ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
				}				
			}
		}		
	}
}

// �����ؼ�;
void CModuleSVNManagerDlg::OnNMClickDbMod(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	*pResult = 0;

	if ( pNMItemActivate->iItem != -1) {
		STModInfo *pModInfo = (STModInfo *)m_list_modDB.GetItemData(pNMItemActivate->iItem);
		if ( pModInfo ) {
			// �����ؼ�;
			SetEditLockStatus(TRUE);
			// ��ʾ����;
			SetDlgItemText(ET_MOD_NAME, pModInfo->strName.c_str());
			SetDlgItemText(ET_MOD_VER, pModInfo->strVersion.c_str());
			SetDlgItemText(ET_MOD_ADDR, pModInfo->strAddress.c_str());

			// ����ɾ����ť;
			GetDlgItem(BTN_DELETE)->EnableWindow(TRUE);
		}
	}
	else
	{
		// �����ؼ�;
		if ( m_list_modDB.GetSelectedCount() == 0 ) {
			SetEditLockStatus(FALSE);
			SetDlgItemText(BTN_OPERATION, _T("����"));

			// ��ձ༭������;
			SetDlgItemText(ET_MOD_NAME, _T(""));
			SetDlgItemText(ET_MOD_ADDR, _T(""));
			SetDlgItemText(ET_MOD_VER, _T(""));

			// ����ɾ����ť;
			GetDlgItem(BTN_DELETE)->EnableWindow(FALSE);
		}
	}
}

// ˫��ʵ�ִ�;
void CModuleSVNManagerDlg::OnNMDblclkDbMod(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	*pResult = 0;

	if ( pNMItemActivate->iItem != -1) {
		STModInfo *pModInfo = (STModInfo *)m_list_modDB.GetItemData(pNMItemActivate->iItem);
		if ( pModInfo ) {
			pModInfo->_check = !pModInfo->_check; 
			m_list_modDB.SetCheck(pNMItemActivate->iItem, pModInfo->_check);
		}
	}
}

// ˫���Ҽ�ɾ��;
void CModuleSVNManagerDlg::OnNMRDblclkDbMod(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	*pResult = 0;
#if 1
	if ( pNMItemActivate->iItem != -1) {
		STModInfo *pModInfo = (STModInfo *)m_list_modDB.GetItemData(pNMItemActivate->iItem);
		if ( pModInfo ) {
			if ( MessageBox(_T("ȷ��ɾ�������ѡ���ǣ�"), _T("��ܰ��ʾ��"), MB_YESNO) == IDYES ) {
				if ( CDataImpl::GetInstance()->DeleteModInfo(*pModInfo) ) {
					// ���б����Ƴ�;
					m_list_modDB.SetItemData(pNMItemActivate->iItem, NULL);
					m_list_modDB.DeleteItem(pNMItemActivate->iItem);
					// ���������Ƴ�;
					for ( std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); it++ ) {
						if ( pModInfo == (*it) ) {
							m_vtDbModInfo.erase(it);
							break;
						}
					}

					MessageBox(_T("ɾ���ɹ���"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
				}
				else
				{
					MessageBox(_T("ɾ��ʧ�ܣ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
				}
			}
		}
	}
#endif
}

void CModuleSVNManagerDlg::OnBnClickedOk()
{
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	CString str;
	CStdioFile sfile;
	CFileException exp;  // CFile::modeCreate��ʶ�����֮ǰ������;
	if ( sfile.Open(Global::g_ModConfig.szModSavePath, CFile::modeCreate|CFile::modeReadWrite) ) {
		for ( std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); it++ ) {
			STModInfo *p = *it;
			if ( p->_check ) {
				str.Format(_T("[MODULE],%s,%s,%s\n"), p->strName.c_str(), p->strAddress.c_str(), p->strVersion.c_str());
				sfile.WriteString(str);	
			}
		}

		sfile.Flush();	// ǿ�ƻ���д��;
		sfile.Close();

		MessageBox(_T("����ɹ�"), _T("��ʾ"), MB_OK);
	}	
	else
	{
		MessageBox(_T("����ʧ�ܣ������ļ�ʧ�ܣ�"), _T("��ʾ"), MB_OK);
	}
}

void CModuleSVNManagerDlg::OnBnClickedCancel()
{
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	STModInfo *p = NULL;
	for (std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); ) {
		p = (*it);
		delete p;
		p = NULL;
		it = m_vtDbModInfo.erase(it);		
	}

	OnCancel();
}

void CModuleSVNManagerDlg::OnLvnItemchangedDbMod(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	*pResult = 0;

	if ( pNMLV->iItem != -1) {
		STModInfo *pModInfo = (STModInfo *)m_list_modDB.GetItemData(pNMLV->iItem);
		if ( pModInfo ) {
			pModInfo->_check = m_list_modDB.GetCheck(pNMLV->iItem);
		}
	}
}

void CModuleSVNManagerDlg::OnBnClickedDelete()
{
	// TODO: �ڴ����ӿؼ�֪ͨ�����������
	int nSelCurl = -1;
	POSITION pos = m_list_modDB.GetFirstSelectedItemPosition();
	if ( pos ) {
		nSelCurl = m_list_modDB.GetNextSelectedItem(pos);
		if ( nSelCurl != -1 ) {
			STModInfo *pModInfo = (STModInfo *)m_list_modDB.GetItemData(nSelCurl);
			if ( pModInfo ) {
				if ( MessageBox(_T("ȷ��ɾ�������ѡ���ǣ�"), _T("��ܰ��ʾ��"), MB_YESNO) == IDYES ) {
					if ( CDataImpl::GetInstance()->DeleteModInfo(*pModInfo) ) {
						// ���б����Ƴ�;
						m_list_modDB.SetItemData(nSelCurl, NULL);
						m_list_modDB.DeleteItem(nSelCurl);
						// ���������Ƴ�;
						for ( std::vector<STModInfo*>::iterator it = m_vtDbModInfo.begin(); it != m_vtDbModInfo.end(); it++ ) {
							if ( pModInfo == (*it) ) {
								m_vtDbModInfo.erase(it);
								break;
							}
						}
						MessageBox(_T("ɾ���ɹ���"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
					}
					else
					{
						MessageBox(_T("ɾ��ʧ�ܣ�"), _T("���ѣ�"), MB_OK|MB_ICONWARNING);
					}
				}
			}
		}
	}
}