// 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: 在此添加额外的初始化代码 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(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(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::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::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("修改成功!"), _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(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(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(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::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::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::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(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::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); } } } } } }