274 lines
6.5 KiB
C++
274 lines
6.5 KiB
C++
#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);
|
|
}
|
|
}
|