#include "stdafx.h" #include "GLTKDlg.h" //#include "AecDbEarthWorm.h" #include "CoreTools.h" #include "AecDbPoolCell.h" #include "PMSJDlg.h" namespace { void initTree(CUIISQLiteServer &server, CTreeCtrl &tree, LPCTSTR pszTable) { if (!pszTable) return; tree.DeleteAllItems(); CStringArray arrCity, arrStand; CString sCity(_T("")), sSql(_T("")), sStand; sSql.Format(_T("select distinct city from %s"), pszTable); server.GetSelData(sSql, arrCity); HTREEITEM parent, sub; for (int cty = 0; cty < arrCity.GetCount(); ++cty) { arrStand.RemoveAll(); sCity = arrCity[cty]; sSql.Format(_T("select distinct standard from %s where city='%s'"), pszTable, sCity); parent = tree.InsertItem(sCity, 0, 0, TVI_ROOT, TVI_LAST); server.GetSelData(sSql, arrStand); for (int sta = 0; sta < arrStand.GetCount(); ++sta) { sStand = arrStand[sta]; if (!sStand.IsEmpty()) sub = tree.InsertItem(sStand, 0, 0, parent, TVI_LAST); } } HTREEITEM item = tree.GetFirstVisibleItem(); while (item) { tree.Expand(item, TVE_EXPAND); item = tree.GetNextSiblingItem(item); } } bool hasSameCity(CTreeCtrl &tree, LPCTSTR name) { if (!name) return true; if (!tree.GetCount()) return false; HTREEITEM item = tree.GetFirstVisibleItem(); if (!item) return true; CString str(_T("")); while (item) { str = tree.GetItemText(item); if (str == name) return true; item = tree.GetNextSiblingItem(item); } return false; } bool hasSameStandard(CTreeCtrl &tree, HTREEITEM parent, LPCTSTR name) { if (!name || !parent) return true; HTREEITEM sub = tree.GetChildItem(parent); if (!sub) return false; CString str(_T("")); while (sub) { str = tree.GetItemText(sub); if (str == name) return true; sub = tree.GetNextSiblingItem(sub); } return false; } bool IsCityItem(CTreeCtrl &tree, HTREEITEM item) { if (!item) return false; HTREEITEM parent = tree.GetParentItem(item); if (!parent) return true; return false; } bool IsStandardItem(CTreeCtrl &tree, HTREEITEM item) { if (!item) return false; return !IsCityItem(tree, item); } void _delete(CUIISQLiteServer &server , CTreeCtrl &tree , HTREEITEM item , LPCTSTR pszTable) { if (!item) return; if (!pszTable) return; // 删除数据库 CString city(_T("")), standard(_T("")), sql(_T("")); if (IsCityItem(tree, item)) { HTREEITEM sub = tree.GetChildItem(item); city = tree.GetItemText(item); sql.Format(_T("delete from %s where city='%s'"), pszTable, city); server.ExecuteSQL(sql); } else { HTREEITEM parent = tree.GetParentItem(item); city = tree.GetItemText(parent); standard = tree.GetItemText(item); sql.Format(_T("delete from %s where city='%s' and standard='%s'") , pszTable , city , standard); server.ExecuteSQL(sql); } // 删除界面 tree.DeleteItem(item); } void deleteCurrentItem(CUIISQLiteServer &server, CTreeCtrl &tree, LPCTSTR pszTable) { HTREEITEM item = tree.GetSelectedItem(); if (!item) return; if (!pszTable) return; _delete(server, tree, item, pszTable); } void RefreshLst(CUIISQLiteServer &server , CListCtrl &lst , CTreeCtrl &tree , HTREEITEM item , LPCTSTR pszTable) { if (!pszTable) return; if (!item) return; lst.DeleteAllItems(); bool bSelCity(false); HTREEITEM city, standard; if (IsCityItem(tree, item)) { city = item; bSelCity = true; } else { standard = item; city = tree.GetParentItem(standard); } int nRow(0); CStringArray arrStand, arrName,arAddtion; CString sSql(_T("")), sCity(_T("")), sStandard(_T("")), sName(_T("")); sCity = tree.GetItemText(city); if (bSelCity) { sSql.Format(_T("select distinct standard from %s where city='%s'"), pszTable, sCity); server.GetSelData(sSql, arrStand); for (int sta = 0; sta < arrStand.GetCount(); ++sta) { sStandard = arrStand[sta]; if (sStandard.IsEmpty()) continue; sSql.Format(_T("select name from %s where city='%s' and standard='%s'") , pszTable, sCity, sStandard); arrName.RemoveAll(); server.GetSelData(sSql, arrName); for (int sec = 0; sec < arrName.GetCount(); ++sec) { sName = arrName[sec]; if (sName.IsEmpty()) continue; nRow = lst.InsertItem(0, sCity); lst.SetItemText(nRow, 1, sStandard); lst.SetItemText(nRow, 2, sName); } } } else { sStandard = tree.GetItemText(standard); if (sStandard.IsEmpty()) return; sSql.Format(_T("select name from %s where city='%s' and standard='%s'") , pszTable, sCity, sStandard); arrName.RemoveAll(); server.GetSelData(sSql, arrName); CUIIValueRecord rec; for (int i = 0;i < arrName.GetCount();++i) { sName = arrName[i]; if (sName.IsEmpty()) continue; nRow = lst.InsertItem(lst.GetItemCount(), sCity); lst.SetItemText(nRow, 1, sStandard); lst.SetItemText(nRow, 2, sName); } } } void InsertData(CUIISQLiteServer &server , LPCTSTR name , LPCTSTR city , LPCTSTR standard , LPCTSTR section , LPCTSTR pszTable) { if (!pszTable) return; CString sql(_T("")); sql.Format(_T("insert into %s values('%s', '%s', '%s', '%s')") , pszTable , city , standard , section , name); server.ExecuteSQL(sql); } } IMPLEMENT_DYNAMIC(CGLTKDlg, CDialog) void CGLTKDlg::drawRegion(LPCTSTR psz, CGsPreviewCtrl & wndCtrl) { if (!psz) return; CString sSection(psz); AcDbRegion *pReg = CoreTools::StringToRegion(sSection); if (!pReg) return; AcDbExtents exts; pReg->getGeomExtents(exts); wndCtrl.InitFromCurrentView2D(exts, true); wndCtrl.mpView->eraseAll(); wndCtrl.Add(pReg); wndCtrl.view()->invalidate(); wndCtrl.Invalidate(); wndCtrl.RedrawWindow(); } #define SP_CELL TCHAR(0x19) void CGLTKDlg::drawPoolCell(LPCTSTR psz, CGsPreviewCtrl & wndCtrl) { if (!psz) return; AcGePoint3d ptOrg(AcGePoint3d::kOrigin); std::vector cells(0); CPMSJDlg::generateCellsByString(psz, cells, ptOrg); if (cells.empty()) return; AcDbExtents extAll, ext; AecDbPoolCell *pCell(NULL); for (size_t i = 0; i < cells.size(); ++i) { pCell = cells[i]; pCell->getGeomExtents(ext); extAll.addExt(ext); } wndCtrl.InitFromCurrentView2D(extAll, true); wndCtrl.mpView->eraseAll(); for (size_t i = 0; i < cells.size(); ++i) wndCtrl.Add(cells[i]); wndCtrl.Invalidate(); wndCtrl.RedrawWindow(); } CGLTKDlg::CGLTKDlg(OPERA opera , LPCTSTR db , LPCTSTR table , drawPreview pFunc , CWnd* pParent /*=NULL*/) : CDialog(CGLTKDlg::IDD, pParent) , m_eOpera(opera) , m_sTblName(table) , m_sDbName(db) , m_sCrossSectionScr(_T("")) , m_nItemSel(-1) , m_bScrForAddToDb(false) , m_pFunc(pFunc) { } CGLTKDlg::~CGLTKDlg() { } void CGLTKDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_sCrossSectionScr); DDX_Control(pDX, IDC_EDIT1, m_wndScrEdit); DDX_Control(pDX, IDC_LIST1, m_wndList); DDX_Control(pDX, IDC_TREE1, m_wndTree); } BEGIN_MESSAGE_MAP(CGLTKDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CGLTKDlg::OnBnClickedAddCity) ON_BN_CLICKED(IDC_BUTTON2, &CGLTKDlg::OnBnClickedAddStandard) ON_BN_CLICKED(IDC_BUTTON3, &CGLTKDlg::OnBnClickedInput) ON_BN_CLICKED(IDOK, &CGLTKDlg::OnBnClickedOk) ON_WM_CTLCOLOR() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CGLTKDlg::OnTvnSelchangedTree1) ON_NOTIFY(NM_RCLICK, IDC_TREE1, &CGLTKDlg::OnNMRClickTree1) ON_COMMAND(IDM_ADD_CITY, &CGLTKDlg::OnAddCity) ON_COMMAND(IDM_ADD_STANDARD, &CGLTKDlg::OnAddStandard) ON_COMMAND(IDM_DEL_CITY, &CGLTKDlg::OnDelItem) ON_COMMAND(IDM_DEL_STANDARD, &CGLTKDlg::OnDelItem) ON_COMMAND(IDM_DEL_SECTION, &CGLTKDlg::OnDelSection) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CGLTKDlg::OnLvnItemchangedList1) ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CGLTKDlg::OnNMRClickList1) END_MESSAGE_MAP() void CGLTKDlg::SetCrossSectionScr(const CString& sCrossSectionScr) { m_sCrossSectionScr = sCrossSectionScr; m_bScrForAddToDb = true; } BOOL CGLTKDlg::GetCrossSectionScr(CString& sCrossSectionScr) const { sCrossSectionScr = m_sCrossSectionScr; //return m_nItemSel == -1 ? FALSE : TRUE; return TRUE; } BOOL CGLTKDlg::OnInitDialog() { CDialog::OnInitDialog(); // 如是选择模式 if (m_eOpera == eSelect) { if (GetDlgItem(IDC_BUTTON1)) GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); if (GetDlgItem(IDC_BUTTON2)) GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); if (GetDlgItem(IDC_BUTTON3)) GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); } else m_wndList.EnableWindow(FALSE); m_ImageList.Create(IDB_TOOLBAR,16,1,RGB(0, 255, 255)); m_wndList.SetImageList(&m_ImageList,LVSIL_SMALL); m_wndTree.SetImageList(&m_ImageList,TVSIL_NORMAL); m_wndList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_wndList.InsertColumn(0,_T("节点"),LVCFMT_LEFT,80); m_wndList.InsertColumn(1,_T("标准"),LVCFMT_LEFT,200); m_wndList.InsertColumn(2,_T("项目"),LVCFMT_LEFT,200); // 子类化控件对象 if (!m_wndViewCtrl.SubclassDlgItem(IDC_STATIC_FRM, this)) { // 错误时,结束对话框 EndDialog(IDCANCEL); return FALSE; } m_wndViewCtrl.init(true); RefreshPreviewCtrl(); // 数据库 CString path = FilePath::GetSysDir() + _T("\\") + m_sDbName; if (!m_server.InitADOServer(path)) { AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + m_sTblName + _T("文件是否存在.")); return false; } ShowCityEwStdTree(); return TRUE; } void CGLTKDlg::ShowCityEwStdTree() { initTree(m_server, m_wndTree, m_sTblName); } void CGLTKDlg::RefreshPreviewCtrl() { UpdateData(TRUE); if (!m_pFunc) return; (*m_pFunc)(m_sCrossSectionScr, m_wndViewCtrl); return; } void CGLTKDlg::OnBnClickedAddCity() { //新建城市节点,并入库 CString name; if (!CoreTools::getNameByDialog(_T("请输入节点名称"), _T("节点名称:"), name)) return; if (name.IsEmpty()) return; if (hasSameCity(m_wndTree, name)) { AfxMessageBox(_T("输入的节点名已存在。")); return; } HTREEITEM item = m_wndTree.InsertItem(name, 0, 0, TVI_ROOT, TVI_LAST); m_wndTree.Invalidate(); m_wndTree.SelectItem(item); InsertData(m_server, _T(""), name, _T(""), _T(""), m_sTblName); } void CGLTKDlg::OnBnClickedAddStandard() { //新建标准,弹出一个对话框, HTREEITEM item = m_wndTree.GetSelectedItem(); if (!IsCityItem(m_wndTree, item)) { AfxMessageBox(_T("请选中一个节点!")); return; } CString name(_T("")); if (!CoreTools::getNameByDialog(_T("请输入标准名称"), _T("标准名称:"), name)) return; if (name.IsEmpty()) return; if (hasSameStandard(m_wndTree, item, name)) { AfxMessageBox(_T("输入的标准名已存在。")); return; } HTREEITEM sub = m_wndTree.InsertItem(name, 0, 0, item, TVI_LAST); m_wndTree.Expand(item, TVE_EXPAND); m_wndTree.Invalidate(); m_wndTree.SelectItem(sub); CString city = m_wndTree.GetItemText(item); InsertData(m_server, _T(""), city, name, _T(""), m_sTblName); } void CGLTKDlg::OnBnClickedInput() { HTREEITEM item = m_wndTree.GetSelectedItem(); if (!IsStandardItem(m_wndTree, item)) { AfxMessageBox(_T("请选中一个标准")); return; } CString city = m_wndTree.GetItemText(m_wndTree.GetParentItem(item)); CString standard = m_wndTree.GetItemText(item); CString section; m_wndScrEdit.GetWindowText(section); CString sName(_T("")); if (!CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName)) return; if (sName.IsEmpty()) return; InsertData(m_server, sName, city, standard, section, m_sTblName); m_bScrForAddToDb = false;//入库完毕,控件为灰色 RefreshLst(m_server, m_wndList, m_wndTree, item, m_sTblName); // 入库成功,三个按钮无效 if (GetDlgItem(IDC_BUTTON1)) GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); if (GetDlgItem(IDC_BUTTON2)) GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); if (GetDlgItem(IDC_BUTTON3)) GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); m_wndList.EnableWindow(TRUE); UpdateWindow(); RedrawWindow(); } void CGLTKDlg::OnBnClickedOk() { CDialog::OnOK(); } HBRUSH CGLTKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == GetDlgItem(IDC_EDIT1)) { if (m_bScrForAddToDb) { COLORREF crColor = RGB(255, 0, 0); pDC->SetTextColor(crColor); } } return hbr; } void CGLTKDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { *pResult = 0; // 只有点中城市节点时,list才会更新,点中标准节点时,先取父节点,更新list,然后gsview更新 LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); HTREEITEM hSelect = pNMTreeView->itemNew.hItem; if (!hSelect) return; // 城市 if (IsCityItem(m_wndTree, hSelect)) { RefreshLst(m_server, m_wndList, m_wndTree, hSelect, m_sTblName); } else // 标准 { RefreshLst(m_server, m_wndList, m_wndTree, hSelect, m_sTblName); } } void CGLTKDlg::OnAddCity() { OnBnClickedAddCity(); } void CGLTKDlg::OnDelItem() { if (AfxMessageBox(_T("是否删除这个节点?这个操作不能够恢复!"), MB_YESNO) != IDYES) return; deleteCurrentItem(m_server, m_wndTree, m_sTblName); m_wndTree.Invalidate(); HTREEITEM item = m_wndTree.GetFirstVisibleItem(); if (item) m_wndTree.SelectItem(item); else m_wndList.DeleteAllItems(); } void CGLTKDlg::OnDelSection() { if (AfxMessageBox(_T("是否进行删除,此操作不能恢复!"), MB_YESNO) != IDYES) return; int nCurSel = m_wndList.GetSelectionMark(); HTREEITEM item = m_wndTree.GetSelectedItem(); CString city(_T("")); if (IsCityItem(m_wndTree, item)) city = m_wndTree.GetItemText(item); else city = m_wndTree.GetItemText(m_wndTree.GetParentItem(item)); CString standard = m_wndTree.GetItemText(item); CString name = m_wndList.GetItemText(nCurSel, 2); CString sql(_T("")); sql.Format(_T("delete from %s where city='%s' and standard='%s' and name='%s'"), m_sTblName, city, standard, name); m_server.ExecuteSQL(sql); RefreshLst(m_server, m_wndList, m_wndTree, item, m_sTblName); } void CGLTKDlg::OnAddStandard() { OnBnClickedAddStandard(); } void CGLTKDlg::OnNMRClickTree1(NMHDR *pNMHDR, LRESULT *pResult) { CPoint pt; ::GetCursorPos(&pt); CPoint pointInTree = pt; m_wndTree.ScreenToClient(&pointInTree); UINT nFlag = TVHT_ONITEM; // 当在 Item 上右击时 HTREEITEM item = m_wndTree.HitTest(pointInTree, &nFlag); CMenu menu; menu.CreatePopupMenu(); if (!item) // 空,则新建城市 { menu.AppendMenu(MF_STRING, IDM_ADD_CITY, _T("添加节点")); } else if (m_wndTree.GetParentItem(item) == NULL) // 选中城市节点 { m_wndTree.SelectItem(item); menu.AppendMenu(MF_STRING, IDM_ADD_STANDARD, _T("添加标准")); menu.AppendMenu(MF_STRING, IDM_DEL_CITY, _T("删除节点")); } else // 选中标准节点 { m_wndTree.SelectItem(item); menu.AppendMenu(MF_STRING, IDM_DEL_STANDARD, _T("删除标准")); } menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); *pResult = 0; } void CGLTKDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) { *pResult = 0; LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); int nCurSel = pNMLV->iItem; if (m_nItemSel == nCurSel) return; CString sCity(_T("")), sStandard(_T("")), sName(_T("")), sSql(_T("")); sCity = m_wndList.GetItemText(nCurSel, 0); sStandard = m_wndList.GetItemText(nCurSel, 1); sName = m_wndList.GetItemText(nCurSel, 2); sSql.Format(_T("select section from %s where city='%s' and standard='%s' and name='%s'") , m_sTblName, sCity, sStandard, sName); m_server.GetSelData(sSql, m_sCrossSectionScr); if (!m_sCrossSectionScr.IsEmpty()) { UpdateData(FALSE); RefreshPreviewCtrl(); m_nItemSel = nCurSel; } } void CGLTKDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here *pResult = 0; LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); int nCurSel = pNMLV->iItem; CPoint pt; ::GetCursorPos(&pt); CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, IDM_DEL_SECTION, _T("删除")); menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); }