#include "stdafx.h" #include "earthwormdef.h" #include "SelectHeaderDlg.h" #include "makeCADTable.h" #include "verifyNumberString.h" #include "KTModelLayoutXData.h" #include "AskAIPaletteSet.h" namespace { void selectChangeTo(CXListCtrl &list, const int &idx_from, const int &idx_to) { int nCount(list.GetItemCount()); if (nCount <= 0) return; if (idx_from < 0 || idx_from >= nCount) return; if (idx_to < 0 || idx_to >= nCount) return; bool bState_from(list.GetItemCheckedState(idx_from, 0) == 0 ? false : true); bool bState_to(list.GetItemCheckedState(idx_to, 0) == 0 ? false : true); CString s_from(list.GetItemText(idx_from, 1)); CString s_to(list.GetItemText(idx_to, 1)); DWORD_PTR data_from = list.GetItemData(idx_from); DWORD_PTR data_to = list.GetItemData(idx_to); list.SetItemText(idx_from, 1, s_to); list.SetItemText(idx_to, 1, s_from); list.SetItemCheckedState(idx_from, 0, bState_to); list.SetItemCheckedState(idx_to, 0, bState_from); list.SetItemData(idx_from, data_to); list.SetItemData(idx_to, data_from); list.SetSelectionMark(idx_to); list.SetItemState(idx_to, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); } } IMPLEMENT_DYNAMIC(CSelectHeaderDlg, CDialog) BEGIN_MESSAGE_MAP(CSelectHeaderDlg, CDialog) ON_BN_CLICKED(IDOK, &CSelectHeaderDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BTN_UP, &CSelectHeaderDlg::OnBnClickedBtnUp) ON_BN_CLICKED(IDC_BTN_DOWN, &CSelectHeaderDlg::OnBnClickedBtnDown) ON_CBN_SELCHANGE(IDC_COMBO_TEMPLATE, &CSelectHeaderDlg::OnComboBoxTemplateListSelChange) ON_CBN_DROPDOWN(IDC_COMBO_TEMPLATE, &CSelectHeaderDlg::OnComboBoxTemplateListDropDown) END_MESSAGE_MAP() CSelectHeaderDlg::CSelectHeaderDlg(CHeaderCtrl *pHeaderCtrl , CWnd * pParent) : CDialog(IDD_DLG_SELECT_HEADER, pParent) , m_pHeaderCtrl(pHeaderCtrl) , m_sTemplate(_T("")) , m_sScale(_T("1:100")) { } CSelectHeaderDlg::~CSelectHeaderDlg() { } void CSelectHeaderDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST, m_wndList); DDX_Control(pDX, IDC_COMBO_TEMPLATE, m_cmbTemplates); DDX_Text(pDX, IDC_COMBO_PSCALE, m_sScale); DDX_CBString(pDX, IDC_COMBO_TEMPLATE, m_sTemplate); } BOOL CSelectHeaderDlg::OnInitDialog() { CDialog::OnInitDialog(); m_wndList.SetExtendedStyle( m_wndList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); CRect rect; m_wndList.GetWindowRect(&rect); int width(rect.Width() - 2), firstWidth(80); width -= ::GetSystemMetrics(SM_CXVSCROLL); width -= firstWidth; // 第一列,选择列 LV_COLUMN lvcolumn; ::memset(&lvcolumn, 0, sizeof(lvcolumn)); lvcolumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcolumn.fmt = LVCFMT_CENTER | LVCFMT_LEFT; lvcolumn.pszText = const_cast(_T("选择")); lvcolumn.iSubItem = 0; lvcolumn.cx = firstWidth; m_wndList.InsertColumn(0, &lvcolumn); lvcolumn.pszText = const_cast(_T("列名")); lvcolumn.iSubItem = 1; lvcolumn.cx = width; m_wndList.InsertColumn(1, &lvcolumn); int count = m_pHeaderCtrl->GetItemCount(); CString sItem; HDITEM HeaderItem; HeaderItem.cchTextMax = 512; HeaderItem.pszText = sItem.GetBuffer(HeaderItem.cchTextMax); CRect rc; for (int i(0); i < count; ++i) { HeaderItem.mask = HDI_TEXT; m_pHeaderCtrl->GetItemRect(i, rc); if (rc.Width() > 0) m_pHeaderCtrl->GetItem(i, &HeaderItem); else continue; m_wndList.InsertItem(i, _T("")); m_wndList.SetCheckbox(i, 0, true); m_wndList.SetItemText(i, 1, HeaderItem.pszText); m_wndList.SetItemData(i, i); } sItem.ReleaseBuffer(); if (m_wndList.GetItemCount() > 0) m_wndList.SetSelectionMark(0); std::vector templates; MKTABLE::getTableTemplateList(templates); if (templates.empty()) { EndDialog(FALSE); return TRUE; } for (size_t i(0); i < templates.size(); ++i) { m_cmbTemplates.AddString(templates[i]); } m_cmbTemplates.SetCurSel(0); OnComboBoxTemplateListSelChange(); AecDbObjXDataMap xDataMap; if (KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap)) xDataMap.GetAt(DOC_SCALE, m_sScale); UpdateData(FALSE); return TRUE; } void CSelectHeaderDlg::OnBnClickedBtnUp() { int idx(m_wndList.GetSelectionMark()); if (idx < 0) { AfxMessageBox(_T("请选择一行。")); return; } selectChangeTo(m_wndList, idx, idx - 1); } void CSelectHeaderDlg::OnBnClickedBtnDown() { int idx(m_wndList.GetSelectionMark()); if (idx < 0) { AfxMessageBox(_T("请选择一行。")); return; } selectChangeTo(m_wndList, idx, idx + 1); } void CSelectHeaderDlg::OnComboBoxTemplateListSelChange() { int idx = m_cmbTemplates.GetCurSel(); if (idx == -1) return; CString str; m_cmbTemplates.GetLBText(idx, str); CSize sz = CAskAIPalette::getControlWndTextSize(&m_cmbTemplates, *GetFont(), str); int margin = ::GetSystemMetrics(SM_CXVSCROLL) + 10; CRect rcCmb; m_cmbTemplates.GetWindowRect(&rcCmb); //if (rcCmb.Width() - margin < sz.cx) //{ rcCmb.right = rcCmb.left + sz.cx + margin; ScreenToClient(rcCmb); m_cmbTemplates.MoveWindow(rcCmb); //} } void CSelectHeaderDlg::OnComboBoxTemplateListDropDown() { int iCount = m_cmbTemplates.GetCount(); CString str; int len(0); CSize sz; for (int i(0); i < iCount; ++i) { m_cmbTemplates.GetLBText(i, str); sz = CAskAIPalette::getControlWndTextSize(&m_cmbTemplates, *GetFont(), str); if (len < sz.cx) len = sz.cx; } int nMin = m_cmbTemplates.GetMinVisible(); m_cmbTemplates.SetDroppedWidth(len + (nMin < iCount ? 25 : 10)); } bool CSelectHeaderDlg::validatePScale() { int nIndex = m_sScale.Find(_T(":"), 0); if (nIndex != -1 && nIndex < m_sScale.GetLength()) { int nLeft = _ttoi(m_sScale.Mid(0, nIndex)); if (nLeft != 1) { AfxMessageBox(_T("“出图比例”中,“:”号前数字必须为“1”。")); return false; } if (!VNST(m_sScale.Mid(nIndex + 1))) { AfxMessageBox(_T("“出图比例”中,“:”号后必须为数字。")); return false; } double dRight = _ttof(m_sScale.Mid(nIndex + 1)); if (dRight <= 0) { AfxMessageBox(_T("“出图比例”中,“:”号后数字必须大于“0”。")); return false; } } return true; } void CSelectHeaderDlg::OnBnClickedOk() { if (!UpdateData()) return; m_idxOfColumns.clear(); for (int i(0); i < m_wndList.GetItemCount(); ++i) { if (m_wndList.GetItemCheckedState(i, 0) == 1) { m_idxOfColumns.push_back((int)m_wndList.GetItemData(i)); } } if (!validatePScale()) return; getPScale(); CDialog::OnOK(); } void CSelectHeaderDlg::getPScale() { m_dPScale = 100.0; CString sScale = m_sScale; int idx = sScale.Find(':'); if (idx != -1) { sScale = sScale.Right(sScale.GetLength() - idx - 1); m_dPScale = _ttof(sScale); } }