Files
envi-code/SourceCode/Code2026/Dimension/DimOptionDlg.cpp
T
2026-09-28 15:28:50 +08:00

627 lines
14 KiB
C++

#include "stdafx.h"
#include "DimOptionDlg.h"
#include "ui_ComboInListView.h"
#include "coretools.h"
#define IDC_COMBOBOXINLISTVIEW 0x1235
////////////////////////////////////////////////////////////////////////////////
#pragma region CDimOptionDlg
IMPLEMENT_DYNAMIC(CDimOptionDlg, CAcUiDialog)
BEGIN_MESSAGE_MAP(CDimOptionDlg, CAcUiDialog)
ON_WM_CREATE()
ON_BN_CLICKED(IDOK, &CDimOptionDlg::OnBnClickedOk)
END_MESSAGE_MAP()
CDimOptionDlg::CDimOptionDlg(CWnd * parent): CAcUiDialog(IDD, parent)
{
m_dict.ReadByDWG();
}
CDimOptionDlg::~CDimOptionDlg()
{
}
BOOL CDimOptionDlg::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
CRect rect;
m_ctrlPos.GetWindowRect(rect);
ScreenToClient(rect);
m_list.MoveWindow(rect);
return 1;
}
void CDimOptionDlg::DoDataExchange(CDataExchange * pDX)
{
CAcUiDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_POS, m_ctrlPos);
}
int CDimOptionDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CAcUiDialog::OnCreate(lpCreateStruct) == -1)
return -1;
m_list.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(), this, 0x1001);
m_list.setWDictPtr(&m_dict);
m_list.InitializeGrid();
//m_list.SetExtendedStyle(0);
m_list.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
return 0;
}
BOOL CDimOptionDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->idFrom == IDC_COMBOBOXINLISTVIEW)
{
LV_DISPINFO *pInfo = (LV_DISPINFO*)lParam;
int iItem = pInfo->item.iItem;
int iSubItem = pInfo->item.iSubItem;
m_list.modifyPsCombo(iItem, pInfo->item.iIndent);
}
return CAcUiDialog::OnNotify(wParam, lParam, pResult);
}
void CDimOptionDlg::OnBnClickedOk()
{
using namespace DIMJson;
WValue v;
WDict dict;
m_list.saveToWDict(dict);
dict.WriteToDWG();
CAcUiDialog::OnOK();
}
#pragma endregion
#pragma region WDictGridList
BEGIN_MESSAGE_MAP(WDictGridList, CSuperGridCtrl)
ON_WM_CREATE()
END_MESSAGE_MAP()
WDictGridList::WDictGridList() { }
WDictGridList::~WDictGridList() { }
void WDictGridList::InitializeSubGrid(WDictItem *pItem, CTreeItem *pTree)
{
if (!pItem) return;
int type(pItem->GetType());
switch (type)
{
case TYPE_WDict:
{
WDict *p((WDict*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WDict);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
lp->AddSubItemText(_T(""));
lp->AddSubItemText(pItem->m_sDesc);
CTreeItem *pSub(NULL);
if (pTree)
pSub = InsertItem(pTree, lp);
else
pSub = InsertRootItem(lp);
for (p->MoveToFirst(); !p->IsOut(); p->MoveToNext())
{
InitializeSubGrid(p->GetCurData(), pSub);
}
}
break;
case TYPE_WBoolItem:
{
WBoolItem *p((WBoolItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WBool);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
if (p->m_data)
lp->AddSubItemText(_T("是"));
else
lp->AddSubItemText(_T("否"));
lp->SetControlType(lp->combobox, 0);
CStringList list;
list.AddTail(_T("是"));
list.AddTail(_T("否"));
lp->SetListData(0, &list);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
case TYPE_WCharItem:
{
WCharItem *p((WCharItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WChar);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
lp->AddSubItemText(p->m_data);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
case TYPE_WLongItem:
{
WLongItem *p((WLongItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WLong);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
CString s;
s.Format(_T("%d"), p->m_data);
lp->AddSubItemText(s);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
case TYPE_WDoubleItem:
{
WDoubleItem *p((WDoubleItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WDouble);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
CString s;
s.Format(_T("%.2f"), p->m_data);
lp->AddSubItemText(s);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
case TYPE_WCStringItem:
{
WCStringItem *p((WCStringItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WCString);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
lp->AddSubItemText(p->m_data);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
case TYPE_WSelectItem:
{
WSelectItem *p((WSelectItem*)pItem);
CItemInfo* lp = new CItemInfo();
lp->setDataType(CItemInfo::WCombo);
lp->SetImage(0);
lp->SetItemText(pItem->m_sName);
CStringList list;
for (p->MoveToFirst(); !p->IsOut(); p->MoveToNext())
list.AddTail(p->GetCurData());
POSITION pos = list.FindIndex(p->m_data);
lp->AddSubItemText(list.GetAt(pos));
lp->SetControlType(lp->combobox, 0);
lp->SetListData(0, &list);
lp->AddSubItemText(pItem->m_sDesc);
InsertItem(pTree, lp);
}
break;
default:
break;
}
}
void WDictGridList::InitializeGrid(void)
{
SetExtendedStyle(LVS_EX_GRIDLINES);
LPCTSTR lpszCols[] = { _T("类型\\选项"),_T("值"),_T("描述信息"),0 };
LV_COLUMN lvColumn;
//initialize the columns
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 200;
for (int x = 0; lpszCols[x] != NULL; x++)
{
if (x)
lvColumn.cx = 150;
lvColumn.pszText = const_cast<LPTSTR>(lpszCols[x]);
InsertColumn(x, &lvColumn);
}
if (!m_pDict) return;
WDict *pDict(m_pDict);
for (pDict->MoveToFirst(); !pDict->IsOut(); pDict->MoveToNext())
{
WDictItem *pCurDict = pDict->GetCurData();
if (pCurDict == NULL)
continue;
InitializeSubGrid(pCurDict, NULL);
}
}
CItemInfo* WDictGridList::CopyData(CItemInfo* lpSrc)
{
ASSERT(lpSrc != NULL);
CItemInfo* lpDest = new CItemInfo;
lpDest->CopyObjects(lpSrc);
return lpDest;
}
void WDictGridList::OnControlLButtonDown(UINT nFlags, CPoint point, LVHITTESTINFO & ht)
{
CTreeItem*pSelItem = GetTreeItem(ht.iItem);
if (pSelItem != NULL)
{
CItemInfo* pInfo = GetData(pSelItem);
CItemInfo::CONTROLTYPE ctrlType;
if (pInfo->GetControlType(ht.iSubItem - 1, ctrlType))
{
if (ctrlType == pInfo->combobox)
{
CStringList* list = NULL;
pInfo->GetListData(ht.iSubItem - 1, list);
if (list)
{
CComboBox * pList = ShowList(ht.iItem, ht.iSubItem, list);
}
}
}
/*
else //activate default edit control
CSuperGridCtrl::OnControlLButtonDown(nFlags, point, ht);
*/
}
}
void WDictGridList::OnUpdateListViewItem(CTreeItem * lpItem, LV_ITEM * plvItem)
{
//put some extra validation here
CString str = (CString)plvItem->pszText;
if (!str.Compare(_T("Bugs: Impossible")))
{
str += _T(" (selfconfidence allright)");//that's valid enough :?
CItemInfo *lp = GetData(lpItem);
if (lp != NULL)
{
if (plvItem->iSubItem == 0)
lp->SetItemText(str);
else //subitem data
lp->SetSubItemText(plvItem->iSubItem - 1, str);
UpdateData(lpItem, lp); //update internal nodes
}
SetItemText(plvItem->iItem, plvItem->iSubItem, str.GetBuffer(1));
}
else
CSuperGridCtrl::OnUpdateListViewItem(lpItem, plvItem);
}
BOOL WDictGridList::OnVkReturn(void)
{
BOOL bResult = FALSE;
int iItem = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
if (GetCurSubItem() != -1 && iItem != -1)
{
CTreeItem*pSelItem = GetTreeItem(iItem);
if (pSelItem != NULL)
{
CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
int iSubItem = Header_OrderToIndex(pHeader->m_hWnd, GetCurSubItem());
CItemInfo* pInfo = GetData(pSelItem);
CItemInfo::CONTROLTYPE ctrlType;
if (pInfo->GetControlType(iSubItem - 1, ctrlType))
{
switch (ctrlType)
{
/*put in your own control here*/
case pInfo->datecontrol:break;
case pInfo->spinbutton:break;
case pInfo->dropdownlistviewwhatevercontrol:break;
case pInfo->combobox:
{
CStringList* list = NULL;
pInfo->GetListData(iSubItem - 1, list);
CComboBox * pList = ShowList(iItem, iSubItem, list);
bResult = TRUE; //I'll handle it from here
}break;
default:break;
}
}
}
}
return bResult;
}
BOOL WDictGridList::OnItemLButtonDown(LVHITTESTINFO & ht)
{
return 1;
}
CComboBox * WDictGridList::ShowList(int nItem, int nCol, CStringList * lstItems)
{
CString strFind = GetItemText(nItem, nCol);
//basic code start
CRect rect;
int offset = 0;
// Make sure that the item is visible
if (!EnsureVisible(nItem, TRUE)) return NULL;
GetSubItemRect(nItem, nCol, LVIR_BOUNDS, rect);
// Now scroll if we need to expose the column
CRect rcClient;
GetClientRect(rcClient);
if (offset + rect.left < 0 || offset + rect.left > rcClient.right)
{
CSize size;
size.cx = offset + rect.left;
size.cy = 0;
Scroll(size);
rect.left -= size.cx;
}
rect.left += offset;
rect.right = rect.left + GetColumnWidth(nCol);
if (rect.right > rcClient.right)
rect.right = rcClient.right;
//basic code end
rect.bottom += 10 * rect.Height();//dropdown area
DWORD dwStyle = WS_CHILD
| WS_VISIBLE
| WS_VSCROLL
//| WS_HSCROLL
| CBS_DROPDOWNLIST
| CBS_NOINTEGRALHEIGHT
| CBS_DISABLENOSCROLL;
CComboBox *pList = new CComboInListView(nItem, nCol, lstItems);
pList->Create(dwStyle, rect, this, IDC_COMBOBOXINLISTVIEW);
pList->ModifyStyleEx(0, WS_EX_CLIENTEDGE);//can we tell at all
pList->SetHorizontalExtent(CalcHorzExtent(pList, lstItems));
pList->SelectString(0, strFind);
pList->ShowDropDown();
m_iOldIdx = pList->GetCurSel();
// The returned pointer should not be saved
return pList;
}
int WDictGridList::CalcHorzExtent(CWnd * pWnd, CStringList * pList)
{
int nExtent = 0;
if (pWnd != NULL)
{
CDC* pDC = pWnd->GetDC();
HFONT hFont = (HFONT)pWnd->SendMessage(WM_GETFONT); //why not pWnd->GetFont();..I like the send thing alot and
CFont *pFont = CFont::FromHandle(hFont); //this way I get to use this function..cool :)
if (pFont != NULL) //ya what ever makes me happy,.right :}
{
CFont* pOldFont = pDC->SelectObject(pFont);
CSize newExtent;
POSITION pos = pList->GetHeadPosition();
while (pos != NULL)
{
CString str(pList->GetNext(pos));
newExtent = pDC->GetTextExtent(str);
newExtent.cx += 6;
if (newExtent.cx > nExtent)
{
nExtent = newExtent.cx;
}
}
pDC->SelectObject(pOldFont);
}
pWnd->ReleaseDC(pDC);
}
return nExtent;
}
int WDictGridList::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CSuperGridCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_image.Create(IDB_DIM_CONFIG_IMG, 16, 1, RGB(0, 255, 255)))
return -1;
SetImageList(&m_image, LVSIL_SMALL);
CImageList *pImageList = GetImageList(LVSIL_SMALL);
if (pImageList)
ImageList_GetIconSize(pImageList->m_hImageList, &m_cxImage, &m_cyImage);
else
return -1;
double dScale(CoreTools::GetDPIScale());
m_cxImage = static_cast<int>(m_cxImage * dScale);
m_cyImage = static_cast<int>(m_cyImage * dScale);
return 0;
}
int WDictGridList::FindItemByName(LPCTSTR pszName)
{
LVFINDINFO info;
info.flags = LVFI_PARTIAL | LVFI_STRING;
info.psz = pszName;
return FindItem(&info);
}
void WDictGridList::saveToWDict(WDict &dict)
{
int count = GetItemCount();
CString str0, str1, str2;
dict.m_sName = _T("系统参数配置");
dict.m_sDesc = _T("1");
for (int i = 0; i < count; ++i)
{
CTreeItem *pTree = GetTreeItem(i);
if (!GetParentItem(pTree))
treeItemToWDict(pTree, &dict);
}
}
void WDictGridList::treeItemToWDict(CTreeItem *pTree, WDict *pDict)
{
CItemInfo *pInfo = GetData(pTree);
switch (pInfo->getDataType())
{
case CItemInfo::WDict:
{
WDict *pNewDict = new WDict();
pNewDict->m_sName = pInfo->GetItemText();
pNewDict->m_sDesc = pInfo->GetSubItem(1);
POSITION pos = GetHeadPosition(pTree);
while (pos)
{
CTreeItem *pSub = GetNextChild(pTree, pos);
treeItemToWDict(pSub, pNewDict);
}
pDict->AddTail(pNewDict);
}
break;
case CItemInfo::WBool:
{
WBoolItem *p = new WBoolItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
p->m_data = pInfo->GetSubItem(0) == _T("是") ? TRUE : FALSE;
pDict->AddTail(p);
}
break;
case CItemInfo::WChar:
{
WCharItem *p = new WCharItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
p->m_data = pInfo->GetSubItem(0).GetAt(0);
pDict->AddTail(p);
}
break;
case CItemInfo::WLong:
{
WLongItem *p = new WLongItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
p->m_data = _ttoi(pInfo->GetSubItem(0));
pDict->AddTail(p);
}
break;
case CItemInfo::WDouble:
{
WDoubleItem *p = new WDoubleItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
p->m_data = _wtof(pInfo->GetSubItem(0));
pDict->AddTail(p);
}
break;
case CItemInfo::WCString:
{
WCStringItem *p = new WCStringItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
p->m_data = pInfo->GetSubItem(0);
pDict->AddTail(p);
}
break;
case CItemInfo::WCombo:
{
WSelectItem *p = new WSelectItem();
p->m_sName = pInfo->GetItemText();
p->m_sDesc = pInfo->GetSubItem(1);
CString s = pInfo->GetSubItem(0);
CStringList *pList(NULL);
pInfo->GetListData(0, pList);
if (pList)
{
POSITION pos = pList->GetHeadPosition();
int idx(0), _idx(0);
CString ss(_T(""));
while (pos)
{
ss = pList->GetNext(pos);
if (ss == s) idx = _idx;
p->AddTail(ss);
_idx++;
}
p->m_data = idx;
}
pDict->AddTail(p);
}
break;
default:
break;
}
}
void WDictGridList::modifyPsCombo(const int &iTitleItem, const int &curIdx)
{
CString str = GetItemText(iTitleItem, 0);
if (str != _T("标注单位")) return;
if (m_iOldIdx == curIdx) return;
int idxPs = FindItemByName(_T("模型空间默认当前比例"));
if (idxPs == -1) return;
CString strPs = GetItemText(idxPs, 1);
double dPscale(_wtof(strPs));
if (m_iOldIdx == 0 && curIdx == 1) // mm -> M
dPscale /= 1000.0;
else if (m_iOldIdx == 1 && curIdx == 0) // M -> mm
dPscale *= 1000.0;
str.Format(_T("%.2f"), dPscale);
CTreeItem *pTree = GetTreeItem(idxPs);
if (pTree != NULL)
{
CItemInfo *pInfo = GetData(pTree);
if (pInfo)
{
pInfo->SetSubItemText(0, str);
//UpdateData(pTree, pInfo);
}
SetItemText(idxPs, 1, str);
}
m_iOldIdx = curIdx;
}
BOOL WDictGridList::OnDeleteItem(CTreeItem* pItem, int nIndex)
{
return 1;
}
BOOL WDictGridList::OnItemExpanding(CTreeItem *pItem, int iItem)
{
return 1;
}
BOOL WDictGridList::OnItemExpanded(CTreeItem* pItem, int iItem)
{
return 1;
}
BOOL WDictGridList::OnCollapsing(CTreeItem *pItem)
{
return 1;
}
BOOL WDictGridList::OnItemCollapsed(CTreeItem *pItem)
{
return 1;
}
#pragma endregion