3065 lines
78 KiB
C++
3065 lines
78 KiB
C++
#include "StdAfx.h"
|
|
#include "Resource.h"
|
|
#include "AfxPriv.h"
|
|
#include "DlgParamDefine.h"
|
|
#include "DlgParamInsert.h"
|
|
#include "DlgParamImport.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define SEP_SIZE 3
|
|
#define TBAR_SIZE 25
|
|
|
|
#define BEGIN_ACTIVE_ACAD_IN_DIALOG() \
|
|
CWnd* pFrame = acedGetAcadFrame(); \
|
|
pFrame->EnableWindow(TRUE); \
|
|
ShowWindow(SW_HIDE); \
|
|
pFrame->SetFocus() \
|
|
|
|
#define END_ACTIVE_ACAD_IN_DIALOG() \
|
|
pFrame->EnableWindow(FALSE); \
|
|
ShowWindow(SW_SHOW); \
|
|
EnableWindow(TRUE); \
|
|
if (acedIsInputPending()) \
|
|
EndDialog(IDCANCEL) \
|
|
|
|
|
|
namespace
|
|
{
|
|
BOOL GetArcParam(const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, double dBulge, const AcGeVector3d& vtNormal,
|
|
AcGePoint3d& ptCenter, double& dRadius, double& dStartAngle, double& dEndAngle)
|
|
{
|
|
ASSERT(!_IsZero_(dBulge));
|
|
ASSERT(ptStart != ptEnd);
|
|
|
|
// 调整顺序
|
|
const AcGePoint3d* pt1;
|
|
const AcGePoint3d* pt2;
|
|
if (dBulge < 0.0)
|
|
{
|
|
pt1 = &ptEnd;
|
|
pt2 = &ptStart;
|
|
dBulge = -dBulge;
|
|
}
|
|
else
|
|
{
|
|
pt1 = &ptStart;
|
|
pt2 = &ptEnd;
|
|
}
|
|
|
|
// 直角三角形对边与斜边关系R = L/sin(A/2)
|
|
// 代入万能公式 sin(A)=2*tg(A/2)/(1+tg(A/2)*tg(A/2))
|
|
// 得到 R = L*(1+B*B) / (2B) -->L:(p1->p2)/2 B:bulge
|
|
double dL = pt1->distanceTo(*pt2) / 2.0;
|
|
dRadius = dL * (1 + dBulge * dBulge) / (2.0 * dBulge);
|
|
|
|
double dA = PI / 2.0 - atan(dBulge) * 2.0;
|
|
AcGeVector3d vt(*pt2 - *pt1);
|
|
vt.rotateBy(dA, vtNormal);
|
|
vt.normalize();
|
|
ptCenter = *pt1 + vt * dRadius;
|
|
|
|
acdbWcs2Ecs(asDblArray(AcGeVector3d::kXAxis), asDblArray(vt), asDblArray(vtNormal), true);
|
|
dStartAngle = vt.angleTo(*pt1 - ptCenter, vtNormal);
|
|
dEndAngle = vt.angleTo(*pt2 - ptCenter, vtNormal);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
CDlgParamDefine::CDlgParamDefine(CWnd* pParent)
|
|
: CDialog(CDlgParamDefine::IDD, pParent), m_bPartModified(FALSE),
|
|
m_bMouseDown(FALSE), m_iCurSep(-1), m_bEscape(FALSE),
|
|
m_hCopyClass(NULL)
|
|
{
|
|
//{{AFX_DATA_INIT(CDlgParamDefine)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CDlgParamDefine::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDlgParamDefine)
|
|
DDX_Control(pDX, IDC_TREE_CLASS, m_wndTreeClass);
|
|
DDX_Control(pDX, IDC_STC_PREVIEW, m_wndStcPreview);
|
|
DDX_Control(pDX, IDC_LST_ATTRIBUTE, m_wndLstAttribute);
|
|
DDX_Control(pDX, IDC_LST_RULE, m_wndLstRule);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CDlgParamDefine, CDialog)
|
|
//{{AFX_MSG_MAP(CDlgParamDefine)
|
|
ON_WM_SIZE()
|
|
ON_WM_SIZING()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_CAPTURECHANGED()
|
|
ON_WM_SETCURSOR()
|
|
ON_COMMAND(ID_CLASS_NEW, OnClassNew)
|
|
ON_COMMAND(ID_CLASS_DELETE, OnClassDelete)
|
|
ON_COMMAND(ID_CLASS_RENAME, OnClassRename)
|
|
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE_CLASS, OnBeginLabelEditTreeClass)
|
|
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_CLASS, OnEndLabelEditTreeClass)
|
|
ON_COMMAND(ID_ATTR_NEW, OnAttrNew)
|
|
ON_COMMAND(ID_ATTR_DELETE, OnAttrDelete)
|
|
ON_COMMAND(ID_ATTR_RENAME, OnAttrRename)
|
|
ON_COMMAND(ID_RULE_NEW, OnRuleNew)
|
|
ON_COMMAND(ID_RULE_SELECT, OnRuleSelect)
|
|
ON_COMMAND(ID_RULE_DELETE, OnRuleDelete)
|
|
ON_NOTIFY(TVN_SELCHANGING, IDC_TREE_CLASS, OnSelchangingTreeClass)
|
|
ON_WM_DESTROY()
|
|
ON_COMMAND(ID_ATTR_UP, OnAttrUp)
|
|
ON_COMMAND(ID_ATTR_DOWN, OnAttrDown)
|
|
ON_COMMAND(ID_RULE_UP, OnRuleUp)
|
|
ON_COMMAND(ID_RULE_DOWN, OnRuleDown)
|
|
ON_COMMAND(ID_CLASS_SAVE, OnClassSave)
|
|
ON_COMMAND(ID_CLASS_TEST, OnClassTest)
|
|
ON_COMMAND(ID_CLASS_COPY, OnClassCopy)
|
|
ON_COMMAND(ID_ATTR_PASTE, OnAttrPaste)
|
|
ON_COMMAND(ID_RULE_PASTE, OnRulePaste)
|
|
ON_COMMAND(ID_CLASS_IMPORT, OnClassImport)
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(WM_USER_CHILDVALUECHANGED, OnPropListBoxNotify)
|
|
ON_MESSAGE(WM_POPMESSAGESTRING, OnSetMessageString)
|
|
ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
|
|
ON_WM_MENUSELECT()
|
|
ON_WM_EXITMENULOOP()
|
|
END_MESSAGE_MAP()
|
|
|
|
LRESULT CDlgParamDefine::OnSetMessageString(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// set the message bar text
|
|
CString sMsgText;
|
|
if (lParam != 0)
|
|
{
|
|
ASSERT(wParam == 0); // can't have both an ID and a string
|
|
sMsgText = (LPCTSTR)lParam; // set an explicit string
|
|
}
|
|
else if (wParam != 0)
|
|
{
|
|
if (wParam == AFX_IDS_IDLEMESSAGE || wParam == AFX_IDS_HELPMODEMESSAGE)
|
|
{
|
|
acedRestoreStatusBar();
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
sMsgText.LoadString(wParam);
|
|
int iFind = sMsgText.Find(_T('\n'));
|
|
if (iFind > 0)
|
|
sMsgText = sMsgText.Left(iFind);
|
|
}
|
|
}
|
|
|
|
acedGetAcadFrame()->SetMessageText(sMsgText);
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CDlgParamDefine::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
|
|
{
|
|
// need to handle both ANSI and UNICODE versions of the message
|
|
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
|
|
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
|
|
|
|
UINT nID = pNMHDR->idFrom;
|
|
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
|
|
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
|
|
{
|
|
// idFrom is actually the HWND of the tool
|
|
nID = ::GetDlgCtrlID((HWND)nID);
|
|
}
|
|
|
|
// will be zero on a separator
|
|
if (nID != 0)
|
|
{
|
|
CString sTipText;
|
|
sTipText.LoadString(nID);
|
|
int iFind = sTipText.Find(_T('\n'))+1;
|
|
if (iFind > 0)
|
|
sTipText = sTipText.Mid(iFind);
|
|
|
|
if (sTipText.IsEmpty())
|
|
return FALSE;
|
|
|
|
if (pNMHDR->code == TTN_NEEDTEXTA)
|
|
{
|
|
#ifdef UNICODE
|
|
_wcstombsz(pTTTA->szText, sTipText, sizeof(pTTTA->szText) / sizeof(pTTTA->szText[0]));
|
|
#else
|
|
strncpy(pTTTA->szText, sTipText, sizeof(pTTTA->szText) / sizeof(TCHAR));
|
|
#endif // UNICODE
|
|
}
|
|
else
|
|
{
|
|
#ifdef UNICODE
|
|
_tcsncpy(pTTTW->szText, sTipText, sizeof(pTTTW->szText) / sizeof(TCHAR));
|
|
#else
|
|
_mbstowcsz(pTTTW->szText, sTipText, sizeof(pTTTW->szText) / sizeof(pTTTW->szText[0]));
|
|
#endif // UNICODE
|
|
}
|
|
|
|
*pResult = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
|
|
{
|
|
CDialog::OnMenuSelect(nItemID, nFlags, hSysMenu);
|
|
|
|
if (nItemID > 0 && nItemID < 0xFFFF
|
|
&& (nFlags & MF_POPUP) != MF_POPUP
|
|
&& (nFlags & MF_SEPARATOR) != MF_SEPARATOR)
|
|
{
|
|
CString sText;
|
|
sText.LoadString(nItemID);
|
|
int iFind = sText.Find('\n');
|
|
if (iFind > 0)
|
|
sText = sText.Left(iFind);
|
|
acedGetAcadFrame()->SetMessageText(sText);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnExitMenuLoop(BOOL bIsTrackPopupMenu)
|
|
{
|
|
CDialog::OnExitMenuLoop(bIsTrackPopupMenu);
|
|
|
|
acedRestoreStatusBar();
|
|
}
|
|
|
|
BOOL CDlgParamDefine::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || (m_bEscape = (pMsg->wParam == VK_ESCAPE))))
|
|
{
|
|
CEdit* pEdit = m_wndTreeClass.GetEditControl();
|
|
if (NULL != pEdit)
|
|
{
|
|
pEdit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// m_wndTBarClass.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
|
|
// m_wndTBarAttr.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
|
|
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
BOOL CDlgParamDefine::Create(CWnd* pParentWnd)
|
|
{
|
|
return CDialog::Create(IDD, pParentWnd);
|
|
}
|
|
|
|
BOOL CDlgParamDefine::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
if (m_wndTBarClass.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
|
|
&& m_wndTBarClass.LoadToolBar(IDR_CLASS))
|
|
{
|
|
CRect rc;
|
|
m_wndTreeClass.GetWindowRect(&rc);
|
|
ScreenToClient(&rc);
|
|
CSize szBar = m_wndTBarClass.CalcFixedLayout(FALSE, TRUE);
|
|
rc.bottom = rc.top;
|
|
rc.top -= TBAR_SIZE;
|
|
rc.right = rc.left + szBar.cx;
|
|
m_wndTBarClass.MoveWindow(&rc);
|
|
}
|
|
|
|
if (m_wndTBarAttr.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
|
|
&& m_wndTBarAttr.LoadToolBar(IDR_ATTRIBUTE))
|
|
{
|
|
CRect rc;
|
|
m_wndLstAttribute.GetWindowRect(&rc);
|
|
ScreenToClient(&rc);
|
|
CSize szBar = m_wndTBarAttr.CalcFixedLayout(FALSE, TRUE);
|
|
rc.bottom = rc.top;
|
|
rc.top -= TBAR_SIZE;
|
|
rc.right = rc.left + szBar.cx;
|
|
m_wndTBarAttr.MoveWindow(&rc);
|
|
}
|
|
|
|
m_imglstIcon.Create(IDB_ICON, 16, 1, RGB(255, 0, 255));
|
|
m_wndTreeClass.SetImageList(&m_imglstIcon, TVSIL_NORMAL);
|
|
|
|
m_wndLstAttribute.SetNameWidth(100);
|
|
m_wndLstRule.SetNameWidth(100);
|
|
|
|
CRect rc;
|
|
GetClientRect(&rc);
|
|
m_szMin = rc.Size();
|
|
OnRelayout();
|
|
|
|
CString sRoot;
|
|
sRoot.LoadString(IDS_CLASSROOTNAME);
|
|
HTREEITEM hRoot = m_wndTreeClass.InsertItem(sRoot, 1, 1);
|
|
ASSERT(NULL != hRoot);
|
|
m_wndTreeClass.SetItemData(hRoot, 0);
|
|
OnInitClassTree(0, hRoot);
|
|
m_wndTreeClass.Expand(hRoot, TVE_EXPAND);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnSizing(UINT fwSide, LPRECT pRect)
|
|
{
|
|
switch (fwSide)
|
|
{
|
|
case WMSZ_LEFT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->left = pRect->right - m_szMin.cx;
|
|
break;
|
|
|
|
case WMSZ_RIGHT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->right = pRect->left + m_szMin.cx;
|
|
break;
|
|
|
|
case WMSZ_TOP:
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->top = pRect->bottom - m_szMin.cy;
|
|
break;
|
|
|
|
case WMSZ_BOTTOM:
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->bottom = pRect->top + m_szMin.cy;
|
|
break;
|
|
|
|
case WMSZ_TOPLEFT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->left = pRect->right - m_szMin.cx;
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->top = pRect->bottom - m_szMin.cy;
|
|
break;
|
|
|
|
case WMSZ_TOPRIGHT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->right = pRect->left + m_szMin.cx;
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->top = pRect->bottom - m_szMin.cy;
|
|
break;
|
|
|
|
case WMSZ_BOTTOMLEFT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->left = pRect->right - m_szMin.cx;
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->bottom = pRect->top + m_szMin.cy;
|
|
break;
|
|
|
|
case WMSZ_BOTTOMRIGHT:
|
|
if (pRect->right - pRect->left < m_szMin.cx)
|
|
pRect->right = pRect->left + m_szMin.cx;
|
|
if (pRect->bottom - pRect->top < m_szMin.cy)
|
|
pRect->bottom = pRect->top + m_szMin.cy;
|
|
}
|
|
|
|
CDialog::OnSizing(fwSide, pRect);
|
|
}
|
|
|
|
void CDlgParamDefine::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
|
|
OnRelayout();
|
|
}
|
|
|
|
void CDlgParamDefine::OnRelayout()
|
|
{
|
|
// 取得客户区
|
|
CRect rcClient;
|
|
GetClientRect(&rcClient);
|
|
rcClient.DeflateRect(10, 5 + TBAR_SIZE, 10, 10);
|
|
|
|
// 移动预案览窗口到客户区底端
|
|
CRect rc1;
|
|
m_wndStcPreview.GetWindowRect(&rc1);
|
|
ScreenToClient(&rc1);
|
|
rc1.OffsetRect(rcClient.left - rc1.left, rcClient.bottom - rc1.bottom);
|
|
m_wndStcPreview.MoveWindow(&rc1);
|
|
|
|
// 调整分类树窗口到的底边
|
|
rc1.bottom = rc1.top - SEP_SIZE;
|
|
rc1.top = rcClient.top;
|
|
m_wndTreeClass.MoveWindow(&rc1);
|
|
|
|
// 调整属性窗口的宽度到客户区右边
|
|
CRect rc2;
|
|
m_wndLstAttribute.GetWindowRect(&rc2);
|
|
ScreenToClient(&rc2);
|
|
rc2.OffsetRect(rcClient.right - rc2.right, rcClient.top - rc2.top);
|
|
rc2.left = rc1.right + SEP_SIZE;
|
|
m_wndLstAttribute.MoveWindow(&rc2);
|
|
|
|
// 调整工具条位置
|
|
m_wndTBarAttr.SetWindowPos(NULL, rc2.left, rc2.top - TBAR_SIZE, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
|
|
|
// 调整图形定义窗口尺寸到客户区右下角
|
|
rc2.top = rc2.bottom + SEP_SIZE;
|
|
rc2.bottom = rcClient.bottom;
|
|
m_wndLstRule.MoveWindow(&rc2);
|
|
}
|
|
|
|
void CDlgParamDefine::GetSepRect(CRect* pRecSep)
|
|
{
|
|
ASSERT(pRecSep != NULL);
|
|
|
|
// 取得客户区
|
|
CRect rcClient;
|
|
GetClientRect(&rcClient);
|
|
rcClient.DeflateRect(10, 5 + TBAR_SIZE, 10, 10);
|
|
|
|
CRect rc;
|
|
m_wndTreeClass.GetWindowRect(&rc);
|
|
ScreenToClient(&rc);
|
|
pRecSep[0].SetRect(rc.left, rc.bottom, rc.right, rc.bottom + SEP_SIZE);
|
|
|
|
pRecSep[1].SetRect(rc.right, rcClient.top, rc.right + SEP_SIZE, rcClient.bottom);
|
|
|
|
m_wndLstAttribute.GetWindowRect(&rc);
|
|
ScreenToClient(&rc);
|
|
pRecSep[2].SetRect(rc.left, rc.bottom, rc.right, rc.bottom + SEP_SIZE);
|
|
}
|
|
|
|
void CDlgParamDefine::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
CRect pRect[3];
|
|
GetSepRect(pRect);
|
|
|
|
m_iCurSep = 3;
|
|
while ((--m_iCurSep) >= 0)
|
|
{
|
|
if (pRect[m_iCurSep].PtInRect(point))
|
|
{
|
|
SetCapture();
|
|
m_bMouseDown = TRUE;
|
|
m_ptLast = point;
|
|
break;
|
|
}
|
|
}
|
|
|
|
CDialog::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void CDlgParamDefine::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_bMouseDown)
|
|
{
|
|
m_bMouseDown = FALSE;
|
|
ReleaseCapture();
|
|
}
|
|
|
|
CDialog::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
void CDlgParamDefine::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_bMouseDown)
|
|
{
|
|
CRect rc1, rc2, rc3, rc4;
|
|
m_wndTBarClass.GetWindowRect(&rc1);
|
|
m_wndTBarAttr.GetWindowRect(&rc2);
|
|
int iTBarClass = rc1.Width();
|
|
int iTBarAttr = rc2.Width();
|
|
|
|
m_wndTreeClass.GetWindowRect(&rc1);
|
|
ScreenToClient(&rc1);
|
|
m_wndStcPreview.GetWindowRect(&rc2);
|
|
ScreenToClient(&rc2);
|
|
m_wndLstAttribute.GetWindowRect(&rc3);
|
|
ScreenToClient(&rc3);
|
|
m_wndLstRule.GetWindowRect(&rc4);
|
|
ScreenToClient(&rc4);
|
|
|
|
switch (m_iCurSep)
|
|
{
|
|
case 0:
|
|
rc1.bottom += (point.y - m_ptLast.y);
|
|
rc2.top = rc1.bottom + SEP_SIZE;
|
|
if (rc1.Height() >= SEP_SIZE && rc2.Height() >= SEP_SIZE
|
|
&& point.x > rc1.left && point.x < rc1.right
|
|
&& point.y > rc1.bottom && point.y < rc2.top)
|
|
{
|
|
m_wndTreeClass.MoveWindow(&rc1);
|
|
m_wndStcPreview.MoveWindow(&rc2);
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
rc1.right += (point.x - m_ptLast.x);
|
|
rc2.right = rc1.right;
|
|
rc3.left = rc1.right + SEP_SIZE;
|
|
rc4.left = rc3.left;
|
|
if (rc1.Width() >= iTBarClass && rc3.Width() >= iTBarAttr
|
|
&& point.x > rc1.right && point.x < rc3.left
|
|
&& point.y > rc1.top && point.y < rc2.bottom)
|
|
{
|
|
m_wndTreeClass.MoveWindow(&rc1);
|
|
m_wndStcPreview.MoveWindow(&rc2);
|
|
m_wndLstAttribute.MoveWindow(&rc3);
|
|
m_wndLstRule.MoveWindow(&rc4);
|
|
|
|
// 调整工具条位置
|
|
m_wndTBarAttr.SetWindowPos(NULL, rc3.left, rc3.top - TBAR_SIZE, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
rc3.bottom += (point.y - m_ptLast.y);
|
|
rc4.top = rc3.bottom + SEP_SIZE;
|
|
if (rc3.Height() >= SEP_SIZE && rc4.Height() >= SEP_SIZE
|
|
&& point.x > rc3.left && point.x < rc3.right
|
|
&& point.y > rc3.bottom && point.y < rc4.top)
|
|
{
|
|
m_wndLstAttribute.MoveWindow(&rc3);
|
|
m_wndLstRule.MoveWindow(&rc4);
|
|
}
|
|
break;
|
|
}
|
|
|
|
m_ptLast = point;
|
|
}
|
|
|
|
CDialog::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void CDlgParamDefine::OnCaptureChanged(CWnd *pWnd)
|
|
{
|
|
if (m_bMouseDown)
|
|
{
|
|
m_bMouseDown = FALSE;
|
|
ReleaseCapture();
|
|
}
|
|
|
|
CDialog::OnCaptureChanged(pWnd);
|
|
}
|
|
|
|
BOOL CDlgParamDefine::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
if (m_bMouseDown)
|
|
{
|
|
SetCursor(::LoadCursor(NULL, (m_iCurSep == 1 ? IDC_SIZEWE : IDC_SIZENS)));
|
|
return TRUE;
|
|
}
|
|
|
|
// 取得分隔区间
|
|
CRect pRect[3];
|
|
GetSepRect(pRect);
|
|
|
|
// 取得当前鼠标位置
|
|
CPoint pt;
|
|
GetCursorPos(&pt);
|
|
ScreenToClient(&pt);
|
|
|
|
if (pRect[0].PtInRect(pt) || pRect[2].PtInRect(pt))
|
|
{
|
|
SetCursor(::LoadCursor(NULL, IDC_SIZENS));
|
|
return TRUE;
|
|
}
|
|
|
|
if (pRect[1].PtInRect(pt))
|
|
{
|
|
SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
|
|
return TRUE;
|
|
}
|
|
|
|
return CDialog::OnSetCursor(pWnd, nHitTest, message);
|
|
}
|
|
|
|
void CDlgParamDefine::OnBeginLabelEditTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
|
|
|
HTREEITEM hItem = pTVDispInfo->item.hItem;
|
|
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem)
|
|
|| m_cCurClass.IsReadOnly())
|
|
{
|
|
*pResult = 1;
|
|
}
|
|
else
|
|
{
|
|
*pResult = 0;
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnEndLabelEditTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
|
|
|
if (!m_bEscape)
|
|
{
|
|
m_bEscape = FALSE;
|
|
|
|
CString sText;
|
|
CEdit* pEdit = m_wndTreeClass.GetEditControl();
|
|
ASSERT(NULL != pEdit);
|
|
pEdit->GetWindowText(sText);
|
|
|
|
HTREEITEM hItem = pTVDispInfo->item.hItem;
|
|
if (sText == m_wndTreeClass.GetItemText(hItem))
|
|
{
|
|
*pResult = 0;
|
|
return;
|
|
}
|
|
|
|
BOOL bFind = FALSE;
|
|
while (!bFind && NULL != (hItem = m_wndTreeClass.GetPrevSiblingItem(hItem)))
|
|
{
|
|
bFind = (sText.CompareNoCase(m_wndTreeClass.GetItemText(hItem)) == 0);
|
|
}
|
|
hItem = pTVDispInfo->item.hItem;
|
|
while (!bFind && NULL != (hItem = m_wndTreeClass.GetNextSiblingItem(hItem)))
|
|
{
|
|
bFind = (sText.CompareNoCase(m_wndTreeClass.GetItemText(hItem)) == 0);
|
|
}
|
|
|
|
if (bFind)
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_HASSAMENAME);
|
|
MessageBox(sMsg);
|
|
|
|
m_wndTreeClass.EditLabel(pTVDispInfo->item.hItem);
|
|
|
|
*pResult = 0;
|
|
}
|
|
else
|
|
{
|
|
int iIndex = -1;
|
|
CPropertyItemTab* pTab = NULL;
|
|
m_wndLstAttribute.FindTab(pTab, 0);
|
|
ASSERT(NULL != pTab);
|
|
KTParamTableAttr* pAttr;
|
|
if (NULL != (pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
|
|
{
|
|
iIndex = 0;
|
|
pTab->m_sName = sText;
|
|
}
|
|
else if (NULL != (pAttr = (KTParamTableAttr*)pTab->m_dwUserData) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
|
|
{
|
|
iIndex = 0;
|
|
pTab->m_sValue = sText;
|
|
}
|
|
else
|
|
{
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
if (NULL != (pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
|
|
{
|
|
iIndex = m_wndLstAttribute.FindIndex(pItem);
|
|
pItem->m_sName = sText;
|
|
break;
|
|
}
|
|
if (NULL != (pAttr = (KTParamTableAttr*)pItem->m_dwUserData) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
|
|
{
|
|
iIndex = m_wndLstAttribute.FindIndex(pItem);
|
|
pItem->m_sValue = sText;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (iIndex >= 0)
|
|
{
|
|
CRect rc;
|
|
m_wndLstAttribute.GetItemRect(iIndex, &rc);
|
|
m_wndLstAttribute.InvalidateRect(rc);
|
|
}
|
|
|
|
m_bPartModified |= TRUE;
|
|
|
|
*pResult = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*pResult = 0;
|
|
}
|
|
}
|
|
|
|
LRESULT CDlgParamDefine::OnPropListBoxNotify(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// 取得数据参数
|
|
UINT nType = LOWORD(wParam);
|
|
UINT nCode = LOBYTE(HIWORD(wParam));
|
|
BOOL bEditName = HIBYTE(HIWORD(wParam));
|
|
HWND hPropListBox = (HWND)lParam;
|
|
|
|
m_bPartModified |= (0 == nType && 0 == nCode || 1 == nType);
|
|
|
|
if (0 == nType)
|
|
{
|
|
if (m_wndLstAttribute.m_hWnd == hPropListBox && nCode == 1)
|
|
{
|
|
CPropertyItem* pItem = NULL;
|
|
CPropertyItemTab* pCurTab = NULL;
|
|
m_wndLstAttribute.GetCurSel(pCurTab, pItem);
|
|
|
|
// 类别数据Code项不能重名
|
|
if (NULL != pItem && NULL != pItem->m_dwUserData)
|
|
{
|
|
KTParamTableAttr* pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
|
|
if (_tcsicmp(pAttr->GetField(), _T("Code")) == 0)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
if (pService->HasSameClassCode(pItem->m_sValue, m_cCurClass.GetId()))
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_HASSAMENAME);
|
|
MessageBox(sMsg);
|
|
pItem->m_sValue = m_cCurClass.GetCode();
|
|
m_wndLstAttribute.UpdateCtrl();
|
|
}
|
|
m_cCurClass.SetCode(pItem->m_sValue);
|
|
}
|
|
}
|
|
|
|
// 属性数据Code项不能重名
|
|
if (NULL != pCurTab && NULL == pItem && bEditName)
|
|
{
|
|
KTParamAttribute* pData = (KTParamAttribute*)pCurTab->m_dwUserParam;
|
|
ASSERT(NULL != pData);
|
|
|
|
CPropertyItemTab* pTab;
|
|
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
|
|
while (NULL != pos)
|
|
{
|
|
pTab = m_wndLstAttribute.GetNextTab(pos);
|
|
if (pTab != pCurTab && pTab->m_sName.CompareNoCase(pCurTab->m_sName) == 0)
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_HASSAMENAME);
|
|
MessageBox(sMsg);
|
|
pCurTab->m_sName = pData->GetCode();
|
|
m_wndLstAttribute.EditName();
|
|
break;
|
|
}
|
|
}
|
|
pData->SetCode(pCurTab->m_sName);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// 处理约束中曲线和绘制选择变化
|
|
if (1 == nType)
|
|
{
|
|
if (m_wndLstRule.m_hWnd == hPropListBox)
|
|
{
|
|
// 取得当前条目
|
|
CPropertyItemTab* pTab = NULL;
|
|
CPropertyItem* pItem = NULL;
|
|
m_wndLstRule.GetCurSel(pTab, pItem);
|
|
if (NULL == pTab || NULL != pItem)
|
|
return 0;
|
|
|
|
if (bEditName)
|
|
{
|
|
// 曲线变化,删除绘制方式
|
|
pTab->m_sValue.Empty();
|
|
|
|
// 删除参数列表
|
|
m_wndLstRule.CollapseTab(pTab);
|
|
POSITION pos = pTab->m_listItem.GetTailPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetPrev(pos);
|
|
if (NULL != pItem && NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx)
|
|
m_wndLstRule.DeleteItem(pTab, pItem);
|
|
}
|
|
|
|
m_wndLstRule.UpdateCtrl();
|
|
SendMessage(WM_USER_CHILDVALUECHANGED, MAKEWPARAM(4, MAKEWORD(0, FALSE)), (LPARAM)hPropListBox);
|
|
|
|
// 刷新
|
|
CRect rc;
|
|
int iPos = m_wndLstRule.GetCurSel();
|
|
m_wndLstRule.GetItemRect(iPos, &rc);
|
|
rc.left += m_wndLstRule.GetNameWidth();
|
|
m_wndLstRule.InvalidateRect(rc);
|
|
}
|
|
else
|
|
{
|
|
// 删除参数列表
|
|
m_wndLstRule.CollapseTab(pTab);
|
|
POSITION pos = pTab->m_listItem.GetTailPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetPrev(pos);
|
|
if (NULL != pItem && NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx)
|
|
m_wndLstRule.DeleteItem(pTab, pItem);
|
|
}
|
|
|
|
// 绘制方式变化,更新参数列表
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
KTParamRule* pRule = (KTParamRule*)pTab->m_dwUserParam;
|
|
ASSERT(NULL != pRule);
|
|
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
ASSERT(NULL != pAttr1);
|
|
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
ASSERT(NULL != pAttr2);
|
|
|
|
// 取得属性条目的数据映射
|
|
CMapStringToString mapData;
|
|
pService->GetTableItemById(_T("GetRuleItemById"), pRule->GetId(), mapData);
|
|
// 更新
|
|
CString sValue;
|
|
mapData[pAttr1->GetField()] = ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapData);
|
|
mapData[pAttr2->GetField()] = ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapData);
|
|
|
|
// 获得参数映射
|
|
CMapStringToString mapParamToDesc;
|
|
AsDescTable(sValue, pAttr1->GetVarDesc(), mapData);
|
|
pService->GetCurveDrawTypeParam(sValue, mapData[pAttr1->GetField()], mapData[pAttr2->GetField()], mapParamToDesc);
|
|
|
|
// 添加参数
|
|
CString sKey;
|
|
pos = mapParamToDesc.GetStartPosition();
|
|
while (NULL != pos)
|
|
{
|
|
mapParamToDesc.GetNextAssoc(pos, sKey, sValue);
|
|
m_wndLstRule.AddItem(pTab, sValue, _T(""), CPropertyItem::EDT_NONE);
|
|
}
|
|
|
|
m_wndLstRule.ExpandTab(pTab);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// 处理选择项下拉列表
|
|
if (4 == nType)
|
|
{
|
|
CPropertyListBox* pPropListBox = DYNAMIC_DOWNCAST(CPropertyListBox, CWnd::FromHandle(hPropListBox));
|
|
if (NULL == pPropListBox)
|
|
return 0;
|
|
|
|
// 获得子控件
|
|
CComboBox* pSubCtrl = DYNAMIC_DOWNCAST(CComboBox, pPropListBox->GetSubCtrl());
|
|
if (NULL == pSubCtrl || !pSubCtrl->IsWindowVisible())
|
|
return 0;
|
|
|
|
// 取得当前条目
|
|
CPropertyItemTab* pTab = NULL;
|
|
CPropertyItem* pItem = NULL;
|
|
pPropListBox->GetCurSel(pTab, pItem);
|
|
if (NULL == pTab)
|
|
return 0;
|
|
|
|
// 取得附加数据
|
|
pItem = (NULL == pItem ? pTab : pItem);
|
|
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
KTParamTableAttr* pAttr = (KTParamTableAttr*)(bEditName ? pItem->m_dwUserDataEx : pItem->m_dwUserData);
|
|
if (NULL == pData || NULL == pAttr)
|
|
return 0;
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得属性条目的数据映射
|
|
CMapStringToString mapData;
|
|
if (m_wndLstAttribute.m_hWnd == hPropListBox)
|
|
pService->GetTableItemById(_T("GetAttributeItemById"), pData->GetId(), mapData);
|
|
else if (m_wndLstRule.m_hWnd == hPropListBox)
|
|
pService->GetTableItemById(_T("GetRuleItemById"), pData->GetId(), mapData);
|
|
|
|
// 更新控件上的数据
|
|
CString sValue;
|
|
CString sDesc1 = pTab->m_sName;
|
|
CString sDesc2 = pTab->m_sValue;
|
|
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
if (NULL != pAttr1 && NULL != pAttr2 && pAttr1->GetIndex() > pAttr2->GetIndex())
|
|
{
|
|
// 更换顺序, 按顺序更新
|
|
sDesc1 = pTab->m_sValue;
|
|
sDesc2 = pTab->m_sName;
|
|
pAttr1 = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
pAttr2 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
}
|
|
if (NULL != pAttr1)
|
|
mapData[pAttr1->GetField()] = ByItemDesc(sValue, sDesc1, pAttr1->GetVarDesc(), mapData);
|
|
if (NULL != pAttr2)
|
|
mapData[pAttr2->GetField()] = ByItemDesc(sValue, sDesc2, pAttr2->GetVarDesc(), mapData);
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
if (NULL == pItem)
|
|
continue;
|
|
|
|
sDesc1 = pItem->m_sName;
|
|
sDesc2 = pItem->m_sValue;
|
|
pAttr1 = (KTParamTableAttr*)pItem->m_dwUserDataEx;
|
|
pAttr2 = (KTParamTableAttr*)pItem->m_dwUserData;
|
|
if (NULL != pAttr1 && NULL != pAttr2 && pAttr1->GetIndex() > pAttr2->GetIndex())
|
|
{
|
|
sDesc1 = pItem->m_sValue;
|
|
sDesc2 = pItem->m_sName;
|
|
pAttr1 = (KTParamTableAttr*)pItem->m_dwUserData;
|
|
pAttr2 = (KTParamTableAttr*)pItem->m_dwUserDataEx;
|
|
}
|
|
if (NULL != pAttr1)
|
|
mapData[pAttr1->GetField()] = ByItemDesc(sValue, sDesc1, pAttr1->GetVarDesc(), mapData);
|
|
if (NULL != pAttr2)
|
|
mapData[pAttr2->GetField()] = ByItemDesc(sValue, sDesc2, pAttr2->GetVarDesc(), mapData);
|
|
}
|
|
|
|
// 扩展SQL
|
|
CString sSQL;
|
|
pService->ExpandSQL(pAttr->GetValue(), mapData, sSQL);
|
|
|
|
// 执行SQL
|
|
CStringArray arsItems;
|
|
pService->ExecuteSQL(sSQL, arsItems);
|
|
|
|
// 获取当前数据
|
|
int iCurSel = pSubCtrl->GetCurSel();
|
|
if (iCurSel >= 0) pSubCtrl->GetLBText(iCurSel, sValue);
|
|
else sValue.Empty();
|
|
|
|
int iSize = arsItems.GetSize();
|
|
if (iSize > 0)
|
|
{
|
|
// 添加到子控件列表中
|
|
pSubCtrl->ResetContent();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
AsItemDesc(arsItems[i], AsItemString(arsItems[i], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
pSubCtrl->AddString(arsItems[i]);
|
|
}
|
|
|
|
// 定位当前数据
|
|
if (!sValue.IsEmpty())
|
|
{
|
|
iCurSel = pSubCtrl->FindStringExact(-1, sValue);
|
|
if(iCurSel < 0) {iCurSel = 0; pSubCtrl->InsertString(0, sValue);}
|
|
pSubCtrl->SetCurSel(iCurSel);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CDlgParamDefine::OnSelchangingTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
|
|
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
|
|
if (NULL != hItem)
|
|
{
|
|
CWaitCursor waiter;
|
|
|
|
if (m_bPartModified)
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_DATANOTSAVED);
|
|
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
|
|
{
|
|
case IDYES:
|
|
// 代号不得为空
|
|
if (_tcslen(m_cCurClass.GetCode()) <= 0)
|
|
{
|
|
sMsg.LoadString(IDS_EMPTYCLASSCODE);
|
|
MessageBox(sMsg);
|
|
*pResult = TRUE;
|
|
return;
|
|
}
|
|
// 保存旧分类的数据
|
|
if (NULL != pNMTreeView->itemOld.hItem)
|
|
OnUpdateClassItemData(pNMTreeView->itemOld.hItem);
|
|
break;
|
|
case IDCANCEL:
|
|
*pResult = TRUE;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 清除旧分类的属性和约束列表数据
|
|
m_cCurClass = KTParamClass();
|
|
m_bPartModified = FALSE;
|
|
OnCleanAttributeList();
|
|
OnCleanRuleList();
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得当前分类数据
|
|
ULONG lId = m_wndTreeClass.GetItemData(hItem);
|
|
pService->GetClassItemById(lId, m_cCurClass);
|
|
//
|
|
BOOL bEdit = (!m_cCurClass.IsReadOnly());
|
|
|
|
// 显示分类数据属性条目
|
|
OnShowClassAttrItems(hItem, bEdit);
|
|
// 显示分类属性数据条目
|
|
OnShowClassData(hItem, bEdit);
|
|
// 显示分类约束数据条目
|
|
OnShowRuleData(hItem, bEdit);
|
|
|
|
m_wndLstAttribute.ExpandTab(0);
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassNew()
|
|
{
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem)
|
|
return;
|
|
|
|
// 创建新命名
|
|
CString sName, sText;
|
|
sName.LoadString(IDS_NEWCLASS);
|
|
sText = sName;
|
|
// 找到重名的
|
|
int iIndex = 0;
|
|
HTREEITEM hChild = m_wndTreeClass.GetChildItem(hItem);
|
|
while (NULL != hChild)
|
|
{
|
|
if (sName.CompareNoCase(m_wndTreeClass.GetItemText(hChild)) == 0)
|
|
{
|
|
iIndex++;
|
|
sName.Format(_T("%s%d"), sText, iIndex);
|
|
}
|
|
|
|
hChild = m_wndTreeClass.GetNextSiblingItem(hChild);
|
|
}
|
|
|
|
hChild = m_wndTreeClass.InsertItem(sName, hItem);
|
|
if (NULL == hChild)
|
|
return;
|
|
|
|
m_wndTreeClass.Expand(hItem, TVE_EXPAND);
|
|
|
|
m_wndTreeClass.SelectItem(hChild);
|
|
m_wndTreeClass.EditLabel(hChild);
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassDelete()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem)
|
|
return;
|
|
|
|
CString sMsg;
|
|
if (NULL != m_wndTreeClass.GetChildItem(hItem))
|
|
{
|
|
sMsg.LoadString(IDS_HASSUBCLASS);
|
|
MessageBox(sMsg);
|
|
return;
|
|
}
|
|
|
|
sMsg.LoadString(IDS_ISDELETECLASS);
|
|
if (IDYES != MessageBox(sMsg, NULL, MB_YESNO|MB_ICONQUESTION))
|
|
return;
|
|
|
|
ULONG lId = m_wndTreeClass.GetItemData(hItem);
|
|
if (0 != lId)
|
|
{
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
CStringArray arsItemIds;
|
|
pService->GetRuleItemIds(lId, arsItemIds);
|
|
for (int i = arsItemIds.GetSize() - 1; i >=0; i--)
|
|
{
|
|
pService->DeleteExpressData(_ttol(arsItemIds[i]));
|
|
}
|
|
pService->DeleteRuleData(lId);
|
|
pService->DeleteAttributeData(lId);
|
|
pService->DeleteClassData(lId);
|
|
}
|
|
|
|
m_bPartModified = FALSE;
|
|
m_wndTreeClass.DeleteItem(hItem);
|
|
|
|
if (m_hCopyClass == hItem)
|
|
m_hCopyClass = NULL;
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassRename()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem)
|
|
return;
|
|
|
|
m_wndTreeClass.EditLabel(hItem);
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassSave()
|
|
{
|
|
if (m_bPartModified)
|
|
{
|
|
// 代号不得为空
|
|
if (_tcslen(m_cCurClass.GetCode()) <= 0)
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_EMPTYCLASSCODE);
|
|
MessageBox(sMsg);
|
|
return;
|
|
}
|
|
// 保存分类的数据
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL != hItem)
|
|
OnUpdateClassItemData(hItem);
|
|
}
|
|
|
|
m_bPartModified = FALSE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassImport()
|
|
{
|
|
CDlgParamImport dlg(&m_wndTreeClass);
|
|
dlg.DoModal();
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassTest()
|
|
{
|
|
if (m_bPartModified)
|
|
{
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_DATANOTSAVED);
|
|
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
|
|
{
|
|
case IDYES:
|
|
// 代号不得为空
|
|
if (_tcslen(m_cCurClass.GetCode()) <= 0)
|
|
{
|
|
sMsg.LoadString(IDS_EMPTYCLASSCODE);
|
|
MessageBox(sMsg);
|
|
return;
|
|
}
|
|
// 保存分类的数据
|
|
if (NULL != hItem)
|
|
OnUpdateClassItemData(hItem);
|
|
m_bPartModified = FALSE;
|
|
break;
|
|
case IDCANCEL:
|
|
return;
|
|
}
|
|
}
|
|
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
|
|
CDlgParamInsert dlg;
|
|
dlg.SetClassCode(m_cCurClass.GetCode());
|
|
dlg.DoModal();
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrNew()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
|
|
return;
|
|
|
|
// 创建新命名
|
|
CString sName, sValue;
|
|
sName.LoadString(IDS_NEWATTRIBUTE);
|
|
sValue = sName;
|
|
// 找到重名的
|
|
int iIndex = 0, iPos = 0;
|
|
while (iPos = m_wndLstAttribute.FindTabIndex(sName, iPos) >= 0)
|
|
{
|
|
iIndex++;
|
|
sName.Format(_T("%s%d"), sValue, iIndex);
|
|
}
|
|
|
|
// 收起展开的条目
|
|
iIndex = m_wndLstAttribute.GetTabCount();
|
|
while ((--iIndex) >= 0)
|
|
m_wndLstAttribute.CollapseTab(iIndex);
|
|
|
|
// 创建属性数据
|
|
KTParamAttribute* pData = new KTParamAttribute;
|
|
if (NULL == pData)
|
|
return;
|
|
|
|
// 创建条目
|
|
CPropertyItemTab* pTab = m_wndLstAttribute.AddTab(sName, TRUE);
|
|
if (NULL == pTab)
|
|
{
|
|
delete pData;
|
|
return;
|
|
}
|
|
|
|
// 设置数据
|
|
pTab->m_dwUserParam = (DWORD_PTR)pData;
|
|
|
|
// 更新数据
|
|
pData->SetClassId(m_cCurClass.GetId());
|
|
pData->SetCode(sName);
|
|
sValue.LoadString(IDS_ATTRIBUTENAME);
|
|
pData->SetName(sValue);
|
|
|
|
OnShowAttributeAttrItems(pTab, 0, TRUE);
|
|
|
|
m_wndLstAttribute.SetCurSel(pTab, -1);
|
|
m_wndLstAttribute.EditName();
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrDelete()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
CPropertyItem* pItem = NULL;
|
|
m_wndLstAttribute.GetCurSel(pTab, pItem);
|
|
if (NULL == pTab || NULL != pItem)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_ISDELETEATTRIBUTE);
|
|
if (IDYES != MessageBox(sMsg, NULL, MB_YESNO | MB_ICONQUESTION))
|
|
return;
|
|
|
|
int iTab = m_wndLstAttribute.FindIndex(pTab);
|
|
ASSERT(iTab >= 0);
|
|
|
|
OnCleanAttrTab(pTab);
|
|
m_wndLstAttribute.DeleteTab(pTab);
|
|
|
|
if ((int)m_wndLstAttribute.GetTabCount() <= iTab)
|
|
iTab--;
|
|
m_wndLstAttribute.SetCurSel(iTab, -1);
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrRename()
|
|
{
|
|
CPropertyItemTab* pTab = NULL;
|
|
CPropertyItem* pItem = NULL;
|
|
m_wndLstAttribute.GetCurSel(pTab, pItem);
|
|
if (NULL == pTab || NULL != pItem)
|
|
return;
|
|
|
|
m_wndLstAttribute.EditName();
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrUp()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
int iTab, iIndex;
|
|
m_wndLstAttribute.GetCurSel(iTab, iIndex);
|
|
if (iTab < 1 || iIndex >= 0)
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
m_wndLstAttribute.FindTab(pTab, iTab - 1);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstAttribute.FindTab(pTab, iTab);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstAttribute.InsertTab(iTab - 1, *pTab);
|
|
m_wndLstAttribute.DeleteTab(pTab);
|
|
m_wndLstAttribute.SetCurSel(iTab - 1, -1);
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrDown()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
int iTab, iIndex;
|
|
m_wndLstAttribute.GetCurSel(iTab, iIndex);
|
|
if (iTab < 0 || iIndex >= 0)
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
m_wndLstAttribute.FindTab(pTab, iTab);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstAttribute.FindTab(pTab, iTab + 1);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstAttribute.InsertTab(iTab, *pTab);
|
|
m_wndLstAttribute.DeleteTab(pTab);
|
|
m_wndLstAttribute.SetCurSel(iTab + 1, -1);
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnRuleSelect()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
|
|
return;
|
|
|
|
// 进入AutoCAD命令操作模式
|
|
BEGIN_ACTIVE_ACAD_IN_DIALOG();
|
|
|
|
// 加载提示文本
|
|
CAcModuleResourceOverride theResource;
|
|
CString sPrompt;
|
|
sPrompt.LoadString(IDS_SELECTENTITY);
|
|
|
|
// 选择对象
|
|
ads_name ssSet;
|
|
struct resbuf rb = {NULL, 0, 0};
|
|
rb.resval.rstring = _tcsdup(_T("LINE,ARC,CIRCLE,ELLIPSE,TEXT,POINT,SOLID,LWPOLYLINE"));
|
|
int iRet = acedSSGet(_T(""), NULL, NULL, &rb, ssSet);
|
|
|
|
// 退出AutoCAD命令操作模式
|
|
END_ACTIVE_ACAD_IN_DIALOG();
|
|
|
|
// 选择不成功
|
|
if (RTNORM != iRet)
|
|
return;
|
|
|
|
// 收起展开的条目
|
|
int iIndex = m_wndLstRule.GetTabCount();
|
|
while ((--iIndex) >= 0)
|
|
m_wndLstRule.CollapseTab(iIndex);
|
|
|
|
KTParamRule* pData;
|
|
CPropertyItemTab* pTab;
|
|
|
|
CString sCurveType, sDrawType, sText;
|
|
CMapStringToString mapVarTypeToValue;
|
|
|
|
double dVal;
|
|
AcGeVector3d vtVal;
|
|
AcGePoint3d ptVal;
|
|
|
|
ads_name ent;
|
|
Adesk::Int32 lPos = 0;
|
|
acedSSLength(ssSet, &lPos);
|
|
while ((--lPos) >= 0)
|
|
{
|
|
acedSSName(ssSet, lPos, ent);
|
|
|
|
AcDbEntityPtr pEnt(ent, AcDb::kForRead);
|
|
if (NULL == pEnt)
|
|
continue;
|
|
|
|
if (pEnt->isKindOf(AcDbLine::desc()))
|
|
{
|
|
AcDbLine* pLine = (AcDbLine*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Line");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pLine->startPoint();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("StartPoint")] = sText;
|
|
|
|
ptVal = pLine->endPoint();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("EndPoint")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbArc::desc()))
|
|
{
|
|
AcDbArc* pArc = (AcDbArc*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Arc");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pArc->center();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Center")] = sText;
|
|
|
|
dVal = pArc->radius();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("Radius")] = sText;
|
|
|
|
dVal = pArc->startAngle();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("StartAngle")] = sText;
|
|
|
|
dVal = pArc->endAngle();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("EndAngle")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbCircle::desc()))
|
|
{
|
|
AcDbCircle* pCircle = (AcDbCircle*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Circle");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pCircle->center();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Center")] = sText;
|
|
|
|
dVal = pCircle->radius();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("Radius")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbEllipse::desc()))
|
|
{
|
|
AcDbEllipse* pEllips = (AcDbEllipse*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Ellipse");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pEllips->center();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Center")] = sText;
|
|
|
|
dVal = pEllips->majorAxis().length() * 2.0;
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("MajorAxis")] = sText;
|
|
|
|
dVal = pEllips->minorAxis().length() * 2.0;
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("MinorAxis")] = sText;
|
|
|
|
vtVal = pEllips->majorAxis();
|
|
dVal = vtVal.angleTo(AcGeVector3d::kXAxis, AcGeVector3d::kZAxis);
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("DirectAngle")] = sText;
|
|
|
|
dVal = pEllips->startAngle();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("StartAngle")] = sText;
|
|
|
|
dVal = pEllips->endAngle();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("EndAngle")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbText::desc()))
|
|
{
|
|
AcDbText* pText = (AcDbText*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Text");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pText->position();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Position")] = sText;
|
|
|
|
LPTSTR pszStr = pText->textString();
|
|
mapVarTypeToValue[_T("Content")] = pszStr;
|
|
acutDelString(pszStr);
|
|
|
|
dVal = pText->height();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("Height")] = sText;
|
|
|
|
dVal = pText->rotation();
|
|
sText.Format(_T("%f"), dVal);
|
|
mapVarTypeToValue[_T("Rotation")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbPoint::desc()))
|
|
{
|
|
AcDbPoint* pPoint = (AcDbPoint*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Point");
|
|
sDrawType = _T("Default");
|
|
|
|
ptVal = pPoint->position();
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Position")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbSolid::desc()))
|
|
{
|
|
AcDbSolid* pSolid = (AcDbSolid*)pEnt.GetObject();
|
|
|
|
sCurveType = _T("Solid");
|
|
sDrawType = _T("Default");
|
|
|
|
pSolid->getPointAt(0, ptVal);
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("First")] = sText;
|
|
|
|
pSolid->getPointAt(1, ptVal);
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Second")] = sText;
|
|
|
|
pSolid->getPointAt(2, ptVal);
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Third")] = sText;
|
|
|
|
pSolid->getPointAt(3, ptVal);
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("Fourth")] = sText;
|
|
}
|
|
else if (pEnt->isKindOf(AcDbPolyline::desc()))
|
|
{
|
|
AcDbPolyline* pPline = (AcDbPolyline*)pEnt.GetObject();
|
|
|
|
AcGePoint3d pt;
|
|
double dWidth;
|
|
int i = 0, iNums = pPline->numVerts();
|
|
while (i < iNums)
|
|
{
|
|
pPline->getWidthsAt(i, dWidth, dWidth);
|
|
pPline->getBulgeAt(i, dVal);
|
|
pPline->getPointAt(i, ptVal);
|
|
if ((++i) < iNums)
|
|
pPline->getPointAt(i, pt);
|
|
else if (pPline->isClosed())
|
|
pPline->getPointAt(0, pt);
|
|
else
|
|
break;
|
|
|
|
sText.Format(_T("%f"), dWidth);
|
|
mapVarTypeToValue[_T("Width")] = sText;
|
|
|
|
if (_IsZero_(dVal))
|
|
{
|
|
sCurveType = _T("Line");
|
|
sDrawType = _T("Default");
|
|
|
|
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
|
|
mapVarTypeToValue[_T("StartPoint")] = sText;
|
|
|
|
sText.Format(_T("%f,%f,%f"), pt.x, pt.y, pt.z);
|
|
mapVarTypeToValue[_T("EndPoint")] = sText;
|
|
}
|
|
else
|
|
{
|
|
sCurveType = _T("Arc");
|
|
sDrawType = _T("Default");
|
|
|
|
AcGePoint3d ptCenter;
|
|
double dRadius, dStartAngle, dEndAngle;
|
|
GetArcParam(ptVal, pt, dVal, pPline->normal(), ptCenter, dRadius, dStartAngle, dEndAngle);
|
|
sText.Format(_T("%f,%f,%f"), ptCenter.x, ptCenter.y, ptCenter.z);
|
|
mapVarTypeToValue[_T("Center")] = sText;
|
|
|
|
sText.Format(_T("%f"), dRadius);
|
|
mapVarTypeToValue[_T("Radius")] = sText;
|
|
|
|
sText.Format(_T("%f"), dStartAngle);
|
|
mapVarTypeToValue[_T("StartAngle")] = sText;
|
|
|
|
sText.Format(_T("%f"), dEndAngle);
|
|
mapVarTypeToValue[_T("EndAngle")] = sText;
|
|
}
|
|
|
|
pData = new KTParamRule;
|
|
if (NULL == pData)
|
|
continue;
|
|
|
|
pTab = m_wndLstRule.AddTab(_T(""));
|
|
if (NULL == pTab)
|
|
{
|
|
delete pData;
|
|
continue;
|
|
}
|
|
|
|
pData->SetClassId(m_cCurClass.GetId());
|
|
|
|
pData->SetCurveType(sCurveType);
|
|
pData->SetDrawType(sDrawType);
|
|
pTab->m_dwUserParam = (DWORD_PTR)pData;
|
|
|
|
OnShowRuleAttrItems(pTab, 0, TRUE);
|
|
OnShowExpression(pTab, mapVarTypeToValue, TRUE);
|
|
mapVarTypeToValue.RemoveAll();
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
pData = new KTParamRule;
|
|
if (NULL == pData)
|
|
continue;
|
|
|
|
pTab = m_wndLstRule.AddTab(_T(""));
|
|
if (NULL == pTab)
|
|
{
|
|
delete pData;
|
|
continue;
|
|
}
|
|
|
|
pData->SetClassId(m_cCurClass.GetId());
|
|
|
|
pData->SetCurveType(sCurveType);
|
|
pData->SetDrawType(sDrawType);
|
|
pTab->m_dwUserParam = (DWORD_PTR)pData;
|
|
|
|
OnShowRuleAttrItems(pTab, 0, TRUE);
|
|
OnShowExpression(pTab, mapVarTypeToValue, TRUE);
|
|
mapVarTypeToValue.RemoveAll();
|
|
|
|
m_bPartModified |= TRUE;
|
|
|
|
acedSSFree(ssSet);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnRuleNew()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
|
|
return;
|
|
|
|
// 收起展开的条目
|
|
int iIndex = m_wndLstRule.GetTabCount();
|
|
while ((--iIndex) >= 0)
|
|
m_wndLstRule.CollapseTab(iIndex);
|
|
|
|
// 创建属性数据
|
|
KTParamRule* pData = new KTParamRule;
|
|
if (NULL == pData)
|
|
return;
|
|
|
|
// 创建条目
|
|
CPropertyItemTab* pTab = m_wndLstRule.AddTab(_T(""), TRUE);
|
|
if (NULL == pTab)
|
|
{
|
|
delete pData;
|
|
return;
|
|
}
|
|
|
|
// 设置数据
|
|
pData->SetClassId(m_cCurClass.GetId());
|
|
pData->SetCurveType(_T("Line"));
|
|
pData->SetDrawType(_T("Default"));
|
|
pTab->m_dwUserParam = (DWORD_PTR)pData;
|
|
|
|
// 显示约束属性数据
|
|
OnShowRuleAttrItems(pTab, 0, TRUE);
|
|
// 显示约束参数数据
|
|
OnShowExpression(pTab, 0, TRUE);
|
|
|
|
m_wndLstRule.SetCurSel(pTab, -1);
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnRuleDelete()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
CPropertyItem* pItem = NULL;
|
|
m_wndLstRule.GetCurSel(pTab, pItem);
|
|
if (NULL == pTab || NULL != pItem)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
int iTab = m_wndLstRule.FindIndex(pTab);
|
|
ASSERT(iTab >= 0);
|
|
|
|
OnCleanRuleTab(pTab);
|
|
m_wndLstRule.DeleteTab(pTab);
|
|
|
|
if ((int)m_wndLstRule.GetTabCount() <= iTab)
|
|
iTab--;
|
|
m_wndLstRule.SetCurSel(iTab, -1);
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnRuleUp()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
int iTab, iIndex;
|
|
m_wndLstRule.GetCurSel(iTab, iIndex);
|
|
if (iTab < 1 || iIndex >= 0)
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
m_wndLstRule.FindTab(pTab, iTab - 1);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstRule.FindTab(pTab, iTab);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstRule.InsertTab(iTab - 1, *pTab);
|
|
m_wndLstRule.DeleteTab(pTab);
|
|
m_wndLstRule.SetCurSel(iTab - 1, -1);
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnRuleDown()
|
|
{
|
|
if (m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
int iTab, iIndex;
|
|
m_wndLstRule.GetCurSel(iTab, iIndex);
|
|
if (iTab < 0 || iIndex >= 0)
|
|
return;
|
|
|
|
CPropertyItemTab* pTab = NULL;
|
|
m_wndLstRule.FindTab(pTab, iTab);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
ULONG lId = m_cCurClass.GetId();
|
|
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstRule.FindTab(pTab, iTab + 1);
|
|
if (NULL == pTab)
|
|
return;
|
|
|
|
pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
|
|
return;
|
|
|
|
m_wndLstRule.InsertTab(iTab, *pTab);
|
|
m_wndLstRule.DeleteTab(pTab);
|
|
m_wndLstRule.SetCurSel(iTab + 1, -1);
|
|
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
|
|
void CDlgParamDefine::OnInitClassTree(ULONG lParent, HTREEITEM hParent)
|
|
{
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
KTParamClassArray arItems;
|
|
pService->GetSubClassItems(lParent, arItems);
|
|
|
|
ULONG lId;
|
|
HTREEITEM hItem;
|
|
int iSize = arItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
hItem = m_wndTreeClass.InsertItem(arItems[i].GetName(), hParent);
|
|
ASSERT(NULL != hItem);
|
|
|
|
lId = arItems[i].GetId();
|
|
m_wndTreeClass.SetItemData(hItem, lId);
|
|
|
|
OnInitClassTree(lId, hItem);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnCancel()
|
|
{
|
|
if (m_bPartModified)
|
|
{
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_DATANOTSAVED);
|
|
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
|
|
{
|
|
case IDYES:
|
|
// 代号不得为空
|
|
if (_tcslen(m_cCurClass.GetCode()) <= 0)
|
|
{
|
|
sMsg.LoadString(IDS_EMPTYCLASSCODE);
|
|
MessageBox(sMsg);
|
|
return;
|
|
}
|
|
// 保存分类的数据
|
|
if (NULL != hItem)
|
|
OnUpdateClassItemData(hItem);
|
|
m_bPartModified = FALSE;
|
|
break;
|
|
case IDCANCEL:
|
|
return;
|
|
}
|
|
}
|
|
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CDlgParamDefine::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
|
|
OnCleanAttributeList();
|
|
OnCleanRuleList();
|
|
}
|
|
|
|
void CDlgParamDefine::OnCleanAttrTab(CPropertyItemTab* pTab)
|
|
{
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
|
|
if (NULL != pItem->m_dwUserData)
|
|
{
|
|
delete ((KTParamTableAttr*)(pItem->m_dwUserData));
|
|
pItem->m_dwUserData = NULL;
|
|
}
|
|
if (NULL != pItem->m_dwUserDataEx)
|
|
{
|
|
delete ((KTParamTableAttr*)(pItem->m_dwUserDataEx));
|
|
pItem->m_dwUserDataEx = NULL;
|
|
}
|
|
}
|
|
|
|
if (NULL != pTab->m_dwUserParam)
|
|
{
|
|
delete ((KTParamAttribute*)(pTab->m_dwUserParam));
|
|
pTab->m_dwUserParam = NULL;
|
|
}
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
delete ((KTParamTableAttr*)(pTab->m_dwUserData));
|
|
pTab->m_dwUserData = NULL;
|
|
}
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
delete ((KTParamTableAttr*)(pTab->m_dwUserDataEx));
|
|
pTab->m_dwUserDataEx = NULL;
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnCleanAttributeList()
|
|
{
|
|
CPropertyItemTab* pTab;
|
|
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
|
|
while (NULL != pos)
|
|
{
|
|
pTab = m_wndLstAttribute.GetNextTab(pos);
|
|
ASSERT(NULL != pTab);
|
|
|
|
OnCleanAttrTab(pTab);
|
|
}
|
|
|
|
m_wndLstAttribute.ResetContent();
|
|
}
|
|
|
|
void CDlgParamDefine::OnCleanRuleTab(CPropertyItemTab* pTab)
|
|
{
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
|
|
if (NULL != pItem->m_dwUserData)
|
|
{
|
|
delete ((KTParamTableAttr*)(pItem->m_dwUserData));
|
|
pItem->m_dwUserData = NULL;
|
|
}
|
|
if (NULL != pItem->m_dwUserDataEx)
|
|
{
|
|
delete ((KTParamTableAttr*)(pItem->m_dwUserDataEx));
|
|
pItem->m_dwUserDataEx = NULL;
|
|
}
|
|
}
|
|
|
|
if (NULL != pTab->m_dwUserParam)
|
|
{
|
|
delete ((KTParamRule*)(pTab->m_dwUserParam));
|
|
pTab->m_dwUserParam = NULL;
|
|
}
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
delete ((KTParamTableAttr*)(pTab->m_dwUserData));
|
|
pTab->m_dwUserData = NULL;
|
|
}
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
delete ((KTParamTableAttr*)(pTab->m_dwUserDataEx));
|
|
pTab->m_dwUserDataEx = NULL;
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnCleanRuleList()
|
|
{
|
|
CPropertyItemTab* pTab;
|
|
POSITION pos = m_wndLstRule.GetFirstTabPositon();
|
|
while (NULL != pos)
|
|
{
|
|
pTab = m_wndLstRule.GetNextTab(pos);
|
|
ASSERT(NULL != pTab);
|
|
|
|
OnCleanRuleTab(pTab);
|
|
}
|
|
|
|
m_wndLstRule.ResetContent();
|
|
}
|
|
|
|
void CDlgParamDefine::OnUpdateClassItemData(HTREEITEM hItem)
|
|
{
|
|
CWaitCursor waiter;
|
|
|
|
// 为顶层条目,没有分类
|
|
ASSERT(NULL != hItem);
|
|
HTREEITEM hParent = m_wndTreeClass.GetParentItem(hItem);
|
|
if (NULL == hParent)
|
|
return;
|
|
|
|
KTParamClass cClassData;
|
|
KTParamAttributePtrArray arpAttrData;
|
|
KTParamRulePtrArray arpRuleData;
|
|
|
|
cClassData.SetId(m_wndTreeClass.GetItemData(hItem));
|
|
cClassData.SetUpId(m_wndTreeClass.GetItemData(hParent));
|
|
cClassData.SetName(m_wndTreeClass.GetItemText(hItem));
|
|
|
|
int iIndex = 0;
|
|
CPropertyItemTab* pTab;
|
|
KTParamAttribute* pAttr;
|
|
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
|
|
while (NULL != pos)
|
|
{
|
|
pTab = m_wndLstAttribute.GetNextTab(pos);
|
|
ASSERT(NULL != pTab);
|
|
|
|
pAttr = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (NULL == pAttr)
|
|
{
|
|
OnUpdateClassAttrData(pTab, cClassData);
|
|
}
|
|
else if (pAttr->GetClassId() == cClassData.GetId())
|
|
{
|
|
OnUpdateAttributeData(pTab, *pAttr);
|
|
pAttr->SetIndex(iIndex++);
|
|
arpAttrData.Add(pAttr);
|
|
}
|
|
}
|
|
|
|
iIndex = 0;
|
|
KTParamRule* pRule;
|
|
pos = m_wndLstRule.GetFirstTabPositon();
|
|
while (NULL != pos)
|
|
{
|
|
pTab = m_wndLstRule.GetNextTab(pos);
|
|
ASSERT(NULL != pTab);
|
|
|
|
pRule = (KTParamRule*)pTab->m_dwUserParam;
|
|
ASSERT(NULL != pRule);
|
|
|
|
//if (pRule->GetClassId() == cClassData.GetId())
|
|
{
|
|
OnUpdateRuleData(pTab, *pRule);
|
|
pRule->SetIndex(iIndex++);
|
|
arpRuleData.Add(pRule);
|
|
}
|
|
}
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 更新类型数据
|
|
BOOL bSuccess = pService->UpdateClassData(&cClassData);
|
|
if (bSuccess)
|
|
{
|
|
if (m_wndTreeClass.GetSelectedItem() == hItem)
|
|
m_cCurClass = cClassData;
|
|
|
|
m_wndTreeClass.SetItemData(hItem, cClassData.GetId());
|
|
// 更新属性数据
|
|
bSuccess &= pService->UpdateAttributeData(cClassData.GetId(), arpAttrData);
|
|
// 更新约束数据
|
|
bSuccess &= pService->UpdateRuleData(cClassData.GetId(), arpRuleData);
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
CString sMsg;
|
|
sMsg.LoadString(IDS_DATAACCESSERROR);
|
|
MessageBox(sMsg);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnUpdateClassAttrData(CPropertyItemTab* pTab, KTParamClass& cClassData)
|
|
{
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
CMapStringToString mapVarToValue;
|
|
pService->GetTableItemById(_T("GetClassItemById"), cClassData.GetId(), mapVarToValue);
|
|
// 更新数据
|
|
if (0 == cClassData.GetId())
|
|
cClassData.MapFieldToValue(mapVarToValue);
|
|
|
|
CString sValue;
|
|
KTParamTableAttr* pAttr;
|
|
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
|
|
if (NULL != pItem->m_dwUserData)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
|
|
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
if (NULL != pItem->m_dwUserDataEx)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx;
|
|
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sName, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnUpdateAttributeData(CPropertyItemTab* pTab, KTParamAttribute& cAttrData)
|
|
{
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得属性条目的数据映射
|
|
CMapStringToString mapVarToValue;
|
|
pService->GetTableItemById(_T("GetAttributeItemById"), cAttrData.GetId(), mapVarToValue);
|
|
// 更新数据
|
|
if (0 == cAttrData.GetId())
|
|
cAttrData.MapFieldToValue(mapVarToValue);
|
|
|
|
CString sValue;
|
|
KTParamTableAttr* pAttr;
|
|
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
|
|
if (NULL != pItem->m_dwUserData)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
|
|
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
|
|
if (NULL != pItem->m_dwUserDataEx)
|
|
{
|
|
pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx;
|
|
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sName, pAttr->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr->GetField()] = sValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnUpdateRuleData(CPropertyItemTab* pTab, KTParamRule& cRuleData)
|
|
{
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得属性条目的数据映射
|
|
CMapStringToString mapVarToValue;
|
|
pService->GetTableItemById(_T("GetRuleItemById"), cRuleData.GetId(), mapVarToValue);
|
|
// 更新数据
|
|
if (0 == cRuleData.GetId())
|
|
cRuleData.MapFieldToValue(mapVarToValue);
|
|
|
|
CString sValue;
|
|
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
ASSERT(NULL != pAttr1);
|
|
cRuleData.SetValue(pAttr1->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr1->GetField()] = sValue;
|
|
|
|
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
ASSERT(NULL != pAttr2);
|
|
cRuleData.SetValue(pAttr2->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapVarToValue));
|
|
mapVarToValue[pAttr2->GetField()] = sValue;
|
|
|
|
CMapStringToString mapDescToParam;
|
|
AsDescTable(sValue, pAttr1->GetVarDesc(), mapVarToValue);
|
|
pService->GetCurveDrawTypeParam(sValue, mapVarToValue[pAttr1->GetField()], mapVarToValue[pAttr2->GetField()], mapDescToParam, TRUE);
|
|
|
|
KTParamExpression cExpress;
|
|
cExpress.SetRuleId(cRuleData.GetId());
|
|
|
|
int iIndex = 0;
|
|
CPropertyItem* pItem;
|
|
POSITION pos = pTab->m_listItem.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
pItem = pTab->m_listItem.GetNext(pos);
|
|
ASSERT(NULL != pItem);
|
|
ASSERT(NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx);
|
|
|
|
cExpress.SetVarType(mapDescToParam[pItem->m_sName]);
|
|
cExpress.SetValue(pItem->m_sValue);
|
|
cExpress.SetIndex(iIndex++);
|
|
cRuleData.m_arExpression.Add(cExpress);
|
|
}
|
|
}
|
|
|
|
CPropertyItem::ItemStyle CDlgParamDefine::AsItemStyle(LPCTSTR pszDataType, BOOL bMulti, BOOL bOverride)
|
|
{
|
|
if (bMulti)
|
|
{
|
|
if (bOverride)
|
|
return CPropertyItem::CMB_DOWN;
|
|
else
|
|
return CPropertyItem::CMB_LIST;
|
|
}
|
|
|
|
if (0 == _tcsicmp(pszDataType, _T("Int")))
|
|
{
|
|
return CPropertyItem::EDT_SPIN;
|
|
}
|
|
else if (0 == _tcsicmp(pszDataType, _T("Real")))
|
|
{
|
|
return CPropertyItem::EDT_REAL;
|
|
}
|
|
else if (0 == _tcsicmp(pszDataType, _T("Char")))
|
|
{
|
|
return CPropertyItem::EDT_NONE;
|
|
}
|
|
else if (0 == _tcsicmp(pszDataType, _T("Bool")))
|
|
{
|
|
return CPropertyItem::CMB_LIST_YESNO;
|
|
}
|
|
else
|
|
{
|
|
return CPropertyItem::EDT_NONE;
|
|
}
|
|
}
|
|
|
|
LPCTSTR CDlgParamDefine::AsItemString(CString& sData, LPCTSTR pszDataType)
|
|
{
|
|
if (0 == _tcsicmp(pszDataType, _T("Bool")) && !sData.IsEmpty())
|
|
{
|
|
// 转换数据
|
|
if (_istdigit(sData[sData.GetLength() - 1]))
|
|
sData = (_ttoi(sData) ? _T("TRUE") : _T("FALSE"));
|
|
else if (!sData.IsEmpty() && _istalnum(sData[0]))
|
|
;
|
|
else
|
|
sData = (sData.CompareNoCase(_T("是")) == 0 ? _T("TRUE") : _T("FALSE"));
|
|
}
|
|
return sData;
|
|
}
|
|
|
|
LPCTSTR CDlgParamDefine::AsDescTable(CString& sDescTable, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
|
|
{
|
|
if (NULL != _tcschr(pszVarDesc, _T(' ')))
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
CString sSQL;
|
|
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
|
|
{
|
|
CStringArray arsTable;
|
|
if (pService->ExecuteSQL(sSQL, arsTable))
|
|
{
|
|
sDescTable = arsTable[0];
|
|
return sDescTable;
|
|
}
|
|
}
|
|
}
|
|
|
|
sDescTable = pszVarDesc;
|
|
|
|
return sDescTable;
|
|
}
|
|
|
|
LPCTSTR CDlgParamDefine::AsItemDesc(CString& sDesc, LPCTSTR pszData, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
|
|
{
|
|
if (NULL == pszVarDesc || 0 >= _tcslen(pszVarDesc))
|
|
{
|
|
sDesc = pszData;
|
|
return sDesc;
|
|
}
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
CStringArray arsTable;
|
|
if (NULL != _tcschr(pszVarDesc, _T(' ')))
|
|
{
|
|
CString sSQL;
|
|
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
|
|
pService->ExecuteSQL(sSQL, arsTable);
|
|
}
|
|
else
|
|
arsTable.Add(pszVarDesc);
|
|
if (1 != arsTable.GetSize() || arsTable[0].IsEmpty())
|
|
{
|
|
sDesc = pszData;
|
|
return sDesc;
|
|
}
|
|
|
|
// 取得逻辑值数据
|
|
CMapStringToString mapValueToDesc;
|
|
pService->GetValueToDescMap(arsTable[0], mapValueToDesc);
|
|
if (!mapValueToDesc.Lookup(pszData, sDesc))
|
|
sDesc = pszData;
|
|
return sDesc;
|
|
}
|
|
|
|
LPCTSTR CDlgParamDefine::ByItemDesc(CString& sData, LPCTSTR pszDesc, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
|
|
{
|
|
if (NULL == pszVarDesc || 0 >= _tcslen(pszVarDesc))
|
|
{
|
|
sData = pszDesc;
|
|
return sData;
|
|
}
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
CStringArray arsTable;
|
|
if (NULL != _tcschr(pszVarDesc, _T(' ')))
|
|
{
|
|
CString sSQL;
|
|
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
|
|
pService->ExecuteSQL(sSQL, arsTable);
|
|
}
|
|
else
|
|
arsTable.Add(pszVarDesc);
|
|
if (1 != arsTable.GetSize() || arsTable[0].IsEmpty())
|
|
{
|
|
sData = pszDesc;
|
|
return sData;
|
|
}
|
|
|
|
// 取得逻辑值数据
|
|
CMapStringToString mapDescToValue;
|
|
pService->GetDescToValueMap(arsTable[0], mapDescToValue);
|
|
if (!mapDescToValue.Lookup(pszDesc, sData))
|
|
sData = pszDesc;
|
|
return sData;
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowClassData(HTREEITEM hItem, BOOL bEdit)
|
|
{
|
|
// 取得分类ID
|
|
ASSERT(NULL != hItem);
|
|
ULONG lId = m_wndTreeClass.GetItemData(hItem);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
KTParamClass data;
|
|
if (!pService->GetClassItemById(lId, data))
|
|
{
|
|
// 如果是新建分类,列出父类型数据
|
|
if (NULL != (hItem = m_wndTreeClass.GetParentItem(hItem)))
|
|
OnShowClassData(hItem, FALSE);
|
|
return;
|
|
}
|
|
|
|
if (bEdit)
|
|
bEdit = (!data.IsReadOnly());
|
|
|
|
if (NULL != (hItem = m_wndTreeClass.GetParentItem(hItem)))
|
|
OnShowClassData(hItem, FALSE);
|
|
|
|
OnShowAttributeItems(lId, bEdit);
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowClassAttrItems(HTREEITEM hItem, BOOL bEdit)
|
|
{
|
|
// 为顶层条目,没有分类
|
|
ASSERT(NULL != hItem);
|
|
if (NULL == m_wndTreeClass.GetParentItem(hItem))
|
|
return;
|
|
|
|
// 取得分类ID
|
|
ULONG lId = m_wndTreeClass.GetItemData(hItem);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得类型条目的数据映射
|
|
CMapStringToString mapData;
|
|
pService->GetTableItemById(_T("GetClassItemById"), lId, mapData);
|
|
mapData[_T("Name")] = m_wndTreeClass.GetItemText(hItem);
|
|
|
|
// 取得类型表属性数据
|
|
KTParamTableAttrPtrArray arpItems;
|
|
pService->GetTableAttrItems(_T("Class_Attr"), TRUE, arpItems);
|
|
|
|
// 准备构造列表
|
|
CPropertyItem* pItem = NULL;
|
|
CPropertyItemTab* pTab = NULL;
|
|
|
|
// 构造列表
|
|
LPCTSTR pszFlags;
|
|
KTParamTableAttr* pAttr;
|
|
int iSize = arpItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
// 取得属性表属性项
|
|
pAttr = arpItems[i];
|
|
ASSERT(NULL != pAttr && pAttr->IsVisible());
|
|
|
|
// 如果条目为空,且创建不成功,删除属性项
|
|
if (NULL == pTab && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
|
|
// 根据标志处理类型内容位置
|
|
pszFlags = pAttr->GetFlags();
|
|
// 如为Tab分类
|
|
if (NULL != _tcschr(pszFlags, _T('C')))
|
|
{
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 判断是否已经有标题域了或者添加失败,有了或添加不成功则删除属性项
|
|
if (NULL != pTab->m_dwUserDataEx && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pTab->m_sName.IsEmpty())
|
|
pTab->m_sName = pAttr->GetDefault();
|
|
pTab->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 判断是否已经有数值域了或者添加失败,有了或添加不成功则删除属性项
|
|
if (NULL != pTab->m_dwUserData && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pTab->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pTab->m_sValue.IsEmpty())
|
|
pTab->m_sValue = pAttr->GetDefault();
|
|
pTab->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 如果条目为空,且创建不成功,删除属性项
|
|
if (NULL == pItem && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pItem->m_sName.IsEmpty())
|
|
pItem->m_sName = pAttr->GetDefault();
|
|
pItem->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserData && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pItem->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pItem->m_sValue.IsEmpty())
|
|
pItem->m_sValue = pAttr->GetDefault();
|
|
pItem->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowAttributeItems(ULONG lId, BOOL bEdit)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 获取属性内容
|
|
KTParamAttributePtrArray arpItems;
|
|
pService->GetAttributeItems(lId, arpItems);
|
|
|
|
// 准备构造列表
|
|
CPropertyItemTab* pTab;
|
|
KTParamAttribute* pAttr;
|
|
|
|
// 构造列表
|
|
int iSize = arpItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
// 取得属性表属性项
|
|
pAttr = arpItems[i];
|
|
ASSERT(NULL != pAttr);
|
|
|
|
// 创建属性分类
|
|
pTab = m_wndLstAttribute.AddTab(_T(""));
|
|
if (NULL == pTab)
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
|
|
// 保存当前属性内容
|
|
pTab->m_dwUserParam = (DWORD_PTR)pAttr;
|
|
|
|
// 显示当前属性条目
|
|
OnShowAttributeAttrItems(pTab, pAttr->GetId(), bEdit);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowAttributeAttrItems(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得属性条目的数据映射
|
|
CMapStringToString mapData;
|
|
pService->GetTableItemById(_T("GetAttributeItemById"), lId, mapData);
|
|
// 更新数据
|
|
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
|
|
if (0 == pData->GetId())
|
|
pData->MapFieldToValue(mapData);
|
|
|
|
// 取得属性表属性数据
|
|
KTParamTableAttrPtrArray arpItems;
|
|
pService->GetTableAttrItems(_T("Attribute_Attr"), TRUE, arpItems);
|
|
|
|
// 准备构造列表
|
|
CPropertyItem* pItem = NULL;
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 构造列表
|
|
LPCTSTR pszFlags;
|
|
KTParamTableAttr* pAttr;
|
|
int iSize = arpItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
// 取得属性表属性项
|
|
pAttr = arpItems[i];
|
|
ASSERT(NULL != pAttr && pAttr->IsVisible());
|
|
|
|
// 根据标志处理属性内容位置
|
|
pszFlags = pAttr->GetFlags();
|
|
// 如为Tab分类
|
|
if (NULL != _tcschr(pszFlags, _T('C')))
|
|
{
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 判断是否已经有标题域了,有了则删除属性项
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pTab->m_sName.IsEmpty())
|
|
pTab->m_sName = pAttr->GetDefault();
|
|
pTab->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 判断是否已经有数值域了,有了则删除属性项
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pTab->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pTab->m_sValue.IsEmpty())
|
|
pTab->m_sValue = pAttr->GetDefault();
|
|
pTab->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 如果条目为空,且创建不成功,删除属性项
|
|
if (NULL == pItem && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pItem->m_sName.IsEmpty())
|
|
pItem->m_sName = pAttr->GetDefault();
|
|
pItem->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pItem->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserData && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pItem->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pItem->m_sValue.IsEmpty())
|
|
pItem->m_sValue = pAttr->GetDefault();
|
|
pItem->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
|
|
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowRuleData(HTREEITEM hItem, BOOL bEdit)
|
|
{
|
|
// 取得分类ID
|
|
ASSERT(NULL != hItem);
|
|
ULONG lId = m_wndTreeClass.GetItemData(hItem);
|
|
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 获取约束数据
|
|
KTParamRulePtrArray arpItems;
|
|
pService->GetRuleItems(lId, arpItems);
|
|
|
|
// 准备构造列表
|
|
CPropertyItemTab* pTab;
|
|
KTParamRule* pRule;
|
|
|
|
// 构造列表
|
|
int iSize = arpItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
// 取得约束表项
|
|
pRule = arpItems[i];
|
|
ASSERT(NULL != pRule);
|
|
|
|
pTab = m_wndLstRule.AddTab(_T(""));
|
|
if (NULL == pTab)
|
|
{
|
|
delete pRule;
|
|
continue;
|
|
}
|
|
|
|
// 保存当前约束内容
|
|
pTab->m_dwUserParam = (DWORD_PTR)pRule;
|
|
|
|
// 显示当前约束条目
|
|
OnShowRuleAttrItems(pTab, pRule->GetId(), bEdit);
|
|
// 显示当前约束参数
|
|
OnShowExpression(pTab, pRule->GetId(), bEdit);
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowRuleAttrItems(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得约束条目的数据映射
|
|
CMapStringToString mapData;
|
|
pService->GetTableItemById(_T("GetRuleItemById"), lId, mapData);
|
|
// 更新
|
|
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
|
|
mapData[_T("CurveType")] = pData->GetCurveType();
|
|
mapData[_T("DrawType")] = pData->GetDrawType();
|
|
|
|
// 取得约束表属性数据
|
|
KTParamTableAttrPtrArray arpItems;
|
|
pService->GetTableAttrItems(_T("Rules_Attr"), TRUE, arpItems);
|
|
|
|
// 准备构造列表
|
|
CPropertyItem* pItem = NULL;
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 构造列表
|
|
LPCTSTR pszFlags;
|
|
KTParamTableAttr* pAttr;
|
|
int iSize = arpItems.GetSize();
|
|
for (int i = 0; i < iSize; i++)
|
|
{
|
|
// 取得约束表属性项
|
|
pAttr = arpItems[i];
|
|
ASSERT(NULL != pAttr && pAttr->IsVisible());
|
|
|
|
// 根据标志处理属性内容位置
|
|
pszFlags = pAttr->GetFlags();
|
|
// 如为Tab分类
|
|
if (NULL != _tcschr(pszFlags, _T('C')))
|
|
{
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 判断是否已经有标题域了,有了则删除属性项
|
|
if (NULL != pTab->m_dwUserDataEx)
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pTab->m_sName.IsEmpty())
|
|
pTab->m_sName = pAttr->GetDefault();
|
|
pTab->m_bNameEditable = bEdit;
|
|
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 判断是否已经有数值域了,有了则删除属性项
|
|
if (NULL != pTab->m_dwUserData)
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pTab->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pTab->m_sValue.IsEmpty())
|
|
pTab->m_sValue = pAttr->GetDefault();
|
|
pTab->m_bValueEditable = bEdit;
|
|
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pTab->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 如果条目为空,且创建不成功,删除属性项
|
|
if (NULL == pItem && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
|
|
// 如为Tab的标题域
|
|
if (NULL != _tcschr(pszFlags, _T('T')))
|
|
{
|
|
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新标题域内容
|
|
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果标题为空,则使用默认值
|
|
if (pItem->m_sName.IsEmpty())
|
|
pItem->m_sName = pAttr->GetDefault();
|
|
pItem->m_bNameEditable = bEdit;
|
|
pItem->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写数值域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sValue = pAttr->GetName();
|
|
}
|
|
else
|
|
{
|
|
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
|
|
if (NULL != pItem->m_dwUserData && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|
|
|| NULL == (pItem = pTab->m_listItem.GetTail())))
|
|
{
|
|
delete pAttr;
|
|
continue;
|
|
}
|
|
// 赋值更新数值域内容
|
|
pItem->m_dwUserData = (DWORD_PTR)pAttr;
|
|
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
|
|
// 如果数值为空,则使用默认值
|
|
if (pItem->m_sValue.IsEmpty())
|
|
pItem->m_sValue = pAttr->GetDefault();
|
|
pItem->m_bValueEditable = bEdit;
|
|
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
|
|
// 如果不是单项,填写标题域内容
|
|
if (NULL == _tcschr(pszFlags, _T('S')))
|
|
pItem->m_sName = pAttr->GetName();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowExpression(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
// 取得约束参数表达式数据
|
|
CMapStringToString mapVarTypeToValue;
|
|
pService->GetExpressionItemById(lId, mapVarTypeToValue);
|
|
|
|
OnShowExpression(pTab, mapVarTypeToValue, bEdit);
|
|
}
|
|
|
|
void CDlgParamDefine::OnShowExpression(CPropertyItemTab* pTab, CMapStringToString& mapVarTypeToValue, BOOL bEdit)
|
|
{
|
|
// 检查参数化数据库
|
|
KTParamService* pService = GetKTParamService();
|
|
ASSERT(NULL != pService);
|
|
|
|
KTParamRule* pRule = (KTParamRule*)pTab->m_dwUserParam;
|
|
ASSERT(NULL != pRule);
|
|
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
|
|
ASSERT(NULL != pAttr1);
|
|
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
|
|
ASSERT(NULL != pAttr2);
|
|
|
|
// 取得约束条目的数据映射
|
|
CMapStringToString mapData;
|
|
pService->GetTableItemById(_T("GetRuleItemById"), pRule->GetId(), mapData);
|
|
// 更新
|
|
CString sValue;
|
|
mapData[pAttr1->GetField()] = ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapData);
|
|
mapData[pAttr2->GetField()] = ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapData);
|
|
|
|
// 获得参数映射
|
|
CMapStringToString mapParamToDesc;
|
|
AsDescTable(sValue, pAttr1->GetVarDesc(), mapData);
|
|
pService->GetCurveDrawTypeParam(sValue, mapData[pAttr1->GetField()], mapData[pAttr2->GetField()], mapParamToDesc);
|
|
|
|
// 准备构造列表
|
|
ASSERT(NULL != pTab);
|
|
|
|
// 构造列表
|
|
sValue.Empty();
|
|
CString sKey, sName;
|
|
POSITION pos = mapParamToDesc.GetStartPosition();
|
|
while (NULL != pos)
|
|
{
|
|
mapParamToDesc.GetNextAssoc(pos, sKey, sName);
|
|
mapVarTypeToValue.Lookup(sKey, sValue);
|
|
m_wndLstRule.AddItem(pTab, sName, sValue, CPropertyItem::EDT_NONE, bEdit);
|
|
sName.Empty();
|
|
sValue.Empty();
|
|
}
|
|
}
|
|
|
|
void CDlgParamDefine::OnClassCopy()
|
|
{
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
|
|
return;
|
|
|
|
m_hCopyClass = hItem;
|
|
}
|
|
|
|
void CDlgParamDefine::OnAttrPaste()
|
|
{
|
|
if (NULL == m_hCopyClass)
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || hItem == m_hCopyClass)
|
|
return;
|
|
|
|
HTREEITEM hParent = m_wndTreeClass.GetParentItem(hItem);
|
|
if (NULL == hParent || m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
do
|
|
{
|
|
if (hParent == m_hCopyClass)
|
|
return;
|
|
hParent = m_wndTreeClass.GetParentItem(hParent);
|
|
} while (NULL != hParent);
|
|
|
|
ULONG lId = m_wndTreeClass.GetItemData(m_hCopyClass);
|
|
if (0 == lId)
|
|
return;
|
|
|
|
UINT nOld = m_wndLstAttribute.GetTabCount();
|
|
OnShowAttributeItems(lId, TRUE);
|
|
UINT nLen = m_wndLstAttribute.GetTabCount();
|
|
|
|
ULONG lClassId = m_wndTreeClass.GetItemData(hItem);
|
|
|
|
CPropertyItemTab* pTab1;
|
|
CPropertyItemTab* pTab2;
|
|
KTParamAttribute* pAttr1;
|
|
KTParamAttribute* pAttr2;
|
|
for (UINT n = nOld; n < nLen; n++)
|
|
{
|
|
if (NULL == m_wndLstAttribute.FindTab(pTab1, n) || NULL == pTab1->m_dwUserParam)
|
|
continue;
|
|
|
|
pAttr1 = (KTParamAttribute*)pTab1->m_dwUserParam;
|
|
pAttr1->SetClassId(lClassId);
|
|
pAttr1->SetId(NULL);
|
|
|
|
for (UINT m = 0; m < nOld; m++)
|
|
{
|
|
if (NULL == m_wndLstAttribute.FindTab(pTab2, m) || NULL == pTab2->m_dwUserParam)
|
|
continue;
|
|
|
|
pAttr2 = (KTParamAttribute*)pTab2->m_dwUserParam;
|
|
|
|
if (0 == _tcsicmp(pAttr1->GetCode(), pAttr2->GetCode()))
|
|
{
|
|
--n;
|
|
--nLen;
|
|
if (pTab2->m_bNameEditable)
|
|
{
|
|
--nOld;
|
|
m_bPartModified |= TRUE;
|
|
}
|
|
else
|
|
{
|
|
pTab2 = pTab1;
|
|
}
|
|
|
|
OnCleanAttrTab(pTab2);
|
|
m_wndLstAttribute.DeleteTab(pTab2);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_bPartModified |= (nLen != nOld);
|
|
}
|
|
|
|
void CDlgParamDefine::OnRulePaste()
|
|
{
|
|
if (NULL == m_hCopyClass)
|
|
return;
|
|
|
|
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
|
|
if (NULL == hItem || hItem == m_hCopyClass || NULL == m_wndTreeClass.GetParentItem(hItem) || m_cCurClass.IsReadOnly())
|
|
return;
|
|
|
|
UINT nOld = m_wndLstRule.GetTabCount();
|
|
OnShowRuleData(m_hCopyClass, TRUE);
|
|
UINT nLen = m_wndLstRule.GetTabCount();
|
|
|
|
ULONG lClassId = m_wndTreeClass.GetItemData(hItem);
|
|
|
|
CPropertyItemTab* pTab;
|
|
KTParamRule* pRule;
|
|
for (UINT n = nOld; n < nLen; n++)
|
|
{
|
|
if (NULL == m_wndLstRule.FindTab(pTab, n) || NULL == pTab->m_dwUserParam)
|
|
continue;
|
|
|
|
pRule = (KTParamRule*)pTab->m_dwUserParam;
|
|
pRule->SetClassId(lClassId);
|
|
pRule->SetId(NULL);
|
|
}
|
|
|
|
m_bPartModified |= (nLen != nOld);
|
|
}
|