XTPPropertyGridItemBool.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:13k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // CXTPPropertyGridItemBool.cpp : implementation of the XTPPropertyGridItemBool class.
  2. //
  3. // This file is a part of the XTREME PROPERTYGRID MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPVC80Helpers.h"
  23. #include "Common/XTPVC50Helpers.h"
  24. #include "Common/XTPResourceManager.h"
  25. #include "XTPPropertyGridInplaceEdit.h"
  26. #include "XTPPropertyGridInplaceButton.h"
  27. #include "XTPPropertyGridInplaceList.h"
  28. #include "XTPPropertyGridItem.h"
  29. #include "XTPPropertyGridItemBool.h"
  30. #include "XTPPropertyGridPaintManager.h"
  31. #include "XTPPropertyGrid.h"
  32. #include "XTPPropertyGridView.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CXTPPropertyGridItemBool
  40. IMPLEMENT_DYNAMIC(CXTPPropertyGridItemBool, CXTPPropertyGridItem)
  41. CXTPPropertyGridItemBool::CXTPPropertyGridItemBool(LPCTSTR strCaption, BOOL bValue, BOOL* pBindBool)
  42. : CXTPPropertyGridItem(strCaption)
  43. , m_strTrueText(_T("True"))
  44. , m_strFalseText(_T("False"))
  45. {
  46. m_pBindBool = pBindBool;
  47. _Init(bValue);
  48. }
  49. CXTPPropertyGridItemBool::CXTPPropertyGridItemBool(UINT nID, BOOL bValue, BOOL* pBindBool)
  50. : CXTPPropertyGridItem(nID)
  51. , m_strTrueText(_T("True"))
  52. , m_strFalseText(_T("False"))
  53. {
  54. m_pBindBool = pBindBool;
  55. _Init(bValue);
  56. }
  57. CXTPPropertyGridItemBool::~CXTPPropertyGridItemBool()
  58. {
  59. }
  60. /////////////////////////////////////////////////////////////////////////////
  61. //
  62. void CXTPPropertyGridItemBool::_Init(BOOL bValue)
  63. {
  64. m_nFlags = xtpGridItemHasComboButton | xtpGridItemHasEdit;
  65. CString strTrueFalse;
  66. if (XTPResourceManager()->LoadString(&strTrueFalse, XTP_IDS_PROPERTYGRID_TRUEFALSE)
  67. && (strTrueFalse.Find(_T('n')) != -1))
  68. {
  69. AfxExtractSubString(m_strTrueText, strTrueFalse, 0);
  70. AfxExtractSubString(m_strFalseText, strTrueFalse, 1);
  71. }
  72. SetBool(bValue);
  73. m_pConstraints->AddConstraint(m_strTrueText);
  74. m_pConstraints->AddConstraint(m_strFalseText);
  75. SetConstraintEdit(TRUE);
  76. m_strDefaultValue = m_strValue;
  77. m_bCheckBoxStyle = FALSE;
  78. }
  79. void CXTPPropertyGridItemBool::SetValue(CString strValue)
  80. {
  81. SetBool(strValue.CompareNoCase(m_strTrueText) == 0);
  82. }
  83. void CXTPPropertyGridItemBool::SetBool(BOOL bValue)
  84. {
  85. m_bValue = bValue;
  86. if (m_pBindBool)
  87. {
  88. *m_pBindBool = bValue;
  89. }
  90. CXTPPropertyGridItem::SetValue(bValue ? m_strTrueText : m_strFalseText);
  91. }
  92. void CXTPPropertyGridItemBool::BindToBool(BOOL* pBindBool)
  93. {
  94. m_pBindBool = pBindBool;
  95. if (m_pBindBool)
  96. {
  97. *m_pBindBool = m_bValue;
  98. }
  99. }
  100. void CXTPPropertyGridItemBool::OnBeforeInsert()
  101. {
  102. if (m_pBindBool && *m_pBindBool != m_bValue)
  103. {
  104. SetBool(*m_pBindBool);
  105. }
  106. }
  107. BOOL CXTPPropertyGridItemBool::SetValueText(CString& strValueText, LPCTSTR strNewText)
  108. {
  109. // see if the value exists.
  110. int iIndex = m_pConstraints->FindConstraint(strValueText);
  111. if (iIndex != -1)
  112. {
  113. // if this is the current value change it as well.
  114. if (GetValue() == strValueText)
  115. {
  116. CXTPPropertyGridItem::SetValue(strNewText);
  117. }
  118. // update the value.
  119. strValueText = strNewText;
  120. m_pConstraints->GetConstraintAt(iIndex)->m_strConstraint = strValueText;
  121. return TRUE;
  122. }
  123. return FALSE;
  124. }
  125. BOOL CXTPPropertyGridItemBool::SetTrueFalseText(LPCTSTR strTrueText, LPCTSTR strFalseText)
  126. {
  127. // update the "True" value text
  128. if (!SetValueText(m_strTrueText, strTrueText))
  129. return FALSE;
  130. // update the "False" value text
  131. if (!SetValueText(m_strFalseText, strFalseText))
  132. return FALSE;
  133. return TRUE;
  134. }
  135. void CXTPPropertyGridItemBool::SetCheckBoxStyle(BOOL bCheckBoxStyle /*= TRUE*/)
  136. {
  137. m_bCheckBoxStyle = bCheckBoxStyle;
  138. SetFlags(m_bCheckBoxStyle ? 0 : xtpGridItemHasComboButton | xtpGridItemHasEdit);
  139. }
  140. BOOL CXTPPropertyGridItemBool::IsCheckBoxStyle() const
  141. {
  142. return m_bCheckBoxStyle;
  143. }
  144. CString CXTPPropertyGridItemBool::GetViewValue()
  145. {
  146. return m_bCheckBoxStyle ? _T("") : CXTPPropertyGridItem::GetViewValue();
  147. }
  148. BOOL CXTPPropertyGridItemBool::OnKeyDown (UINT nChar)
  149. {
  150. if (m_bCheckBoxStyle && !GetReadOnly() && (nChar == VK_SPACE))
  151. {
  152. CRect rc = GetValueRect();
  153. OnLButtonDblClk(0, rc.CenterPoint());
  154. return TRUE;
  155. }
  156. return FALSE;
  157. }
  158. void CXTPPropertyGridItemBool::OnLButtonDblClk(UINT nFlags, CPoint point)
  159. {
  160. if (m_bCheckBoxStyle && PtInValueRect(point) && !GetReadOnly())
  161. {
  162. OnSelect();
  163. SelectNextConstraint();
  164. }
  165. else
  166. {
  167. CXTPPropertyGridItem::OnLButtonDblClk(nFlags, point);
  168. }
  169. }
  170. BOOL CXTPPropertyGridItemBool::PtInCheckBoxRect(CPoint point)
  171. {
  172. CRect rc = GetValueRect();
  173. rc.right = rc.left + 15;
  174. return rc.PtInRect(point);
  175. }
  176. BOOL CXTPPropertyGridItemBool::OnLButtonDown(UINT nFlags, CPoint point)
  177. {
  178. if (!CXTPPropertyGridItem::OnLButtonDown(nFlags, point))
  179. return FALSE;
  180. if (m_bCheckBoxStyle)
  181. {
  182. if (PtInCheckBoxRect(point) && !GetReadOnly())
  183. {
  184. OnLButtonDblClk(nFlags, point);
  185. }
  186. }
  187. return TRUE;
  188. }
  189. BOOL CXTPPropertyGridItemBool::OnDrawItemValue(CDC& dc, CRect /*rcValue*/)
  190. {
  191. if (!m_bCheckBoxStyle)
  192. return FALSE;
  193. CXTPPropertyGridPaintManager* pPaintManager = m_pGrid->GetPaintManager();
  194. pPaintManager->DrawCheckBox(&dc, this);
  195. return TRUE;
  196. }
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CXTPPropertyGridItemEnum
  199. IMPLEMENT_DYNAMIC(CXTPPropertyGridItemEnum, CXTPPropertyGridItem)
  200. CXTPPropertyGridItemEnum::CXTPPropertyGridItemEnum(LPCTSTR strCaption, int nValue, int* pBindEnum)
  201. : CXTPPropertyGridItem(strCaption)
  202. {
  203. m_pBindEnum = pBindEnum;
  204. _Init(nValue);
  205. }
  206. CXTPPropertyGridItemEnum::CXTPPropertyGridItemEnum(UINT nID, int nValue, int* pBindEnum)
  207. : CXTPPropertyGridItem(nID)
  208. {
  209. m_pBindEnum = pBindEnum;
  210. _Init(nValue);
  211. }
  212. CXTPPropertyGridItemEnum::~CXTPPropertyGridItemEnum()
  213. {
  214. }
  215. void CXTPPropertyGridItemEnum::_Init(int nValue)
  216. {
  217. SetEnum(nValue);
  218. m_nFlags = xtpGridItemHasComboButton | xtpGridItemHasEdit;
  219. SetConstraintEdit(TRUE);
  220. m_strDefaultValue = m_strValue;
  221. }
  222. void CXTPPropertyGridItemEnum::SetValue(CString strValue)
  223. {
  224. int nIndex = m_pConstraints->FindConstraint(strValue);
  225. ASSERT(nIndex >= 0);
  226. if (nIndex >= 0)
  227. {
  228. SetEnum(m_pConstraints->GetConstraintAt(nIndex));
  229. }
  230. }
  231. void CXTPPropertyGridItemEnum::SetEnum(int nValue)
  232. {
  233. m_nValue = nValue;
  234. if (m_pBindEnum)
  235. {
  236. *m_pBindEnum = nValue;
  237. }
  238. int nIndex = m_pConstraints->FindConstraint(nValue);
  239. CXTPPropertyGridItem::SetValue(m_pConstraints->GetAt(nIndex));
  240. }
  241. void CXTPPropertyGridItemEnum::SetEnum(CXTPPropertyGridItemConstraint* pContraint)
  242. {
  243. m_nValue = (int)pContraint->m_dwData;
  244. if (m_pBindEnum)
  245. {
  246. *m_pBindEnum = m_nValue;
  247. }
  248. CXTPPropertyGridItem::SetValue(pContraint->m_strConstraint);
  249. }
  250. void CXTPPropertyGridItemEnum::BindToEnum(int* pBindEnum)
  251. {
  252. m_pBindEnum = pBindEnum;
  253. if (m_pBindEnum)
  254. {
  255. *m_pBindEnum = m_nValue;
  256. }
  257. }
  258. void CXTPPropertyGridItemEnum::OnBeforeInsert()
  259. {
  260. if (m_pBindEnum && *m_pBindEnum != m_nValue)
  261. {
  262. SetEnum(*m_pBindEnum);
  263. }
  264. }
  265. void CXTPPropertyGridItemEnum::OnConstraintsChanged()
  266. {
  267. if (m_strValue.IsEmpty())
  268. {
  269. int nIndex = m_pConstraints->FindConstraint(m_nValue);
  270. if (nIndex != -1)
  271. m_strDefaultValue = m_strValue = m_pConstraints->GetAt(nIndex);
  272. }
  273. }
  274. /////////////////////////////////////////////////////////////////////////////
  275. // CXTPPropertyGridItemFlags
  276. class CXTPPropertyGridItemFlags::CXTPPropertyGridItemFlag : public CXTPPropertyGridItemBool
  277. {
  278. public:
  279. CXTPPropertyGridItemFlag(CString strCaption, DWORD dwFlag)
  280. :  CXTPPropertyGridItemBool(strCaption), m_dwFlag(dwFlag)
  281. {
  282. }
  283. void OnValueChanged(CString strValue);
  284. virtual BOOL GetReadOnly() const
  285. {
  286. return m_pParent->GetReadOnly();
  287. }
  288. DWORD m_dwFlag;
  289. };
  290. void CXTPPropertyGridItemFlags::CXTPPropertyGridItemFlag::OnValueChanged(CString strValue)
  291. {
  292. SetValue(strValue);
  293. CXTPPropertyGridItemFlags* pParent = DYNAMIC_DOWNCAST(CXTPPropertyGridItemFlags, m_pParent);
  294. ASSERT(pParent);
  295. if (!pParent)
  296. return;
  297. if (GetBool())
  298. pParent->m_nValue |= m_dwFlag;
  299. else
  300. pParent->m_nValue &= ~m_dwFlag;
  301. pParent->OnValueChanged(pParent->GetFlagsString());
  302. }
  303. IMPLEMENT_DYNAMIC(CXTPPropertyGridItemFlags, CXTPPropertyGridItem)
  304. CXTPPropertyGridItemFlags::CXTPPropertyGridItemFlags(LPCTSTR strCaption, int nValue, int* pBindFlags)
  305. : CXTPPropertyGridItem(strCaption)
  306. {
  307. m_pBindFlags = pBindFlags;
  308. _Init(nValue);
  309. }
  310. CXTPPropertyGridItemFlags::CXTPPropertyGridItemFlags(UINT nID, int nValue, int* pBindFlags)
  311. : CXTPPropertyGridItem(nID)
  312. {
  313. m_pBindFlags = pBindFlags;
  314. _Init(nValue);
  315. }
  316. CXTPPropertyGridItemFlags::~CXTPPropertyGridItemFlags()
  317. {
  318. }
  319. void CXTPPropertyGridItemFlags::_Init(int nValue)
  320. {
  321. SetFlags(nValue);
  322. m_nFlags = xtpGridItemHasEdit;
  323. m_strDefaultValue = m_strValue;
  324. }
  325. BOOL CXTPPropertyGridItemFlags::HasFlag(const CString& strValue, CString strFlag) const
  326. {
  327. strFlag.MakeLower();
  328. int nIndex = -1;
  329. do
  330. {
  331. nIndex = FIND_S(strValue, strFlag, nIndex + 1);
  332. if (nIndex == -1)
  333. return FALSE;
  334. TCHAR chLast = nIndex + strFlag.GetLength() == strValue.GetLength() ? _T(']') : strValue[strFlag.GetLength() + nIndex];
  335. TCHAR chFirst = nIndex == 0 ? _T('[') : strValue[nIndex - 1];
  336. if ((chLast == ',' || chLast == ';' || chLast == ']')
  337. && (chFirst == ',' || chFirst == ';' || chFirst == '['))
  338. {
  339. return TRUE;
  340. }
  341. }
  342. while (nIndex != -1);
  343. return FALSE;
  344. }
  345. void CXTPPropertyGridItemFlags::SetValue(CString strValue)
  346. {
  347. int nValue = 0;
  348. strValue.MakeLower();
  349. CXTPPropertyGridItemConstraints* pConstraints = GetConstraints();
  350. for (int i = 0; i < pConstraints->GetCount(); i++)
  351. {
  352. if (HasFlag(strValue, pConstraints->GetAt(i)))
  353. nValue |= pConstraints->GetConstraintAt(i)->m_dwData;
  354. }
  355. SetFlags(nValue);
  356. }
  357. void CXTPPropertyGridItemFlags::SetFlags(int nValue)
  358. {
  359. m_nValue = nValue;
  360. if (m_pBindFlags)
  361. {
  362. *m_pBindFlags = nValue;
  363. }
  364. UpdateChilds();
  365. CXTPPropertyGridItem::SetValue(GetFlagsString());
  366. }
  367. void CXTPPropertyGridItemFlags::BindToFlags(int* pBindFlags)
  368. {
  369. m_pBindFlags = pBindFlags;
  370. if (m_pBindFlags)
  371. {
  372. *m_pBindFlags = m_nValue;
  373. }
  374. }
  375. CString CXTPPropertyGridItemFlags::GetFlagsString()
  376. {
  377. CString str;
  378. CXTPPropertyGridItemConstraints* pConstraints = GetConstraints();
  379. int nValue = 0;
  380. for (int i = 0; i < pConstraints->GetCount(); i++)
  381. {
  382. CXTPPropertyGridItemConstraint* pConstraint = pConstraints->GetConstraintAt(i);
  383. if ((nValue & pConstraint->m_dwData) == pConstraint->m_dwData)
  384. continue;
  385. if ((m_nValue & pConstraint->m_dwData) == pConstraint->m_dwData)
  386. {
  387. str += (str.IsEmpty() ? _T("") : _T(";")) + pConstraint->m_strConstraint;
  388. nValue |= pConstraint->m_dwData;
  389. }
  390. }
  391. return  _T("[") + str + _T("]");
  392. }
  393. void CXTPPropertyGridItemFlags::UpdateChilds()
  394. {
  395. CXTPPropertyGridItems* pItems = GetChilds();
  396. for (int i = 0; i < pItems->GetCount(); i++)
  397. {
  398. CXTPPropertyGridItemFlag* pItem = (CXTPPropertyGridItemFlag*)pItems->GetAt(i);
  399. pItem->SetBool((m_nValue & pItem->m_dwFlag) == pItem->m_dwFlag);
  400. pItem->SetReadOnly(GetReadOnly());
  401. }
  402. }
  403. void CXTPPropertyGridItemFlags::OnBeforeInsert()
  404. {
  405. if (m_pBindFlags && *m_pBindFlags != m_nValue)
  406. {
  407. SetFlags(*m_pBindFlags);
  408. }
  409. }
  410. void CXTPPropertyGridItemFlags::OnConstraintsChanged()
  411. {
  412. GetChilds()->Clear();
  413. CXTPPropertyGridItemConstraints* pConstraints = GetConstraints();
  414. int i;
  415. for (i = 0; i < pConstraints->GetCount(); i++)
  416. {
  417. AddChildItem(new CXTPPropertyGridItemFlag(pConstraints->GetAt(i), (int)pConstraints->GetConstraintAt(i)->m_dwData));
  418. }
  419. UpdateChilds();
  420. m_strDefaultValue = m_strValue = GetFlagsString();
  421. CXTPPropertyGridItems* pItems = GetChilds();
  422. for (i = 0; i < pItems->GetCount(); i++)
  423. {
  424. CXTPPropertyGridItemFlag* pItem = (CXTPPropertyGridItemFlag*)pItems->GetAt(i);
  425. pItem->SetDefaultValue(pItem->GetValue());
  426. }
  427. }
  428. void CXTPPropertyGridItemFlags::SetReadOnly(BOOL bReadOnly)
  429. {
  430. CXTPPropertyGridItem::SetReadOnly(bReadOnly);
  431. UpdateChilds();
  432. }