Files
envi-code/SourceCode/Code2026/CoreCommand/SelectHeaderDlg.cpp
T

273 lines
6.5 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#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<LPTSTR>(_T("选择"));
lvcolumn.iSubItem = 0;
lvcolumn.cx = firstWidth;
m_wndList.InsertColumn(0, &lvcolumn);
lvcolumn.pszText = const_cast<LPTSTR>(_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<CString> 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);
}
}