#include "stdafx.h" #include "resource.h" #include "CGLFJDlg.h" #include "uitools.h" #include "TJDJDlg.h" #include "TJZJDlg.h" #include "cxlfsdlg.h" namespace { // 很多截面的附件通过索引号进行删除 // ,但是m_mapAddtion中的key还包含了其它内容 // ,所以需要解析出key中的索引才可以进行添加和删除 // 注意,下面三个函数,只处理索引在附件类型前面的情况(例:x-x-x-idx-type) bool hasAddin(const int &idx, LPCTSTR addinType, const CMapStringToString &mapAddtion) { CString sK(_T("")), sV(_T("")), sTrait(_T("")); sTrait.Format(_T("%d-%s"), idx, addinType); int nRes(-1); POSITION pos = mapAddtion.GetStartPosition(); while (pos) { mapAddtion.GetNextAssoc(pos, sK, sV); // 分析sK,看是否存在 索引-类型 的情况 nRes = sK.Find(sTrait); if (nRes != -1) return true; } return false; } void removeAddin(const int &idx, LPCTSTR addinType, CMapStringToString &mapAddtion) { std::vector delKeys(0); CString sK(_T("")), sV(_T("")), sTrait(_T("")); sTrait.Format(_T("%d-%s"), idx, addinType); int nRes(-1); POSITION pos = mapAddtion.GetStartPosition(); while (pos) { mapAddtion.GetNextAssoc(pos, sK, sV); // 分析sK,看是否存在 索引-类型 的情况 nRes = sK.Find(sTrait); if (nRes != -1) delKeys.push_back(sK); } for (size_t i = 0; i < delKeys.size(); ++i) mapAddtion.RemoveKey(delKeys[i]); } CString getMapKey(const PIPECABLE::HOLDER &holder) { CString sKey(_T("")); sKey.Format(_T("%d-%d-%d-%s"), holder.m_nRoomIdx, holder.m_nPos, holder.m_nNo, PIPECABLE::HOLDER::flag()); return sKey; } CString getMapKey(const PIPECABLE::HANGER &hanger) { CString sKey(_T("")); sKey.Format(_T("%d-%d-%d-%s"), hanger.m_nRoomIdx, 0, hanger.m_nNo, PIPECABLE::HANGER::flag()); return sKey; } CString getMapKey(const PIPECABLE::BOSS &boss) { CString sKey(_T("")); sKey.Format(_T("%d-%s-%s"), boss.m_nRoomIdx, boss.m_nNo, PIPECABLE::BOSS::flag()); return sKey; } } IMPLEMENT_DYNAMIC(CGLFJDlg, CDialog) CGLFJDlg::CGLFJDlg(const PIPECABLE::ETYPE &type , int nRoom , LPCTSTR pszScript , LPCTSTR pszOffset , CMapStringToString &mpAddin , CStringArray &rooms , CWnd* pParent) : CDialog(IDD_GLFJ_DLG, pParent) , m_dlgType(type) , m_Script(pszScript) , m_Addin(mpAddin) , m_nRoom(nRoom) , m_sOffset(pszOffset) { m_rooms.Append(rooms); } CGLFJDlg::~CGLFJDlg() { } void CGLFJDlg::initUI() { switch (m_dlgType) { case PIPECABLE::eHOLDER: SetWindowText(_T("管廊支架管理")); m_btnCabling.SetWindowText(_T("布线")); break; case PIPECABLE::eHANGER: SetWindowText(_T("管廊吊架管理")); m_btnCabling.SetWindowText(_T("布线")); break; case PIPECABLE::eBOSS: SetWindowText(_T("管廊管位管理")); m_btnCabling.SetWindowText(_T("布管")); break; case PIPECABLE::eNone: SetWindowText(_T("!!ERROR!!")); break; default: break; } initList(); } void CGLFJDlg::initList() { m_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ctrlList.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40); m_ctrlList.InsertColumn(1, _T("舱室"), LVCFMT_CENTER, 80); m_ctrlList.InsertColumn(2, _T("敷设"), LVCFMT_CENTER, 40); switch (m_dlgType) { case PIPECABLE::eHOLDER: m_ctrlList.InsertColumn(3, _T("位置"), LVCFMT_CENTER, 40); m_ctrlList.InsertColumn(4, _T("行数"), LVCFMT_CENTER, 40); m_ctrlList.InsertColumn(5, _T("用途"), LVCFMT_CENTER, 80); m_ctrlList.InsertColumn(6, _T("材质"), LVCFMT_CENTER, 80); break; case PIPECABLE::eHANGER: m_ctrlList.InsertColumn(3, _T("行数"), LVCFMT_CENTER, 40); m_ctrlList.InsertColumn(4, _T("用途"), LVCFMT_CENTER, 80); m_ctrlList.InsertColumn(5, _T("材质"), LVCFMT_CENTER, 80); break; case PIPECABLE::eBOSS: m_ctrlList.InsertColumn(3, _T("类型"), LVCFMT_CENTER, 60); m_ctrlList.InsertColumn(4, _T("用途"), LVCFMT_CENTER, 80); m_ctrlList.InsertColumn(5, _T("材质"), LVCFMT_CENTER, 80); break; default: break; } refreshListByString(); } void CGLFJDlg::refreshListByString() { m_ctrlList.DeleteAllItems(); m_holders.clear(); m_hangers.clear(); m_bosses.clear(); std::vector items(0); switch (m_dlgType) { case PIPECABLE::eHOLDER: { PIPECABLE::HOLDER holder; if (!PIPECABLE::analyEwAddin(m_Script, m_holders)) break; for (PIPECABLE::HolderSet::iterator it = m_holders.begin(); it != m_holders.end(); it++) insert2List(*it); break; } case PIPECABLE::eHANGER: { PIPECABLE::HANGER hanger; if (!PIPECABLE::analyEwAddin(m_Script, m_hangers)) break; for (PIPECABLE::HangerSet::iterator it = m_hangers.begin(); it != m_hangers.end(); it++) insert2List(*it); break; } case PIPECABLE::eBOSS: { PIPECABLE::BOSS boss; if (!PIPECABLE::analyEwAddin(m_Script, m_bosses)) break; for (PIPECABLE::BossSet::iterator it = m_bosses.begin(); it != m_bosses.end(); it++) insert2List(*it); break; } default: break; } return; } void CGLFJDlg::refreshListByData() { m_ctrlList.DeleteAllItems(); switch (m_dlgType) { case PIPECABLE::eHOLDER: for (PIPECABLE::HolderSet::iterator it = m_holders.begin(); it != m_holders.end(); ++it) insert2List(*it); break; case PIPECABLE::eHANGER: for (PIPECABLE::HangerSet::iterator it = m_hangers.begin(); it != m_hangers.end(); ++it) insert2List(*it); break; case PIPECABLE::eBOSS: for (PIPECABLE::BossSet::iterator it = m_bosses.begin(); it != m_bosses.end(); ++it) insert2List(*it); break; default: break; } return; } void CGLFJDlg::insert2List(const PIPECABLE::HOLDER & holder) { int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(holder.m_nNo)); m_ctrlList.SetItemText(nRow, 1, holder.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[holder.m_nRoomIdx] : _T("ERROR")); m_ctrlList.SetItemText(nRow, 2, holder.m_cabling.hasCabling() ? _T("是") : _T("否")); m_ctrlList.SetItemText(nRow, 3, holder.m_nPos == 0 ? _T("左") : _T("右")); m_ctrlList.SetItemText(nRow, 4, TypeConvert::i2s(holder.m_nRow)); m_ctrlList.SetItemText(nRow, 5, holder.m_sSpec); m_ctrlList.SetItemText(nRow, 6, holder.m_sMaterial); } void CGLFJDlg::insert2List(const PIPECABLE::HANGER & hanger) { int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(hanger.m_nNo)); m_ctrlList.SetItemText(nRow, 1, hanger.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[hanger.m_nRoomIdx] : _T("ERROR")); m_ctrlList.SetItemText(nRow, 2, hanger.m_cabling.hasCabling() ? _T("是") : _T("否")); m_ctrlList.SetItemText(nRow, 3, TypeConvert::i2s(hanger.m_nRow)); m_ctrlList.SetItemText(nRow, 4, hanger.m_sSpec); m_ctrlList.SetItemText(nRow, 5, hanger.m_sMaterial); } void CGLFJDlg::insert2List(const PIPECABLE::BOSS & boss) { int nRow = m_ctrlList.InsertItem(0, TypeConvert::i2s(boss.m_nNo)); m_ctrlList.SetItemText(nRow, 1, boss.m_nRoomIdx < m_rooms.GetSize() ? (LPCTSTR)m_rooms[boss.m_nRoomIdx] : _T("ERROR")); m_ctrlList.SetItemText(nRow, 2, /*boss.m_cabling.m_bValid ? _T("是") :*/ _T("否")); m_ctrlList.SetItemText(nRow, 3, boss.m_nKind == 0 ? _T("水泥支墩") : _T("角钢支架")); m_ctrlList.SetItemText(nRow, 4, boss.m_sSpec); m_ctrlList.SetItemText(nRow, 5, boss.m_sMertial); } void CGLFJDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_BUTTON4, m_btnCabling); DDX_Control(pDX, IDC_LIST1, m_ctrlList); } BOOL CGLFJDlg::OnInitDialog() { CDialog::OnInitDialog(); initUI(); return TRUE; } BEGIN_MESSAGE_MAP(CGLFJDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CGLFJDlg::OnBnClickedADD) ON_BN_CLICKED(IDC_BUTTON2, &CGLFJDlg::OnBnClickedModify) ON_BN_CLICKED(IDC_BUTTON3, &CGLFJDlg::OnBnClickedDelete) ON_BN_CLICKED(IDC_BUTTON4, &CGLFJDlg::OnBnClickedCabling) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CGLFJDlg::OnNMDblclkList1) END_MESSAGE_MAP() void CGLFJDlg::OnBnClickedADD() { switch (m_dlgType) { case PIPECABLE::eHOLDER: { CTJZJDlg dlg; dlg.m_data.m_nNo = 1; if (!m_holders.empty()) dlg.m_data.m_nNo = m_holders.rbegin()->m_nNo + 1; if (dlg.DoModal() != IDOK) break; PIPECABLE::HOLDER holder(dlg.m_data); holder.m_nRoomIdx = m_nRoom; holder.m_sOffset = m_sOffset; CString sKey(getMapKey(holder)); // 如果存在,先删除 if (hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin)) m_Addin.RemoveKey(sKey); m_Addin.SetAt(sKey, holder.toString(m_nRoom, m_sOffset)); m_holders.insert(holder); insert2List(holder); break; } case PIPECABLE::eHANGER: { CTJDJDlg dlg; dlg.m_data.m_nNo = 1; if (!m_hangers.empty()) dlg.m_data.m_nNo = m_hangers.rbegin()->m_nNo + 1; if (dlg.DoModal() != IDOK) break; PIPECABLE::HANGER hanger(dlg.m_data); hanger.m_nRoomIdx = m_nRoom; hanger.m_sOffset = m_sOffset; CString sKey(getMapKey(hanger)); // 如果存在,先删除 if (hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin)) m_Addin.RemoveKey(sKey); m_Addin.SetAt(sKey, hanger.toString(m_nRoom, m_sOffset)); m_hangers.insert(hanger); insert2List(hanger); break; } case PIPECABLE::eBOSS: break; default: break; } } void CGLFJDlg::OnBnClickedModify() { int nRow = m_ctrlList.GetSelectionMark(); if (nRow == -1) { AfxMessageBox(_T("请选择一行数据。")); return; } CString sKey(_T("")) , sNo(m_ctrlList.GetItemText(nRow, 0)); int nNo(TypeConvert::s2i(sNo)); switch (m_dlgType) { case PIPECABLE::eHOLDER: { if (nRow >= m_holders.size()) break; PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders)); if (it == m_holders.end()) break; PIPECABLE::HOLDER &holder(const_cast(*it)); if (!hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin)) break; CTJZJDlg dlg; dlg.m_data = holder; dlg.m_nOldRow = holder.m_nRow; dlg.m_bModify = true; if (dlg.DoModal() != IDOK) break; // 先把key取出 sKey = getMapKey(holder); holder = dlg.m_data; if (m_Addin.RemoveKey(sKey)) m_Addin.SetAt(sKey, holder.toString(holder.m_nRoomIdx, holder.m_sOffset)); break; } case PIPECABLE::eHANGER: { if (nRow >= m_hangers.size()) break; PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers)); if (it == m_hangers.end()) break; PIPECABLE::HANGER &hanger(const_cast(*it)); if (!hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin)) break; CTJDJDlg dlg; dlg.m_data = hanger; dlg.m_nOldRow = hanger.m_nRow; dlg.m_bModify = true; if (dlg.DoModal() != IDOK) break; hanger = dlg.m_data; sKey = getMapKey(hanger); if (m_Addin.RemoveKey(sKey)) m_Addin.SetAt(sKey, hanger.toString(hanger.m_nRoomIdx, hanger.m_sOffset)); break; } case PIPECABLE::eBOSS: { if (nRow >= m_bosses.size()) break; PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses)); if (it == m_bosses.end()) break; PIPECABLE::BOSS &boss(const_cast(*it)); if (!hasAddin(boss.m_nNo, PIPECABLE::BOSS::flag(), m_Addin)) break; break; } default: break; } refreshListByData(); return; } void CGLFJDlg::OnBnClickedDelete() { if (AfxMessageBox(_T("确定要删除?此操作不可回复!"), MB_YESNO) != IDYES) return; int nRow = m_ctrlList.GetSelectionMark(); if (nRow == -1) { AfxMessageBox(_T("请选择一行数据。")); return; } CString sKey(_T("")) , sNo(m_ctrlList.GetItemText(nRow, 0)); int nNo(TypeConvert::s2i(sNo)); switch (m_dlgType) { case PIPECABLE::eHOLDER: { if (nRow >= m_holders.size()) break; PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders)); if (it == m_holders.end()) break; sKey = getMapKey(*it); if (m_Addin.RemoveKey(sKey)) m_holders.erase(it); break; } case PIPECABLE::eHANGER: { if (nRow >= m_hangers.size()) break; PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers)); if (it == m_hangers.end()) break; sKey = getMapKey(*it); if (m_Addin.RemoveKey(sKey)) m_hangers.erase(it); break; } case PIPECABLE::eBOSS: { if (nRow >= m_bosses.size()) break; PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses)); if (it == m_bosses.end()) break; sKey = getMapKey(*it); if (m_Addin.RemoveKey(sKey)) m_bosses.erase(it); break; } default: return; } refreshListByData(); return; } void CGLFJDlg::OnBnClickedCabling() { int nRow = m_ctrlList.GetSelectionMark(); if (nRow == -1) { AfxMessageBox(_T("请选择一行数据。")); return; } CString sKey(_T("")) , sTitle(_T("")) , sNo(m_ctrlList.GetItemText(nRow, 0)); int nNo(TypeConvert::s2i(sNo)); switch (m_dlgType) { case PIPECABLE::eHOLDER: { if (nRow >= m_holders.size()) break; PIPECABLE::HolderSet::iterator it(PIPECABLE::findItem(nNo, m_holders)); if (it == m_holders.end()) break; PIPECABLE::HOLDER &holder(const_cast(*it)); if (!hasAddin(holder.m_nNo, PIPECABLE::HOLDER::flag(), m_Addin)) break; sTitle.Format(_T("支架%d-%s-共%d层"), holder.m_nNo, m_rooms[holder.m_nRoomIdx], holder.m_nRow); CXLFSDlg dlg(holder.m_cabling, sTitle); if (dlg.DoModal() != IDOK) break; holder.m_cabling = dlg.m_cabling; sKey = getMapKey(holder); if (m_Addin.RemoveKey(sKey)) m_Addin.SetAt(sKey, holder.toString(holder.m_nRoomIdx, holder.m_sOffset)); break; } case PIPECABLE::eHANGER: { if (nRow >= m_hangers.size()) break; PIPECABLE::HangerSet::iterator it(PIPECABLE::findItem(nNo, m_hangers)); if (it == m_hangers.end()) break; PIPECABLE::HANGER &hanger(const_cast(*it)); if (!hasAddin(hanger.m_nNo, PIPECABLE::HANGER::flag(), m_Addin)) break; sTitle.Format(_T("吊架%d-%s-共%d层"), hanger.m_nNo, m_rooms[hanger.m_nRoomIdx], hanger.m_nRow); CXLFSDlg dlg(hanger.m_cabling, sTitle); if (dlg.DoModal() != IDOK) break; hanger.m_cabling = dlg.m_cabling; sKey = getMapKey(hanger); if (m_Addin.RemoveKey(sKey)) m_Addin.SetAt(sKey, hanger.toString(hanger.m_nRoomIdx, hanger.m_sOffset)); break; } case PIPECABLE::eBOSS: { if (nRow >= m_bosses.size()) break; PIPECABLE::BossSet::iterator it(PIPECABLE::findItem(nNo, m_bosses)); if (it == m_bosses.end()) break; PIPECABLE::BOSS &boss(const_cast(*it)); if (!hasAddin(boss.m_nNo, PIPECABLE::BOSS::flag(), m_Addin)) break; break; } default: break; } refreshListByData(); return; } void CGLFJDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); *pResult = 0; OnBnClickedModify(); }