BCGPPropList.cpp
上传用户:cnlanbo1
上传日期:2009-08-06
资源大小:19862k
文件大小:136k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // This is a part of the BCGControlBar Library
  5. // Copyright (C) 1998-2008 BCGSoft Ltd.
  6. // All rights reserved.
  7. //
  8. // This source code can be used, distributed or modified
  9. // only under terms and conditions 
  10. // of the accompanying license agreement.
  11. //*******************************************************************************
  12. //
  13. // BCGPPropList.cpp : implementation file
  14. //
  15. #include "stdafx.h"
  16. #include "bcgcbpro.h"
  17. #include "BCGPPropList.h"
  18. #ifndef BCGP_EXCLUDE_PROP_LIST
  19. #ifndef _BCGPGRID_STANDALONE
  20. #include "BCGPColorBar.h"
  21. #include "BCGPWorkspace.h"
  22. #include "BCGPShellManager.h"
  23. #include "MenuImages.h"
  24. #include "BCGPVisualManager.h"
  25. #include "BCGPToolbarComboBoxButton.h"
  26. #include "BCGPPopupMenu.h"
  27. #else
  28. #include "BCGPGridVisualManager.h"
  29. #endif
  30. #include "BCGPDrawManager.h"
  31. #include "BCGPMaskEdit.h"
  32. #include "BCGPSpinButtonCtrl.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. #define ID_HEADER 1
  39. #define ID_SCROLL_VERT 2
  40. #define STRETCH_DELTA 2
  41. #define TEXT_MARGIN 4
  42. #define UM_UPDATESPIN (WM_USER + 101)
  43. #ifndef _BCGPGRID_STANDALONE
  44. extern CBCGPWorkspace* g_pWorkspace;
  45. #define visualManager CBCGPVisualManager::GetInstance ()
  46. #else
  47. #define visualManager CBCGPGridVisualManager::GetInstance ()
  48. #endif
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CBCGPProp
  51. IMPLEMENT_DYNAMIC(CBCGPProp, CObject)
  52. #define PROP_HAS_LIST 0x0001
  53. #define PROP_HAS_BUTTON 0x0002
  54. #define PROP_HAS_SPIN 0x0004
  55. CString CBCGPProp::m_strFormatChar = _T("%c");
  56. CString CBCGPProp::m_strFormatShort = _T("%d");
  57. CString CBCGPProp::m_strFormatLong = _T("%ld");
  58. CString CBCGPProp::m_strFormatUShort = _T("%u");
  59. CString CBCGPProp::m_strFormatULong = _T("%u");
  60. CString CBCGPProp::m_strFormatFloat = _T("%f");
  61. CString CBCGPProp::m_strFormatDouble = _T("%lf");
  62. CBCGPProp::CBCGPProp(const CString& strName, const _variant_t& varValue, 
  63.    LPCTSTR lpszDescr, DWORD_PTR dwData, LPCTSTR lpszEditMask,
  64.    LPCTSTR lpszEditTemplate, LPCTSTR lpszValidChars) :
  65. m_strName (strName),
  66. m_varValue (varValue),
  67. m_varValueOrig (varValue),
  68. m_strDescr (lpszDescr == NULL ? _T("") : lpszDescr),
  69. m_strEditMask (lpszEditMask == NULL ? _T("") : lpszEditMask),
  70. m_strEditTempl (lpszEditTemplate == NULL ? _T("") : lpszEditTemplate),
  71. m_strValidChars (lpszValidChars == NULL ? _T("") : lpszValidChars),
  72. m_dwData (dwData)
  73. {
  74. m_bGroup = FALSE;
  75. m_bIsValueList = FALSE;
  76. Init ();
  77. SetFlags ();
  78. if (m_varValue.vt == VT_BOOL)
  79. {
  80. m_bAllowEdit = FALSE;
  81. }
  82. }
  83. //******************************************************************************************
  84. CBCGPProp::CBCGPProp(const CString& strGroupName, DWORD_PTR dwData,
  85.  BOOL bIsValueList) :
  86. m_strName (strGroupName),
  87. m_dwData (dwData),
  88. m_bIsValueList (bIsValueList)
  89. {
  90. m_bGroup = TRUE;
  91. Init ();
  92. SetFlags ();
  93. }
  94. //****************************************************************************************
  95. void CBCGPProp::SetFlags ()
  96. {
  97. m_dwFlags = 0;
  98. switch (m_varValue.vt)
  99. {
  100. case VT_BSTR:
  101. case VT_R4:
  102. case VT_R8:
  103. case VT_UI1:
  104. case VT_I2:
  105. case VT_I4:
  106. case VT_INT:
  107. case VT_UINT:
  108. case VT_UI2:
  109. case VT_UI4:
  110. break;
  111. case VT_DATE:
  112. break;
  113.     case VT_BOOL:
  114. m_dwFlags = PROP_HAS_LIST;
  115. break;
  116. default:
  117. break;
  118. }
  119. }
  120. //******************************************************************************************
  121. void CBCGPProp::Init ()
  122. {
  123. m_pWndList = NULL;
  124. m_bExpanded = !m_bIsValueList;
  125. m_bEnabled = TRUE;
  126. m_pParent = NULL;
  127. m_pWndInPlace = NULL;
  128. m_pWndCombo = NULL;
  129. m_pWndSpin = NULL;
  130. m_bInPlaceEdit = FALSE;
  131. m_bButtonIsFocused = FALSE;
  132. m_bButtonIsDown = FALSE;
  133. m_bAllowEdit = TRUE;
  134. m_bNameIsTrancated = FALSE;
  135. m_bValueIsTrancated = FALSE;
  136. m_Rect.SetRectEmpty ();
  137. m_rectButton.SetRectEmpty ();
  138. m_nMinValue = 0;
  139. m_nMaxValue = 0;
  140. m_bIsModified = FALSE;
  141. m_bIsVisible = TRUE;
  142. }
  143. //*******************************************************************************************
  144. CBCGPProp::~CBCGPProp()
  145. {
  146. while (!m_lstSubItems.IsEmpty ())
  147. {
  148. delete m_lstSubItems.RemoveHead ();
  149. }
  150. OnDestroyWindow ();
  151. }
  152. //******************************************************************************************
  153. void CBCGPProp::OnDestroyWindow ()
  154. {
  155. if (m_pWndCombo != NULL)
  156. {
  157. m_pWndCombo->DestroyWindow ();
  158. delete m_pWndCombo;
  159. m_pWndCombo = NULL;
  160. }
  161. if (m_pWndInPlace != NULL)
  162. {
  163. m_pWndInPlace->DestroyWindow ();
  164. delete m_pWndInPlace;
  165. m_pWndInPlace = NULL;
  166. }
  167. if (m_pWndSpin != NULL)
  168. {
  169. m_pWndSpin->DestroyWindow ();
  170. delete m_pWndSpin;
  171. m_pWndSpin = NULL;
  172. }
  173. if (m_varValue.vt == VT_BOOL)
  174. {
  175. m_lstOptions.RemoveAll ();
  176. }
  177. }
  178. //****************************************************************************************
  179. BOOL CBCGPProp::HasButton () const
  180. {
  181. return (m_dwFlags & PROP_HAS_LIST) ||
  182. (m_dwFlags & PROP_HAS_BUTTON);
  183. }
  184. //****************************************************************************************
  185. BOOL CBCGPProp::AddSubItem (CBCGPProp* pProp)
  186. {
  187. ASSERT_VALID (this);
  188. ASSERT_VALID (pProp);
  189. if (!IsGroup ())
  190. {
  191. ASSERT(FALSE);
  192. return FALSE;
  193. }
  194. if (pProp->m_pWndList != NULL)
  195. {
  196. for (POSITION pos = pProp->m_pWndList->m_lstProps.GetHeadPosition (); pos != NULL;)
  197. {
  198. CBCGPProp* pListProp = pProp->m_pWndList->m_lstProps.GetNext (pos);
  199. ASSERT_VALID (pListProp);
  200. if (pListProp == pProp || pListProp->IsSubItem (pProp))
  201. {
  202. // Can't ad the same property twice
  203. ASSERT (FALSE);
  204. return FALSE;
  205. }
  206. }
  207. }
  208. pProp->m_pParent = this;
  209. m_lstSubItems.AddTail (pProp);
  210. pProp->m_pWndList = m_pWndList;
  211. return TRUE;
  212. }
  213. //*******************************************************************************************
  214. BOOL CBCGPProp::RemoveSubItem (CBCGPProp*& pProp, BOOL bDelete/* = TRUE*/)
  215. {
  216. ASSERT_VALID (this);
  217. ASSERT_VALID (pProp);
  218. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  219. {
  220. POSITION posSaved = pos;
  221. CBCGPProp* pListProp = m_lstSubItems.GetNext (pos);
  222. ASSERT_VALID (pListProp);
  223. if (pListProp == pProp)
  224. {
  225. m_lstSubItems.RemoveAt (posSaved);
  226. if (m_pWndList != NULL && m_pWndList->m_pSel == pProp)
  227. {
  228. m_pWndList->m_pSel = NULL;
  229. }
  230. if (bDelete)
  231. {
  232. delete pProp;
  233. pProp = NULL;
  234. }
  235. return TRUE;
  236. }
  237. if (pListProp->RemoveSubItem (pProp, bDelete))
  238. {
  239. return TRUE;
  240. }
  241. }
  242. return FALSE;
  243. }
  244. //*******************************************************************************************
  245. BOOL CBCGPProp::AddOption (LPCTSTR lpszOption, BOOL bInsertUnique/* = TRUE*/)
  246. {
  247. ASSERT_VALID (this);
  248. ASSERT (lpszOption != NULL);
  249. if (bInsertUnique)
  250. {
  251.   if (m_lstOptions.Find (lpszOption) != NULL)
  252. {
  253. return FALSE;
  254. }
  255. }
  256. m_lstOptions.AddTail (lpszOption);
  257. m_dwFlags = PROP_HAS_LIST;
  258. return TRUE;
  259. }
  260. //****************************************************************************************
  261. BOOL CBCGPPropList::DeleteProperty (CBCGPProp*& pProp, BOOL bRedraw, BOOL bAdjustLayout)
  262. {
  263. ASSERT_VALID (this);
  264. ASSERT_VALID (pProp);
  265. BOOL bFound = FALSE;
  266. for (POSITION pos = m_lstProps.GetHeadPosition (); pos != NULL;)
  267. {
  268. POSITION posSaved = pos;
  269. CBCGPProp* pListProp = m_lstProps.GetNext (pos);
  270. ASSERT_VALID (pListProp);
  271. if (pListProp == pProp) // Top level property
  272. {
  273. bFound = TRUE;
  274. m_lstProps.RemoveAt (posSaved);
  275. break;
  276. }
  277. if (pListProp->RemoveSubItem (pProp, FALSE))
  278. {
  279. bFound = TRUE;
  280. break;
  281. }
  282. }
  283. if (!bFound)
  284. {
  285. return FALSE;
  286. }
  287. if (m_pSel == pProp)
  288. {
  289. m_pSel = NULL;
  290. }
  291. delete pProp;
  292. pProp = NULL;
  293. if (bAdjustLayout)
  294. {
  295. AdjustLayout ();
  296. if (bRedraw && GetSafeHwnd () != NULL)
  297. {
  298. RedrawWindow ();
  299. }
  300. }
  301. return TRUE;
  302. }
  303. //*****************************************************************************************
  304. void CBCGPProp::RemoveAllOptions ()
  305. {
  306. ASSERT_VALID (this);
  307. m_lstOptions.RemoveAll ();
  308. m_dwFlags = 0;
  309. }
  310. //****************************************************************************************
  311. int CBCGPProp::GetOptionCount () const
  312. {
  313. ASSERT_VALID (this);
  314. return (int) m_lstOptions.GetCount ();
  315. }
  316. //****************************************************************************************
  317. LPCTSTR CBCGPProp::GetOption (int nIndex) const
  318. {
  319. ASSERT_VALID (this);
  320. if (nIndex < 0 || nIndex >= m_lstOptions.GetCount ())
  321. {
  322. ASSERT (FALSE);
  323. return NULL;
  324. }
  325. POSITION pos = m_lstOptions.FindIndex (nIndex);
  326. if (pos == NULL)
  327. {
  328. ASSERT (FALSE);
  329. return NULL;
  330. }
  331. return m_lstOptions.GetAt (pos);
  332. }
  333. //*****************************************************************************************
  334. int CBCGPProp::GetExpandedSubItems (BOOL bIncludeHidden) const
  335. {
  336. ASSERT_VALID (this);
  337. if (!m_bExpanded)
  338. {
  339. return 0;
  340. }
  341. int nCount = 0;
  342. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  343. {
  344. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  345. ASSERT_VALID (pProp);
  346. if (bIncludeHidden || pProp->IsVisible ())
  347. {
  348. nCount += pProp->GetExpandedSubItems (bIncludeHidden) + 1;
  349. }
  350. }
  351. return nCount;
  352. }
  353. //*******************************************************************************************
  354. CBCGPProp* CBCGPProp::HitTest (CPoint point, ClickArea* pnArea)
  355. {
  356. ASSERT_VALID (this);
  357. ASSERT_VALID (m_pWndList);
  358. if (m_Rect.PtInRect (point))
  359. {
  360. if (pnArea != NULL)
  361. {
  362. if (IsGroup () && point.x < m_Rect.left + m_Rect.Height ())
  363. {
  364. *pnArea = ClickExpandBox;
  365. }
  366. else if (HasValueField () && 
  367. point.x > m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth)
  368. {
  369. *pnArea = ClickValue;
  370. }
  371. else
  372. {
  373. *pnArea = ClickName;
  374. }
  375. }
  376. return this;
  377. }
  378. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  379. {
  380. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  381. ASSERT_VALID (pProp);
  382. CBCGPProp* pHit = pProp->HitTest (point, pnArea);
  383. if (pHit != NULL)
  384. {
  385. return pHit;
  386. }
  387. }
  388. return NULL;
  389. }
  390. //*******************************************************************************************
  391. void CBCGPProp::Expand (BOOL bExpand)
  392. {
  393. ASSERT_VALID (this);
  394. ASSERT (IsGroup ());
  395. if (m_bExpanded == bExpand ||
  396. m_lstSubItems.IsEmpty ())
  397. {
  398. return;
  399. }
  400. m_bExpanded = bExpand;
  401. if (m_pWndList != NULL && m_pWndList->GetSafeHwnd () != NULL)
  402. {
  403. ASSERT_VALID (m_pWndList);
  404. m_pWndList->AdjustLayout ();
  405. CRect rectRedraw = m_pWndList->m_rectList;
  406. rectRedraw.top = m_Rect.top;
  407. m_pWndList->RedrawWindow (rectRedraw);
  408. }
  409. }
  410. //*******************************************************************************************
  411. void CBCGPProp::ExpandDeep (BOOL bExpand)
  412. {
  413. ASSERT_VALID (this);
  414. m_bExpanded = bExpand;
  415. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  416. {
  417. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  418. ASSERT_VALID (pProp);
  419. pProp->ExpandDeep (bExpand);
  420. }
  421. }
  422. //*******************************************************************************************
  423. void CBCGPProp::ResetOriginalValue ()
  424. {
  425. ASSERT_VALID (this);
  426. m_bIsModified = FALSE;
  427. SetValue (m_varValueOrig);
  428. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  429. {
  430. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  431. ASSERT_VALID (pProp);
  432. pProp->ResetOriginalValue ();
  433. }
  434. }
  435. //*******************************************************************************************
  436. void CBCGPProp::CommitModifiedValue ()
  437. {
  438. ASSERT_VALID (this);
  439. m_bIsModified = FALSE;
  440. SetOriginalValue (m_varValue);
  441. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  442. {
  443. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  444. ASSERT_VALID (pProp);
  445. pProp->CommitModifiedValue ();
  446. }
  447. }
  448. //*******************************************************************************************
  449. void CBCGPProp::Redraw ()
  450. {
  451. ASSERT_VALID (this);
  452. if (m_pWndList != NULL)
  453. {
  454. ASSERT_VALID (m_pWndList);
  455. m_pWndList->InvalidateRect (m_Rect);
  456. if (m_pParent != NULL && m_pParent->m_bIsValueList)
  457. {
  458. m_pWndList->InvalidateRect (m_pParent->m_Rect);
  459. }
  460. if (m_bIsValueList)
  461. {
  462. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  463. {
  464. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  465. ASSERT_VALID (pProp);
  466. m_pWndList->InvalidateRect (pProp->m_Rect);
  467. }
  468. }
  469. m_pWndList->UpdateWindow ();
  470. }
  471. }
  472. //*******************************************************************************************
  473. void CBCGPProp::EnableSpinControl (BOOL bEnable, int nMin, int nMax)
  474. {
  475. ASSERT_VALID (this);
  476. switch (m_varValue.vt)
  477. {
  478. case VT_INT:
  479. case VT_UINT:
  480.     case VT_I2:
  481. case VT_I4:
  482.     case VT_UI2:
  483. case VT_UI4:
  484. break;
  485. default:
  486. ASSERT (FALSE);
  487. return;
  488. }
  489. m_nMinValue = nMin;
  490. m_nMaxValue = nMax;
  491. if (bEnable)
  492. {
  493. m_dwFlags |= PROP_HAS_SPIN;
  494. }
  495. else
  496. {
  497. m_dwFlags &= ~PROP_HAS_SPIN;
  498. }
  499. }
  500. //*******************************************************************************************
  501. BOOL CBCGPProp::IsSelected () const
  502. {
  503. ASSERT_VALID (this);
  504. ASSERT_VALID (m_pWndList);
  505. return m_pWndList->m_pSel == this;
  506. }
  507. //******************************************************************************************
  508. void CBCGPProp::SetName (LPCTSTR lpszName, BOOL bRedraw)
  509. {
  510. ASSERT_VALID (this);
  511. if (lpszName == NULL)
  512. {
  513. ASSERT (FALSE);
  514. return;
  515. }
  516. m_strName = lpszName;
  517. if (bRedraw)
  518. {
  519. Redraw ();
  520. }
  521. }
  522. //******************************************************************************************
  523. void CBCGPProp::SetValue (const _variant_t& varValue)
  524. {
  525. ASSERT_VALID (this);
  526. if (m_varValue.vt != VT_EMPTY && m_varValue.vt != varValue.vt)
  527. {
  528. ASSERT (FALSE);
  529. return;
  530. }
  531. BOOL bInPlaceEdit = m_bInPlaceEdit;
  532. if (bInPlaceEdit)
  533. {
  534. OnEndEdit ();
  535. }
  536. m_varValue = varValue;
  537. Redraw ();
  538. if (bInPlaceEdit)
  539. {
  540. ASSERT_VALID (m_pWndList);
  541. m_pWndList->EditItem (this);
  542. }
  543. }
  544. //*****************************************************************************************
  545. void CBCGPProp::SetOriginalValue (const _variant_t& varValue)
  546. {
  547. ASSERT_VALID (this);
  548. if (m_varValueOrig.vt != VT_EMPTY && m_varValueOrig.vt != varValue.vt)
  549. {
  550. ASSERT (FALSE);
  551. return;
  552. }
  553. m_varValueOrig = varValue;
  554. }
  555. //*****************************************************************************************
  556. BOOL CBCGPProp::IsParentExpanded () const
  557. {
  558. ASSERT_VALID (this);
  559. for (CBCGPProp* pProp = m_pParent; pProp != NULL;)
  560. {
  561. ASSERT_VALID (pProp);
  562. if (!pProp->IsExpanded ())
  563. {
  564. return FALSE;
  565. }
  566. pProp = pProp->m_pParent;
  567. }
  568. return TRUE;
  569. }
  570. //******************************************************************************************
  571. int CBCGPProp::GetHierarchyLevel () const
  572. {
  573. ASSERT_VALID (this);
  574. int nLevel = 0;
  575. for (CBCGPProp* pParent = m_pParent; pParent != NULL;
  576. pParent = pParent->m_pParent)
  577. {
  578. nLevel++;
  579. }
  580. return nLevel;
  581. }
  582. //*******************************************************************************************
  583. CBCGPProp* CBCGPProp::GetSubItem (int nIndex) const
  584. {
  585. ASSERT_VALID (this);
  586. if (nIndex < 0 || nIndex >= m_lstSubItems.GetCount ())
  587. {
  588. ASSERT (FALSE);
  589. return NULL;
  590. }
  591. return m_lstSubItems.GetAt (m_lstSubItems.FindIndex (nIndex));
  592. }
  593. //*******************************************************************************************
  594. void CBCGPProp::Enable (BOOL bEnable/* = TRUE*/)
  595. {
  596. ASSERT_VALID (this);
  597. if (m_bEnabled != bEnable)
  598. {
  599. m_bEnabled = bEnable;
  600. if (m_pWndList->GetSafeHwnd () != NULL)
  601. {
  602. ASSERT_VALID (m_pWndList);
  603. m_pWndList->InvalidateRect (m_Rect);
  604. }
  605. }
  606. }
  607. //*******************************************************************************************
  608. void CBCGPProp::SetOwnerList (CBCGPPropList* pWndList)
  609. {
  610. ASSERT_VALID (this);
  611. ASSERT_VALID (pWndList);
  612. m_pWndList = pWndList;
  613. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  614. {
  615. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  616. ASSERT_VALID (pProp);
  617. pProp->SetOwnerList (m_pWndList);
  618. }
  619. }
  620. //*******************************************************************************************
  621. void CBCGPProp::Repos (int& y)
  622. {
  623. ASSERT_VALID (this);
  624. ASSERT_VALID (m_pWndList);
  625. CRect rectOld = m_Rect;
  626. BOOL bShowProperty = m_bIsVisible && (IsParentExpanded () || m_pWndList->m_bAlphabeticMode);
  627. if (m_pWndList->m_bAlphabeticMode && m_pParent != NULL &&
  628. m_pParent->m_bIsValueList && !IsParentExpanded ())
  629. {
  630. bShowProperty = FALSE;
  631. }
  632. if (bShowProperty)
  633. {
  634. int dx = m_pWndList->m_bAlphabeticMode ?
  635. m_pWndList->m_nRowHeight :
  636. GetHierarchyLevel () * m_pWndList->m_nRowHeight;
  637. if (m_pWndList->m_bAlphabeticMode && m_bIsValueList)
  638. {
  639. dx = 0;
  640. }
  641. m_Rect = CRect (
  642. m_pWndList->m_rectList.left + dx,
  643. y, 
  644. m_pWndList->m_rectList.right, 
  645. y + m_pWndList->m_nRowHeight);
  646. if (!m_rectButton.IsRectEmpty ())
  647. {
  648. m_rectButton.top = m_Rect.top + 1;
  649. m_rectButton.bottom = m_Rect.bottom;
  650. }
  651. y += m_pWndList->m_nRowHeight;
  652. CRect rectName = m_Rect;
  653. rectName.right = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth;
  654. if (IsWindow (m_pWndList->m_ToolTip.GetSafeHwnd ()))
  655. {
  656. m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectName, m_pWndList->m_nTooltipsCount + 1);
  657. m_pWndList->m_nTooltipsCount ++;
  658. if (!IsGroup ())
  659. {
  660. CRect rectValue = m_Rect;
  661. rectValue.left = rectName.right + 1;
  662. m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectValue, m_pWndList->m_nTooltipsCount + 1);
  663. m_pWndList->m_nTooltipsCount ++;
  664. }
  665. }
  666. }
  667. else
  668. {
  669. m_Rect.SetRectEmpty ();
  670. m_rectButton.SetRectEmpty ();
  671. }
  672. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  673. {
  674. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  675. ASSERT_VALID (pProp);
  676. pProp->Repos (y);
  677. }
  678. OnPosSizeChanged (rectOld);
  679. }
  680. //******************************************************************************************
  681. void CBCGPProp::AddTerminalProp (CList<CBCGPProp*, CBCGPProp*>& lstProps)
  682. {
  683. ASSERT_VALID (this);
  684. if (!m_bGroup || m_bIsValueList)
  685. {
  686. // Insert sorted:
  687. BOOL bInserted = FALSE;
  688. for (POSITION pos = lstProps.GetHeadPosition (); !bInserted && pos != NULL;)
  689. {
  690. POSITION posSave = pos;
  691. CBCGPProp* pProp = lstProps.GetNext (pos);
  692. if (m_pWndList->CompareProps (pProp, this) > 0)
  693. {
  694. lstProps.InsertBefore (posSave, this);
  695. bInserted = TRUE;
  696. }
  697. }
  698. if (!bInserted)
  699. {
  700. lstProps.AddTail (this);
  701. }
  702. return;
  703. }
  704. m_Rect.SetRectEmpty ();
  705. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  706. {
  707. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  708. ASSERT_VALID (pProp);
  709. pProp->AddTerminalProp (lstProps);
  710. }
  711. }
  712. //****************************************************************************************
  713. BOOL CBCGPProp::IsSubItem (CBCGPProp* pSubProp) const
  714. {
  715. ASSERT_VALID (this);
  716. ASSERT_VALID (pSubProp);
  717. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  718. {
  719. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  720. ASSERT_VALID (pProp);
  721. if (pSubProp == pProp || pProp->IsSubItem (pSubProp))
  722. {
  723. return TRUE;
  724. }
  725. }
  726. return FALSE;
  727. }
  728. //******************************************************************************************
  729. CBCGPProp* CBCGPProp::FindSubItemByData (DWORD_PTR dwData) const
  730. {
  731. ASSERT_VALID (this);
  732. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  733. {
  734. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  735.         ASSERT_VALID (pProp);
  736.         if (pProp->m_dwData == dwData)
  737.         {
  738. return pProp;
  739. }
  740. pProp = pProp->FindSubItemByData (dwData);
  741. if (pProp != NULL)
  742. {
  743. return pProp;
  744.         }
  745.     }
  746. return NULL;
  747. }
  748. //*****************************************************************************************
  749. CString CBCGPProp::FormatProperty ()
  750. {
  751. ASSERT_VALID (this);
  752. ASSERT_VALID (m_pWndList);
  753. _variant_t& var = m_varValue;
  754. CString strVal;
  755. if (m_bIsValueList)
  756. {
  757. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  758. {
  759. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  760. ASSERT_VALID (pProp);
  761. strVal += pProp->FormatProperty ();
  762. if (pos != NULL)
  763. {
  764. strVal += m_pWndList->m_cListDelimeter;
  765. strVal += _T(' ');
  766. }
  767. }
  768. return strVal;
  769. }
  770. switch (var.vt)
  771. {
  772. case VT_BSTR:
  773. strVal = (LPCTSTR)(_bstr_t)var;
  774. break;
  775.     case VT_I2:
  776. strVal.Format (m_strFormatShort, (short) var);
  777. break;
  778. case VT_I4:
  779. case VT_INT:
  780. strVal.Format (m_strFormatLong, (long) var);
  781. break;
  782. case VT_UI1:
  783. if ((BYTE) var != 0)
  784. {
  785. strVal.Format (m_strFormatChar, (TCHAR)(BYTE) var);
  786. }
  787. break;
  788.     case VT_UI2:
  789. strVal.Format( m_strFormatUShort, var.uiVal);
  790. break;
  791. case VT_UINT:
  792. case VT_UI4:
  793. strVal.Format (m_strFormatULong, var.ulVal);
  794. break;
  795.     case VT_R4:
  796. strVal.Format (m_strFormatFloat, (float) var);
  797. break;
  798.     case VT_R8:
  799. strVal.Format (m_strFormatDouble, (double) var);
  800. break;
  801.     case VT_BOOL:
  802. {
  803. bool bVal = (bool) var;
  804. strVal = bVal ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;
  805. }
  806. break;
  807. default:
  808. // Unsupported type
  809. strVal = _T("*** error ***");
  810. }
  811. return strVal;
  812. }
  813. //****************************************************************************************
  814. void CBCGPProp::OnDrawName (CDC* pDC, CRect rect)
  815. {
  816. ASSERT_VALID (this);
  817. ASSERT_VALID (pDC);
  818. ASSERT_VALID (m_pWndList);
  819. COLORREF clrTextOld = (COLORREF)-1;
  820. if (IsSelected () && (!m_pWndList->m_bVSDotNetLook || !IsGroup () ||  m_bIsValueList))
  821. {
  822. CRect rectFill = rect;
  823. rectFill.top++;
  824. if (!m_pWndList->m_bFocused)
  825. {
  826. clrTextOld = pDC->SetTextColor (globalData.clrBtnText);
  827. pDC->FillRect (rectFill, 
  828. m_pWndList->DrawControlBarColors () ? &globalData.brBarFace : &globalData.brBtnFace);
  829. }
  830. else
  831. {
  832. clrTextOld = pDC->SetTextColor (globalData.clrTextHilite);
  833. pDC->FillRect (rectFill, &globalData.brHilite);
  834. }
  835. }
  836. if (m_pWndList->m_bVSDotNetLook && IsGroup () && !m_bIsValueList)
  837. {
  838. if (m_pWndList->m_clrGroupText != (COLORREF)-1)
  839. {
  840. clrTextOld = pDC->SetTextColor (m_pWndList->m_clrGroupText);
  841. }
  842. else
  843. {
  844. clrTextOld = pDC->SetTextColor (visualManager->GetPropListGroupTextColor (m_pWndList));
  845. }
  846. }
  847. if (m_pParent != NULL && m_pParent->m_bIsValueList)
  848. {
  849. rect.left += rect.Height ();
  850. }
  851. rect.DeflateRect (TEXT_MARGIN, 0);
  852. int nTextHeight = pDC->DrawText (m_strName, rect, 
  853. DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
  854. m_bNameIsTrancated = pDC->GetTextExtent (m_strName).cx > rect.Width ();
  855. if (IsSelected () && m_pWndList->m_bVSDotNetLook && IsGroup () && !m_bIsValueList)
  856. {
  857. CRect rectFocus = rect;
  858. rectFocus.top = rectFocus.CenterPoint ().y - nTextHeight / 2;
  859. rectFocus.bottom = rectFocus.top + nTextHeight;
  860. rectFocus.right = 
  861. min (rect.right, rectFocus.left + pDC->GetTextExtent (m_strName).cx);
  862. rectFocus.InflateRect (2, 0);
  863. COLORREF clrShadow = m_pWndList->DrawControlBarColors () ?
  864. globalData.clrBarShadow : globalData.clrBtnShadow;
  865. pDC->Draw3dRect (rectFocus, clrShadow, clrShadow);
  866. }
  867. if (clrTextOld != (COLORREF)-1)
  868. {
  869. pDC->SetTextColor (clrTextOld);
  870. }
  871. }
  872. //******************************************************************************************
  873. void CBCGPProp::OnDrawValue (CDC* pDC, CRect rect)
  874. {
  875. ASSERT_VALID (this);
  876. ASSERT_VALID (pDC);
  877. ASSERT_VALID (m_pWndList);
  878. if ((IsGroup () && !m_bIsValueList) || !HasValueField ())
  879. {
  880. return;
  881. }
  882. CFont* pOldFont = NULL;
  883. if (IsModified () && m_pWndList->m_bMarkModifiedProperties)
  884. {
  885. pOldFont = pDC->SelectObject (&m_pWndList->m_fontBold);
  886. }
  887. CString strVal = FormatProperty ();
  888. rect.DeflateRect (TEXT_MARGIN, 0);
  889. pDC->DrawText (strVal, rect, 
  890. DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
  891. m_bValueIsTrancated = pDC->GetTextExtent (strVal).cx > rect.Width ();
  892. if (pOldFont != NULL)
  893. {
  894. pDC->SelectObject (pOldFont);
  895. }
  896. }
  897. //******************************************************************************************
  898. void CBCGPProp::OnDrawButton (CDC* pDC, CRect rect)
  899. {
  900. ASSERT_VALID (this);
  901. ASSERT_VALID (pDC);
  902. ASSERT_VALID (m_pWndList);
  903. CBCGPToolbarComboBoxButton button;
  904. pDC->FillRect (rect, m_pWndList->DrawControlBarColors () ?
  905. &globalData.brBarFace : &globalData.brBtnFace);
  906. if (m_dwFlags & PROP_HAS_LIST)
  907. {
  908. visualManager->OnDrawComboDropButton (pDC,
  909. rect, !m_bEnabled, m_bButtonIsDown, m_bButtonIsDown, &button);
  910. return;
  911. }
  912. CString str = _T("...");
  913. pDC->DrawText (str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  914. #ifndef _BCGPGRID_STANDALONE
  915. CBCGPVisualManager::BCGBUTTON_STATE state = 
  916. m_bButtonIsDown ?
  917. CBCGPVisualManager::ButtonsIsPressed :
  918. CBCGPVisualManager::ButtonsIsRegular;
  919. visualManager->OnDrawButtonBorder (pDC, &button, rect, state);
  920. #else
  921. COLORREF colorBorder = globalData.IsHighContastMode () ?
  922. globalData.clrBtnDkShadow : globalData.clrHilite;
  923. pDC->Draw3dRect (rect, colorBorder, colorBorder);
  924. #endif
  925. if (m_bButtonIsFocused)
  926. {
  927. CRect rectFocus = rect;
  928. rectFocus.DeflateRect (2, 2);
  929. pDC->DrawFocusRect (rectFocus);
  930. }
  931. }
  932. //****************************************************************************************
  933. void CBCGPProp::OnDrawExpandBox (CDC* pDC, CRect rect)
  934. {
  935. ASSERT_VALID (this);
  936. ASSERT_VALID (pDC);
  937. ASSERT_VALID (m_pWndList);
  938. ASSERT (IsGroup ());
  939. CPoint ptCenter = rect.CenterPoint ();
  940. int nBoxSize = min (9, rect.Width ());
  941. rect = CRect (ptCenter, CSize (1, 1));
  942. rect.InflateRect (nBoxSize / 2, nBoxSize / 2);
  943. if (m_bIsValueList)
  944. {
  945. if (m_pWndList->m_brBackground.GetSafeHandle () != NULL)
  946. {
  947. pDC->FillRect (rect, &m_pWndList->m_brBackground);
  948. }
  949. else
  950. {
  951. pDC->FillRect (rect, &globalData.brWindow);
  952. }
  953. }
  954. COLORREF clrShadow = m_pWndList->DrawControlBarColors () ? 
  955. globalData.clrBarShadow : globalData.clrBtnShadow;
  956. COLORREF clrText = m_pWndList->DrawControlBarColors () ? 
  957. globalData.clrBarText : globalData.clrBtnText;
  958. visualManager->OnDrawExpandingBox (pDC, rect, 
  959. m_bExpanded && !m_lstSubItems.IsEmpty (),
  960. m_pWndList->m_bVSDotNetLook ? clrText : clrShadow);
  961. }
  962. //******************************************************************************************
  963. void CBCGPProp::OnDrawDescription (CDC* pDC, CRect rect)
  964. {
  965. ASSERT_VALID (this);
  966. ASSERT_VALID (pDC);
  967. ASSERT_VALID (m_pWndList);
  968. HFONT hOldFont = (HFONT) ::SelectObject (pDC->GetSafeHdc (), m_pWndList->m_fontBold.GetSafeHandle ());
  969. int nHeight = pDC->DrawText (m_strName, rect, DT_SINGLELINE | DT_NOPREFIX);
  970. ::SelectObject (pDC->GetSafeHdc (), hOldFont);
  971. rect.top += nHeight + 2;
  972. pDC->DrawText (m_strDescr, rect, DT_WORDBREAK | DT_NOPREFIX | DT_END_ELLIPSIS);
  973. }
  974. //******************************************************************************************
  975. BOOL CBCGPProp::OnUpdateValue ()
  976. {
  977. ASSERT_VALID (this);
  978. ASSERT_VALID (m_pWndInPlace);
  979. ASSERT_VALID (m_pWndList);
  980. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  981. CString strText;
  982. m_pWndInPlace->GetWindowText (strText);
  983. BOOL bRes = FALSE;
  984. BOOL bIsChanged = FormatProperty () != strText;
  985. if (m_bIsValueList)
  986. {
  987. CString strDelimeter = m_pWndList->m_cListDelimeter;
  988. for (int i = 0; !strText.IsEmpty () && i < GetSubItemsCount (); i++)
  989. {
  990. CString strItem = strText.SpanExcluding (strDelimeter);
  991. if (strItem.GetLength () + 1 > strText.GetLength ())
  992. {
  993. strText.Empty ();
  994. }
  995. else
  996. {
  997. strText = strText.Mid (strItem.GetLength () + 1);
  998. }
  999. strItem.TrimLeft ();
  1000. strItem.TrimRight ();
  1001. CBCGPProp* pSubItem = GetSubItem (i);
  1002. ASSERT_VALID (pSubItem);
  1003. pSubItem->TextToVar (strItem);
  1004. }
  1005. bRes = TRUE;
  1006. }
  1007. else
  1008. {
  1009. bRes = TextToVar (strText);
  1010. }
  1011. if (bRes && bIsChanged)
  1012. {
  1013. m_pWndList->OnPropertyChanged (this);
  1014. }
  1015. return bRes;
  1016. }
  1017. //******************************************************************************************
  1018. BOOL CBCGPProp::TextToVar (const CString& strText)
  1019. {
  1020. CString strVal = strText;
  1021. switch (m_varValue.vt)
  1022. {
  1023. case VT_BSTR:
  1024. m_varValue = (LPCTSTR) strVal;
  1025. return TRUE;
  1026. case VT_UI1:
  1027. m_varValue = strVal.IsEmpty () ? (BYTE) 0 : (BYTE) strVal[0];
  1028. return TRUE;
  1029. case VT_I2:
  1030. m_varValue = (short) _ttoi (strVal);
  1031. return TRUE;
  1032. case VT_I4:
  1033. m_varValue = _ttol (strVal);
  1034. return TRUE;
  1035. case VT_INT:
  1036. m_varValue.intVal = _ttoi (strVal);
  1037. return TRUE;
  1038. case VT_UI2:
  1039. m_varValue.uiVal = unsigned short (_ttoi (strVal));
  1040. return TRUE;
  1041. case VT_UINT:
  1042. case VT_UI4:
  1043. m_varValue.ulVal = unsigned long (_ttol (strVal));
  1044. return TRUE;
  1045. case VT_R4:
  1046. {
  1047. float fVal = 0.;
  1048. strVal.TrimLeft ();
  1049. strVal.TrimRight ();
  1050. if (!strVal.IsEmpty ())
  1051. {
  1052. #if _MSC_VER < 1400
  1053. _stscanf (strVal, m_strFormatFloat, &fVal);
  1054. #else
  1055. _stscanf_s (strVal, m_strFormatFloat, &fVal);
  1056. #endif
  1057. }
  1058. m_varValue = fVal;
  1059. }
  1060. return TRUE;
  1061. case VT_R8:
  1062. {
  1063. double dblVal = 0.;
  1064. strVal.TrimLeft ();
  1065. strVal.TrimRight ();
  1066. if (!strVal.IsEmpty ())
  1067. {
  1068. #if _MSC_VER < 1400
  1069. _stscanf (strVal, m_strFormatDouble, &dblVal);
  1070. #else
  1071. _stscanf_s (strVal, m_strFormatDouble, &dblVal);
  1072. #endif
  1073. }
  1074. m_varValue = dblVal;
  1075. }
  1076. return TRUE;
  1077. case VT_BOOL:
  1078. strVal.TrimRight ();
  1079. m_varValue = (bool) (strVal == m_pWndList->m_strTrue);
  1080. return TRUE;
  1081. }
  1082. return FALSE;
  1083. }
  1084. //*****************************************************************************
  1085. BOOL CBCGPProp::IsValueChanged () const
  1086. {
  1087. ASSERT_VALID (this);
  1088. if (m_varValueOrig.vt != m_varValue.vt)
  1089. {
  1090. return FALSE;
  1091. }
  1092. const _variant_t& var = m_varValue;
  1093. const _variant_t& var1 = m_varValueOrig;
  1094. switch (m_varValue.vt)
  1095. {
  1096. case VT_BSTR:
  1097. {
  1098. CString str1 = (LPCTSTR)(_bstr_t)var;
  1099. CString str2 = (LPCTSTR)(_bstr_t)var1;
  1100. return str1 != str2;
  1101. }
  1102. break;
  1103.     case VT_I2:
  1104. return (short) var != (short) var1;
  1105. case VT_I4:
  1106. case VT_INT:
  1107. return (long) var != (long) var1;
  1108. case VT_UI1:
  1109. return (BYTE) var != (BYTE) var1;
  1110.     case VT_UI2:
  1111. return var.uiVal != var1.uiVal;
  1112. case VT_UINT:
  1113. case VT_UI4:
  1114. return var.ulVal != var1.ulVal;
  1115.     case VT_R4:
  1116. return (float) var != (float) var1;
  1117.     case VT_R8:
  1118. return (double) var != (double) var1;
  1119.     case VT_BOOL:
  1120. return (bool) var != (bool) var1;
  1121. }
  1122. return FALSE;
  1123. }
  1124. //*****************************************************************************
  1125. BOOL CBCGPProp::OnEdit (LPPOINT /*lptClick*/)
  1126. {
  1127. ASSERT_VALID (this);
  1128. ASSERT_VALID (m_pWndList);
  1129. if (!HasValueField ())
  1130. {
  1131. return FALSE;
  1132. }
  1133. m_pWndInPlace = NULL;
  1134. CRect rectEdit;
  1135. CRect rectSpin;
  1136. AdjustInPlaceEditRect (rectEdit, rectSpin);
  1137. BOOL bDefaultFormat = FALSE;
  1138. m_pWndInPlace = CreateInPlaceEdit (rectEdit, bDefaultFormat);
  1139. if (m_pWndInPlace != NULL)
  1140. {
  1141. if (bDefaultFormat)
  1142. {
  1143. m_pWndInPlace->SetWindowText (FormatProperty ());
  1144. }
  1145. if (m_dwFlags & PROP_HAS_LIST)
  1146. {
  1147. CRect rectCombo = m_Rect;
  1148. rectCombo.left = rectEdit.left - 4;
  1149. m_pWndCombo = CreateCombo (m_pWndList, rectCombo);
  1150. ASSERT_VALID (m_pWndCombo);
  1151. m_pWndCombo->SetFont (m_pWndList->GetFont ());
  1152. //-----------------------------------------------------------------------
  1153. // Synchronize bottom edge of the combobox with the property bottom edge:
  1154. //-----------------------------------------------------------------------
  1155. m_pWndCombo->GetWindowRect (rectCombo);
  1156. m_pWndList->ScreenToClient (&rectCombo);
  1157. int dy = rectCombo.Height () - m_Rect.Height ();
  1158. m_pWndCombo->SetWindowPos (NULL, rectCombo.left,
  1159. rectCombo.top - dy + 1, -1, -1, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
  1160. if (m_varValue.vt == VT_BOOL)
  1161. {
  1162. m_lstOptions.AddTail (m_pWndList->m_strTrue);
  1163. m_lstOptions.AddTail (m_pWndList->m_strFalse);
  1164. }
  1165. for (POSITION pos = m_lstOptions.GetHeadPosition (); pos != NULL;)
  1166. {
  1167. m_pWndCombo->AddString (m_lstOptions.GetNext (pos));
  1168. }
  1169. }
  1170. if (m_dwFlags & PROP_HAS_SPIN)
  1171. {
  1172. m_pWndSpin = CreateSpinControl (rectSpin);
  1173. }
  1174. m_pWndInPlace->SetFont (
  1175. IsModified () && m_pWndList->m_bMarkModifiedProperties ? 
  1176. &m_pWndList->m_fontBold : m_pWndList->GetFont ());
  1177. m_pWndInPlace->SetFocus ();
  1178. if (!m_bAllowEdit)
  1179. {
  1180. m_pWndInPlace->HideCaret ();
  1181. }
  1182. m_bInPlaceEdit = TRUE;
  1183. return TRUE;
  1184. }
  1185. return FALSE;
  1186. }
  1187. //******************************************************************************************
  1188. void CBCGPProp::AdjustButtonRect ()
  1189. {
  1190. ASSERT_VALID (this);
  1191. m_rectButton = m_Rect;
  1192. m_rectButton.left = m_rectButton.right - m_rectButton.Height () + 3;
  1193. m_rectButton.top ++;
  1194. }
  1195. //******************************************************************************************
  1196. void CBCGPProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
  1197. {
  1198. ASSERT_VALID (this);
  1199. ASSERT_VALID (m_pWndList);
  1200. rectEdit = m_Rect;
  1201. rectEdit.DeflateRect (0, 2);
  1202. int nMargin = m_pWndList->m_bMarkModifiedProperties && m_bIsModified ?
  1203. m_pWndList->m_nBoldEditLeftMargin : m_pWndList->m_nEditLeftMargin;
  1204. rectEdit.left = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth 
  1205. + TEXT_MARGIN - nMargin + 1;
  1206. if (HasButton ())
  1207. {
  1208. AdjustButtonRect ();
  1209. rectEdit.right = m_rectButton.left;
  1210. }
  1211. if (m_dwFlags & PROP_HAS_SPIN)
  1212. {
  1213. rectSpin = m_Rect;
  1214. rectSpin.right = rectEdit.right;
  1215. rectSpin.left = rectSpin.right - rectSpin.Height ();
  1216. rectSpin.top ++;
  1217. rectEdit.right = rectSpin.left;
  1218. }
  1219. else
  1220. {
  1221. rectSpin.SetRectEmpty ();
  1222. }
  1223. }
  1224. //******************************************************************************************
  1225. CWnd* CBCGPProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
  1226. {
  1227. switch (m_varValue.vt)
  1228. {
  1229. case VT_BSTR:
  1230. case VT_R4:
  1231. case VT_R8:
  1232. case VT_UI1:
  1233. case VT_I2:
  1234. case VT_INT:
  1235. case VT_UINT:
  1236. case VT_I4:
  1237. case VT_UI2:
  1238. case VT_UI4:
  1239. case VT_BOOL:
  1240. break;
  1241. default:
  1242. if (!m_bIsValueList)
  1243. {
  1244. return NULL;
  1245. }
  1246. }
  1247. CEdit* pWndEdit = NULL;
  1248. if (!m_strEditMask.IsEmpty () || !m_strEditTempl.IsEmpty () ||
  1249. !m_strValidChars.IsEmpty ())
  1250. {
  1251. CBCGPMaskEdit* pWndEditMask = new CBCGPMaskEdit;
  1252. if (!m_strEditMask.IsEmpty () && !m_strEditTempl.IsEmpty ())
  1253. {
  1254. pWndEditMask->EnableMask (m_strEditMask, m_strEditTempl, _T(' '));
  1255. }
  1256. if (!m_strValidChars.IsEmpty ())
  1257. {
  1258. pWndEditMask->SetValidChars (m_strValidChars);
  1259. }
  1260. pWndEdit = pWndEditMask;
  1261. }
  1262. else
  1263. {
  1264. pWndEdit = new CEdit;
  1265. }
  1266. DWORD dwStyle = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL;
  1267. if (!m_bEnabled || !m_bAllowEdit)
  1268. {
  1269. dwStyle |= ES_READONLY;
  1270. }
  1271. pWndEdit->Create (dwStyle, rectEdit, m_pWndList, BCGPROPLIST_ID_INPLACE);
  1272. bDefaultFormat = TRUE;
  1273. return pWndEdit;
  1274. }
  1275. //*****************************************************************************
  1276. CSpinButtonCtrl* CBCGPProp::CreateSpinControl (CRect rectSpin)
  1277. {
  1278. ASSERT_VALID (this);
  1279. ASSERT_VALID (m_pWndList);
  1280. CSpinButtonCtrl* pWndSpin = new CBCGPSpinButtonCtrl;
  1281. if (!pWndSpin->Create (
  1282. WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_NOTHOUSANDS,
  1283. rectSpin, m_pWndList, BCGPROPLIST_ID_INPLACE))
  1284. {
  1285. return NULL;
  1286. }
  1287. pWndSpin->SetBuddy (m_pWndInPlace);
  1288. if (m_nMinValue != 0 || m_nMaxValue != 0)
  1289. {
  1290. pWndSpin->SetRange32 (m_nMinValue, m_nMaxValue);
  1291. }
  1292. return pWndSpin;
  1293. }
  1294. //*****************************************************************************
  1295. BOOL CBCGPProp::OnEndEdit ()
  1296. {
  1297. ASSERT_VALID (this);
  1298. m_bInPlaceEdit = FALSE;
  1299. m_bButtonIsFocused = FALSE;
  1300. OnDestroyWindow ();
  1301. return TRUE;
  1302. }
  1303. //*****************************************************************************************
  1304. CComboBox* CBCGPProp::CreateCombo (CWnd* pWndParent, CRect rect)
  1305. {
  1306. ASSERT_VALID (this);
  1307. rect.bottom = rect.top + 400;
  1308. CComboBox* pWndCombo = new CComboBox;
  1309. if (!pWndCombo->Create (WS_CHILD | CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST | WS_VSCROLL, 
  1310. rect, pWndParent, BCGPROPLIST_ID_INPLACE))
  1311. {
  1312. delete pWndCombo;
  1313. return NULL;
  1314. }
  1315. return pWndCombo;
  1316. }
  1317. //****************************************************************************************
  1318. void CBCGPProp::OnClickButton (CPoint /*point*/)
  1319. {
  1320. ASSERT_VALID (this);
  1321. ASSERT_VALID (m_pWndList);
  1322. if (m_pWndCombo != NULL)
  1323. {
  1324. m_bButtonIsDown = TRUE;
  1325. Redraw ();
  1326. CString str;
  1327. m_pWndInPlace->GetWindowText (str);
  1328. m_pWndCombo->SetCurSel (m_pWndCombo->FindStringExact (-1, str));
  1329. m_pWndCombo->SetFocus ();
  1330. m_pWndCombo->ShowDropDown ();
  1331. }
  1332. }
  1333. //****************************************************************************************
  1334. BOOL CBCGPProp::OnClickValue (UINT uiMsg, CPoint point)
  1335. {
  1336. ASSERT_VALID (this);
  1337. ASSERT_VALID (m_pWndList);
  1338. if (m_pWndInPlace == NULL)
  1339. {
  1340. return FALSE;
  1341. }
  1342. ASSERT_VALID (m_pWndInPlace);
  1343. if (m_pWndSpin != NULL)
  1344. {
  1345. ASSERT_VALID (m_pWndSpin);
  1346. ASSERT (m_pWndSpin->GetSafeHwnd () != NULL);
  1347. CRect rectSpin;
  1348. m_pWndSpin->GetClientRect (rectSpin);
  1349. m_pWndSpin->MapWindowPoints (m_pWndList, rectSpin);
  1350. if (rectSpin.PtInRect (point))
  1351. {
  1352. m_pWndList->MapWindowPoints (m_pWndSpin, &point, 1); 
  1353. m_pWndSpin->SendMessage (uiMsg, 0, MAKELPARAM (point.x, point.y));
  1354. return TRUE;
  1355. }
  1356. }
  1357. CPoint ptEdit = point;
  1358. ::MapWindowPoints ( m_pWndList->GetSafeHwnd (), 
  1359. m_pWndInPlace->GetSafeHwnd (), &ptEdit, 1);
  1360. m_pWndInPlace->SendMessage (uiMsg, 0, MAKELPARAM (ptEdit.x, ptEdit.y));
  1361. return TRUE;
  1362. }
  1363. //****************************************************************************************
  1364. BOOL CBCGPProp::OnDblClick (CPoint /*point*/)
  1365. {
  1366. ASSERT_VALID (this);
  1367. ASSERT_VALID (m_pWndList);
  1368. if (m_pWndInPlace == NULL)
  1369. {
  1370. return FALSE;
  1371. }
  1372. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  1373. if (m_lstOptions.GetCount () > 1)
  1374. {
  1375. CString strText;
  1376. m_pWndInPlace->GetWindowText (strText);
  1377. POSITION pos = m_lstOptions.Find (strText);
  1378. if (pos == NULL)
  1379. {
  1380. return FALSE;
  1381. }
  1382. m_lstOptions.GetNext (pos);
  1383. if (pos == NULL)
  1384. {
  1385. pos = m_lstOptions.GetHeadPosition ();
  1386. }
  1387. ASSERT (pos != NULL);
  1388. strText = m_lstOptions.GetAt (pos);
  1389. m_pWndInPlace->SetWindowText (strText);
  1390. OnUpdateValue ();
  1391. return TRUE;
  1392. }
  1393. if (m_dwFlags & PROP_HAS_BUTTON)
  1394. {
  1395. CWaitCursor wait;
  1396. CString strPrevVal = FormatProperty ();
  1397. OnClickButton (CPoint (-1, -1));
  1398. if (strPrevVal != FormatProperty ())
  1399. {
  1400. m_pWndList->OnPropertyChanged (this);
  1401. }
  1402. return TRUE;
  1403. }
  1404. return FALSE;
  1405. }
  1406. //*****************************************************************************************
  1407. void CBCGPProp::OnSelectCombo ()
  1408. {
  1409. ASSERT_VALID (this);
  1410. ASSERT_VALID (m_pWndCombo);
  1411. ASSERT_VALID (m_pWndInPlace);
  1412. int iSelIndex = m_pWndCombo->GetCurSel ();
  1413. if (iSelIndex >= 0)
  1414. {
  1415. CString str;
  1416. m_pWndCombo->GetLBText (iSelIndex, str);
  1417. m_pWndInPlace->SetWindowText (str);
  1418. OnUpdateValue ();
  1419. }
  1420. }
  1421. //****************************************************************************************
  1422. void CBCGPProp::OnCloseCombo ()
  1423. {
  1424. ASSERT_VALID (this);
  1425. m_bButtonIsDown = FALSE;
  1426. Redraw ();
  1427. ASSERT_VALID (m_pWndInPlace);
  1428. m_pWndInPlace->SetFocus ();
  1429. }
  1430. //****************************************************************************************
  1431. BOOL CBCGPProp::OnSetCursor () const
  1432. {
  1433. if (m_bInPlaceEdit)
  1434. {
  1435. return FALSE;
  1436. }
  1437. if (m_bIsValueList)
  1438. {
  1439. SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_IBEAM));
  1440. return TRUE;
  1441. }
  1442. switch (m_varValue.vt)
  1443. {
  1444. case VT_BSTR:
  1445. case VT_R4:
  1446. case VT_R8:
  1447. case VT_UI1:
  1448. case VT_I2:
  1449. case VT_INT:
  1450. case VT_UINT:
  1451. case VT_I4:
  1452. case VT_UI2:
  1453. case VT_UI4:
  1454. SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_IBEAM));
  1455. return TRUE;
  1456. }
  1457. return FALSE;
  1458. }
  1459. //*******************************************************************************************
  1460. BOOL CBCGPProp::PushChar (UINT nChar)
  1461. {
  1462. ASSERT_VALID (this);
  1463. ASSERT_VALID (m_pWndList);
  1464. ASSERT (m_pWndList->m_pSel == this);
  1465. ASSERT_VALID (m_pWndInPlace);
  1466. if (m_bIsValueList)
  1467. {
  1468. if (m_bEnabled && m_bAllowEdit &&
  1469. nChar != _T('+') && nChar != _T('-'))
  1470. {
  1471. m_pWndInPlace->SetWindowText (_T(""));
  1472. m_pWndInPlace->SendMessage (WM_CHAR, (WPARAM) nChar);
  1473. return TRUE;
  1474. }
  1475. }
  1476. switch (m_varValue.vt)
  1477. {
  1478. case VT_BSTR:
  1479.     case VT_R4:
  1480.     case VT_R8:
  1481.     case VT_UI1:
  1482.     case VT_I2:
  1483. case VT_INT:
  1484. case VT_UINT:
  1485. case VT_I4:
  1486.     case VT_UI2:
  1487. case VT_UI4:
  1488. if (m_bEnabled && m_bAllowEdit)
  1489. {
  1490. m_pWndInPlace->SetWindowText (_T(""));
  1491. m_pWndInPlace->SendMessage (WM_CHAR, (WPARAM) nChar);
  1492. return TRUE;
  1493. }
  1494. }
  1495. if (!m_bAllowEdit)
  1496. {
  1497. if (nChar == VK_SPACE)
  1498. {
  1499. OnDblClick (CPoint (-1, -1));
  1500. }
  1501. else if (m_lstOptions.GetCount () > 1)
  1502. {
  1503. CString strText;
  1504. m_pWndInPlace->GetWindowText (strText);
  1505. POSITION pos = m_lstOptions.Find (strText);
  1506. if (pos == NULL)
  1507. {
  1508. return FALSE;
  1509. }
  1510. POSITION posSave = pos;
  1511. CString strChar = (TCHAR) nChar;
  1512. strChar.MakeUpper ();
  1513. m_lstOptions.GetNext (pos);
  1514. while (pos != posSave)
  1515. {
  1516. if (pos == NULL)
  1517. {
  1518. pos = m_lstOptions.GetHeadPosition ();
  1519. }
  1520. if (pos == posSave)
  1521. {
  1522. break;
  1523. }
  1524. strText = m_lstOptions.GetAt (pos);
  1525. CString strUpper = strText;
  1526. strUpper.MakeUpper ();
  1527. if (strUpper.Left (1) == strChar)
  1528. {
  1529. m_pWndInPlace->SetWindowText (strText);
  1530. OnUpdateValue ();
  1531. break;
  1532. }
  1533. m_lstOptions.GetNext (pos);
  1534. }
  1535. }
  1536. }
  1537. OnEndEdit ();
  1538. if (::GetCapture () == m_pWndList->GetSafeHwnd ())
  1539. {
  1540. ReleaseCapture ();
  1541. }
  1542. return FALSE;
  1543. }
  1544. //*******************************************************************************************
  1545. CString CBCGPProp::GetNameTooltip ()
  1546. {
  1547. ASSERT_VALID (this);
  1548. return _T("");
  1549. }
  1550. //*******************************************************************************************
  1551. CString CBCGPProp::GetValueTooltip ()
  1552. {
  1553. ASSERT_VALID (this);
  1554. return _T("");
  1555. }
  1556. //*******************************************************************************************
  1557. HBRUSH CBCGPProp::OnCtlColor(CDC* pDC, UINT /*nCtlColor*/)
  1558. {
  1559. ASSERT_VALID (this);
  1560. ASSERT_VALID (m_pWndList);
  1561. if (m_pWndList->m_clrText != (COLORREF)-1)
  1562. {
  1563. pDC->SetTextColor (m_pWndList->m_clrText);
  1564. }
  1565. if (m_pWndList->m_brBackground.GetSafeHandle () != NULL)
  1566. {
  1567. if (m_pWndList->m_clrBackground != -1)
  1568. {
  1569. pDC->SetBkColor (m_pWndList->m_clrBackground);
  1570. }
  1571. return (HBRUSH) m_pWndList->m_brBackground.GetSafeHandle ();
  1572. }
  1573. switch (m_varValue.vt)
  1574. {
  1575. case VT_BSTR:
  1576.     case VT_R4:
  1577.     case VT_R8:
  1578.     case VT_UI1:
  1579.     case VT_I2:
  1580. case VT_I4:
  1581. case VT_INT:
  1582. case VT_UINT:
  1583.     case VT_UI2:
  1584. case VT_UI4:
  1585. case VT_BOOL:
  1586. if (!m_bEnabled || !m_bAllowEdit)
  1587. {
  1588. pDC->SetBkColor (globalData.clrWindow);
  1589. return (HBRUSH) globalData.brWindow.GetSafeHandle ();
  1590. }
  1591. }
  1592. return NULL;
  1593. }
  1594. //***************************************************************************************
  1595. void CBCGPProp::SetModifiedFlag ()
  1596. {
  1597. ASSERT_VALID (m_pWndList);
  1598. BOOL bIsModified = IsValueChanged ();
  1599. if (m_bIsModified == bIsModified && !m_bIsValueList)
  1600. {
  1601. return;
  1602. }
  1603. m_bIsModified = bIsModified;
  1604. if (m_pParent != NULL && m_pParent->m_bIsValueList)
  1605. {
  1606. if (bIsModified)
  1607. {
  1608. m_pParent->m_bIsModified = TRUE;
  1609. }
  1610. else
  1611. {
  1612. m_pParent->m_bIsModified = FALSE;
  1613. for (POSITION pos = m_pParent->m_lstSubItems.GetHeadPosition (); pos != NULL;)
  1614. {
  1615. CBCGPProp* pSubItem = (CBCGPProp*) m_pParent->m_lstSubItems.GetNext (pos);
  1616. ASSERT_VALID (pSubItem);
  1617. if (pSubItem->m_bIsModified)
  1618. {
  1619. m_pParent->m_bIsModified = TRUE;
  1620. break;
  1621. }
  1622. }
  1623. }
  1624. }
  1625. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  1626. {
  1627. CBCGPProp* pSubItem = (CBCGPProp*) m_lstSubItems.GetNext (pos);
  1628. ASSERT_VALID (pSubItem);
  1629. pSubItem->SetModifiedFlag ();
  1630. }
  1631. if (m_pWndList->m_bMarkModifiedProperties)
  1632. {
  1633. OnPosSizeChanged (m_Rect);
  1634. if (m_pWndInPlace->GetSafeHwnd () != NULL)
  1635. {
  1636. if (m_bIsModified)
  1637. {
  1638. m_pWndInPlace->SetFont (&m_pWndList->m_fontBold);
  1639. }
  1640. else
  1641. {
  1642. m_pWndInPlace->SetFont (m_pWndList->GetFont ());
  1643. }
  1644. CRect rectInPlace;
  1645. m_pWndInPlace->GetWindowRect (&rectInPlace);
  1646. m_pWndList->ScreenToClient (&rectInPlace);
  1647. int nXOffset = 
  1648. m_pWndList->m_nBoldEditLeftMargin - m_pWndList->m_nEditLeftMargin;
  1649. if (m_bIsModified)
  1650. {
  1651. nXOffset = -nXOffset;
  1652. }
  1653. if (HasButton ())
  1654. {
  1655. AdjustButtonRect ();
  1656. rectInPlace.right = m_rectButton.left;
  1657. }
  1658. m_pWndInPlace->SetWindowPos (NULL, 
  1659. rectInPlace.left + nXOffset, rectInPlace.top, 
  1660. rectInPlace.Width () - nXOffset, rectInPlace.Height (),
  1661. SWP_NOZORDER | SWP_NOACTIVATE);
  1662. }
  1663. Redraw ();
  1664. }
  1665. }
  1666. //*******************************************************************************************
  1667. void CBCGPProp::Show (BOOL bShow/* = TRUE*/, BOOL bAdjustLayout/* = TRUE*/)
  1668. {
  1669. ASSERT_VALID (this);
  1670. if (m_bIsVisible == bShow)
  1671. {
  1672. return;
  1673. }
  1674. m_bIsVisible = bShow;
  1675. for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
  1676. {
  1677. CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
  1678. ASSERT_VALID (pProp);
  1679. pProp->Show (bShow, FALSE);
  1680. }
  1681. if (bAdjustLayout && m_pWndList != NULL && m_pWndList->GetSafeHwnd () != NULL)
  1682. {
  1683. ASSERT_VALID (m_pWndList);
  1684. m_pWndList->AdjustLayout ();
  1685. }
  1686. }
  1687. //*******************************************************************************************
  1688. BOOL CBCGPProp::OnActivateByTab ()
  1689. {
  1690. ASSERT_VALID (this);
  1691. ASSERT_VALID (m_pWndList);
  1692. if (m_bInPlaceEdit && (m_dwFlags & PROP_HAS_BUTTON))
  1693. {
  1694. m_bButtonIsFocused = !m_bButtonIsFocused;
  1695. m_pWndList->RedrawWindow (m_rectButton);
  1696. return TRUE;
  1697. }
  1698. if (!m_bInPlaceEdit && m_bEnabled && m_pWndList->EditItem (this))
  1699. {
  1700. CEdit* pEdit = DYNAMIC_DOWNCAST (CEdit, m_pWndInPlace);
  1701. if (::IsWindow (pEdit->GetSafeHwnd ()))
  1702. {
  1703. pEdit->SetSel (0, -1);
  1704. }
  1705. return TRUE;
  1706. }
  1707. return FALSE;
  1708. }
  1709. //*******************************************************************************************
  1710. BOOL CBCGPProp::OnRotateListValue (BOOL bForward)
  1711. {
  1712. if (m_pWndInPlace == NULL)
  1713. {
  1714. return FALSE;
  1715. }
  1716. CString strText;
  1717. m_pWndInPlace->GetWindowText (strText);
  1718. POSITION pos = m_lstOptions.Find (strText);
  1719. if (pos == NULL)
  1720. {
  1721. return FALSE;
  1722. }
  1723. if (bForward)
  1724. {
  1725. m_lstOptions.GetNext (pos);
  1726. if (pos == NULL)
  1727. {
  1728. pos = m_lstOptions.GetHeadPosition ();
  1729. }
  1730. }
  1731. else
  1732. {
  1733. m_lstOptions.GetPrev (pos);
  1734. if (pos == NULL)
  1735. {
  1736. pos = m_lstOptions.GetTailPosition ();
  1737. }
  1738. }
  1739. if (pos == NULL)
  1740. {
  1741. return FALSE;
  1742. }
  1743. strText = m_lstOptions.GetAt (pos);
  1744. m_pWndInPlace->SetWindowText (strText);
  1745. OnUpdateValue ();
  1746. CEdit* pEdit = DYNAMIC_DOWNCAST (CEdit, m_pWndInPlace);
  1747. if (::IsWindow (pEdit->GetSafeHwnd ()))
  1748. {
  1749. pEdit->SetSel (0, -1);
  1750. }
  1751. return TRUE;
  1752. }
  1753. //**********************************************************************************
  1754. BOOL CBCGPProp::SetACCData (CWnd* pParent, CBCGPAccessibilityData& data)
  1755. {
  1756. ASSERT_VALID (this);
  1757. ASSERT_VALID (pParent);
  1758. data.Clear ();
  1759. data.m_strAccName = GetName ();
  1760. data.m_strAccDefAction = _T("Press");
  1761. data.m_strDescription = GetName ();
  1762. BOOL bGroup = (IsGroup () && !m_bIsValueList);
  1763. if (!bGroup)
  1764. {
  1765. data.m_strAccValue = FormatProperty ();
  1766. }
  1767. data.m_nAccHit = 1;
  1768. data.m_nAccRole = ROLE_SYSTEM_ROW;
  1769. data.m_bAccState = STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_SELECTABLE;
  1770. if (IsSelected ())
  1771. {
  1772. data.m_bAccState |= STATE_SYSTEM_FOCUSED;
  1773. data.m_bAccState |= STATE_SYSTEM_SELECTED;
  1774. }
  1775. if (!IsEnabled () || bGroup)
  1776. {
  1777. data.m_bAccState |= STATE_SYSTEM_READONLY;
  1778. }
  1779. data.m_rectAccLocation = m_Rect;
  1780. pParent->ClientToScreen (&data.m_rectAccLocation);
  1781. return TRUE;
  1782. }
  1783. #ifndef _BCGPGRID_STANDALONE
  1784. /////////////////////////////////////////////////////////////////////////////
  1785. // CBCGPColorProp object
  1786. IMPLEMENT_DYNAMIC(CBCGPColorProp, CBCGPProp)
  1787. CBCGPColorProp::CBCGPColorProp(const CString& strName, const COLORREF& color, 
  1788.    CPalette* pPalette, LPCTSTR lpszDescr, DWORD_PTR dwData) :
  1789. CBCGPProp (strName, _variant_t(), lpszDescr, dwData),
  1790. m_Color (color),
  1791. m_ColorOrig (color)
  1792. {
  1793. CBCGPColorBar::InitColors (pPalette, m_Colors);
  1794. m_varValue = (LONG) color;
  1795. m_varValueOrig = (LONG) color;
  1796. m_dwFlags = PROP_HAS_LIST;
  1797. m_pPopup = NULL;
  1798. m_bStdColorDlg = FALSE;
  1799. m_ColorAutomatic = RGB (0, 0, 0);
  1800. m_nColumnsNumber = 5;
  1801. }
  1802. //*****************************************************************************************
  1803. CBCGPColorProp::~CBCGPColorProp()
  1804. {
  1805. }
  1806. //*******************************************************************************************
  1807. void CBCGPColorProp::OnDrawValue (CDC* pDC, CRect rect)
  1808. {
  1809. CRect rectColor = rect;
  1810. rect.left += rect.Height ();
  1811. CBCGPProp::OnDrawValue (pDC, rect);
  1812. rectColor.right = rectColor.left + rectColor.Height ();
  1813. rectColor.DeflateRect (1, 1);
  1814. rectColor.top++;
  1815. rectColor.left++;
  1816. CBrush br (m_Color == (COLORREF)-1 ? m_ColorAutomatic : m_Color);
  1817. pDC->FillRect (rectColor, &br);
  1818. pDC->Draw3dRect (rectColor, 0, 0);
  1819. }
  1820. //****************************************************************************************
  1821. void CBCGPColorProp::OnClickButton (CPoint /*point*/)
  1822. {
  1823. ASSERT_VALID (this);
  1824. ASSERT_VALID (m_pWndList);
  1825. m_bButtonIsDown = TRUE;
  1826. Redraw ();
  1827. CList<COLORREF,COLORREF> lstDocColors;
  1828. m_pPopup = new CColorPopup (NULL, m_Colors, m_Color,
  1829. NULL, NULL, NULL, lstDocColors,
  1830. m_nColumnsNumber, m_ColorAutomatic);
  1831. m_pPopup->SetPropList (m_pWndList);
  1832. if (!m_strOtherColor.IsEmpty ()) // Other color button
  1833. {
  1834. m_pPopup->m_wndColorBar.EnableOtherButton (m_strOtherColor, !m_bStdColorDlg);
  1835. }
  1836. if (!m_strAutoColor.IsEmpty ()) // Automatic color button
  1837. {
  1838. m_pPopup->m_wndColorBar.EnableAutomaticButton (m_strAutoColor, m_ColorAutomatic);
  1839. }
  1840. CPoint pt (
  1841. m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth + 1, 
  1842. m_rectButton.bottom + 1);
  1843. m_pWndList->ClientToScreen (&pt);
  1844. if (!m_pPopup->Create (m_pWndList, pt.x, pt.y, NULL, FALSE))
  1845. {
  1846. ASSERT (FALSE);
  1847. m_pPopup = NULL;
  1848. }
  1849. else
  1850. {
  1851. m_pPopup->GetMenuBar()->SetFocus ();
  1852. }
  1853. }
  1854. //******************************************************************************************
  1855. BOOL CBCGPColorProp::OnEdit (LPPOINT /*lptClick*/)
  1856. {
  1857. ASSERT_VALID (this);
  1858. ASSERT_VALID (m_pWndList);
  1859. m_pWndInPlace = NULL;
  1860. CRect rectEdit;
  1861. CRect rectSpin;
  1862. AdjustInPlaceEditRect (rectEdit, rectSpin);
  1863. CBCGPMaskEdit* pWndEdit = new CBCGPMaskEdit;
  1864. DWORD dwStyle = WS_VISIBLE | WS_CHILD;
  1865. if (!m_bEnabled)
  1866. {
  1867. dwStyle |= ES_READONLY;
  1868. }
  1869. pWndEdit->SetValidChars(_T("01234567890ABCDEFabcdef"));
  1870. pWndEdit->Create (dwStyle, rectEdit, m_pWndList, BCGPROPLIST_ID_INPLACE);
  1871. m_pWndInPlace = pWndEdit;
  1872. m_pWndInPlace->SetWindowText (FormatProperty ());
  1873. m_pWndInPlace->SetFont (
  1874. IsModified () && m_pWndList->m_bMarkModifiedProperties ? 
  1875. &m_pWndList->m_fontBold : m_pWndList->GetFont ());
  1876. m_pWndInPlace->SetFocus ();
  1877. m_bInPlaceEdit = TRUE;
  1878. return TRUE;
  1879. }
  1880. //****************************************************************************************
  1881. void CBCGPColorProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
  1882. {
  1883. ASSERT_VALID (this);
  1884. ASSERT_VALID (m_pWndList);
  1885. rectSpin.SetRectEmpty ();
  1886. rectEdit = m_Rect;
  1887. rectEdit.DeflateRect (0, 2);
  1888. int nMargin = m_pWndList->m_bMarkModifiedProperties && m_bIsModified ?
  1889. m_pWndList->m_nBoldEditLeftMargin : m_pWndList->m_nEditLeftMargin;
  1890. rectEdit.left = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth + 
  1891. m_Rect.Height () + TEXT_MARGIN - nMargin + 1;
  1892. AdjustButtonRect ();
  1893. rectEdit.right = m_rectButton.left;
  1894. }
  1895. //****************************************************************************************
  1896. void CBCGPColorProp::ResetOriginalValue ()
  1897. {
  1898. CBCGPProp::ResetOriginalValue ();
  1899. m_Color = m_ColorOrig;
  1900. }
  1901. //****************************************************************************************
  1902. void CBCGPColorProp::CommitModifiedValue ()
  1903. {
  1904. CBCGPProp::CommitModifiedValue ();
  1905. m_ColorOrig = m_Color;
  1906. }
  1907. //****************************************************************************************
  1908. CString CBCGPColorProp::FormatProperty ()
  1909. {
  1910. ASSERT_VALID (this);
  1911. CString str;
  1912. str.Format (_T("%02x%02x%02x"),
  1913. GetRValue (m_Color), GetGValue (m_Color), GetBValue (m_Color));
  1914. return str;
  1915. }
  1916. //******************************************************************************************
  1917. void CBCGPColorProp::SetColor (COLORREF color)
  1918. {
  1919. ASSERT_VALID (this);
  1920. m_Color = color;
  1921. m_varValue = (LONG) color;
  1922. if (::IsWindow (m_pWndList->GetSafeHwnd())) 
  1923. {
  1924. CRect rect = m_Rect;
  1925. rect.DeflateRect (0, 1);
  1926. m_pWndList->InvalidateRect (rect);
  1927. m_pWndList->UpdateWindow ();
  1928. }
  1929. if (m_pWndInPlace != NULL)
  1930. {
  1931. ASSERT_VALID (m_pWndInPlace);
  1932. m_pWndInPlace->SetWindowText (FormatProperty ());
  1933. }
  1934. }
  1935. //********************************************************************************
  1936. void CBCGPColorProp::SetColumnsNumber (int nColumnsNumber)
  1937. {
  1938. ASSERT_VALID (this);
  1939. ASSERT (nColumnsNumber > 0);
  1940. m_nColumnsNumber = nColumnsNumber;
  1941. }
  1942. //*************************************************************************************
  1943. void CBCGPColorProp::EnableAutomaticButton (LPCTSTR lpszLabel, COLORREF colorAutomatic, BOOL bEnable)
  1944. {
  1945. ASSERT_VALID (this);
  1946. m_ColorAutomatic = colorAutomatic;
  1947. m_strAutoColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel;
  1948. }
  1949. //*************************************************************************************
  1950. void CBCGPColorProp::EnableOtherButton (LPCTSTR lpszLabel, BOOL bAltColorDlg, BOOL bEnable)
  1951. {
  1952. ASSERT_VALID (this);
  1953. m_bStdColorDlg = !bAltColorDlg;
  1954. m_strOtherColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel;
  1955. }
  1956. //*****************************************************************************************
  1957. BOOL CBCGPColorProp::OnUpdateValue ()
  1958. {
  1959. ASSERT_VALID (this);
  1960. if (m_pWndInPlace == NULL)
  1961. {
  1962. return FALSE;
  1963. }
  1964. ASSERT_VALID (m_pWndInPlace);
  1965. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  1966. CString strText;
  1967. m_pWndInPlace->GetWindowText (strText);
  1968. COLORREF colorCurr = m_Color;
  1969. int nR = 0, nG = 0, nB = 0;
  1970. #if _MSC_VER < 1400
  1971. _stscanf (strText, _T("%2x%2x%2x"), &nR, &nG, &nB);
  1972. #else
  1973. _stscanf_s (strText, _T("%2x%2x%2x"), &nR, &nG, &nB);
  1974. #endif
  1975. m_Color = RGB (nR, nG, nB);
  1976. if (colorCurr != m_Color)
  1977. {
  1978. m_pWndList->OnPropertyChanged (this);
  1979. }
  1980. return TRUE;
  1981. }
  1982. #endif // _BCGPGRID_STANDALONE
  1983. /////////////////////////////////////////////////////////////////////////////
  1984. // CBCGPFileProp object
  1985. IMPLEMENT_DYNAMIC(CBCGPFileProp, CBCGPProp)
  1986. #ifndef _BCGPGRID_STANDALONE
  1987. CBCGPFileProp::CBCGPFileProp(const CString& strName, const CString& strFolderName, DWORD_PTR dwData, LPCTSTR lpszDescr) :
  1988. CBCGPProp (strName, _variant_t((LPCTSTR)strFolderName), lpszDescr, dwData),
  1989. m_bIsFolder (TRUE)
  1990. {
  1991. m_dwFlags = PROP_HAS_BUTTON;
  1992. }
  1993. #endif
  1994. CBCGPFileProp::CBCGPFileProp ( const CString& strName, 
  1995. BOOL bOpenFileDialog,
  1996. const CString& strFileName, 
  1997. LPCTSTR lpszDefExt,
  1998. DWORD dwFileFlags, 
  1999. LPCTSTR lpszFilter,
  2000. LPCTSTR lpszDescr,
  2001. DWORD_PTR dwData) :
  2002. CBCGPProp (strName, _variant_t((LPCTSTR)strFileName), lpszDescr, dwData),
  2003. m_bOpenFileDialog (bOpenFileDialog),
  2004. m_dwFileOpenFlags (dwFileFlags)
  2005. {
  2006. m_dwFlags = PROP_HAS_BUTTON;
  2007. m_strDefExt = lpszDefExt == NULL ? _T("") : lpszDefExt;
  2008. m_strFilter = lpszFilter == NULL ? _T("") : lpszFilter;
  2009. #ifndef _BCGPGRID_STANDALONE
  2010. m_bIsFolder  = FALSE;
  2011. #endif
  2012. }
  2013. //*****************************************************************************************
  2014. CBCGPFileProp::~CBCGPFileProp()
  2015. {
  2016. }
  2017. //****************************************************************************************
  2018. void CBCGPFileProp::OnClickButton (CPoint /*point*/)
  2019. {
  2020. ASSERT_VALID (this);
  2021. ASSERT_VALID (m_pWndList);
  2022. ASSERT_VALID (m_pWndInPlace);
  2023. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  2024. m_bButtonIsDown = TRUE;
  2025. Redraw ();
  2026. CString strPath = (LPCTSTR)(_bstr_t)m_varValue;
  2027. BOOL bUpdate = FALSE;
  2028. #ifndef _BCGPGRID_STANDALONE
  2029. if (m_bIsFolder)
  2030. {
  2031. if (g_pShellManager == NULL)
  2032. {
  2033. if (g_pWorkspace != NULL)
  2034. {
  2035. g_pWorkspace->InitShellManager ();
  2036. }
  2037. }
  2038. if (g_pShellManager == NULL)
  2039. {
  2040. ASSERT (FALSE);
  2041. }
  2042. else
  2043. {
  2044. bUpdate = g_pShellManager->BrowseForFolder (strPath, m_pWndList, strPath);
  2045. }
  2046. }
  2047. else
  2048. #endif
  2049. {
  2050. CFileDialog dlg (m_bOpenFileDialog, m_strDefExt, strPath, m_dwFileOpenFlags, m_strFilter,
  2051. m_pWndList);
  2052. if (dlg.DoModal () == IDOK)
  2053. {
  2054. bUpdate = TRUE;
  2055. strPath = dlg.GetPathName ();
  2056. }
  2057. }
  2058. if (bUpdate)
  2059. {
  2060. if (m_pWndInPlace != NULL)
  2061. {
  2062. m_pWndInPlace->SetWindowText (strPath);
  2063. }
  2064. m_varValue = (LPCTSTR) strPath;
  2065. }
  2066. m_bButtonIsDown = FALSE;
  2067. Redraw ();
  2068. if (m_pWndInPlace != NULL)
  2069. {
  2070. m_pWndInPlace->SetFocus ();
  2071. }
  2072. else
  2073. {
  2074. m_pWndList->SetFocus ();
  2075. }
  2076. }
  2077. #ifndef _BCGPGRID_STANDALONE
  2078. /////////////////////////////////////////////////////////////////////////////
  2079. // CBCGPDateTimeProp object
  2080. IMPLEMENT_DYNAMIC(CBCGPDateTimeProp, CBCGPProp)
  2081. CBCGPDateTimeProp::CBCGPDateTimeProp(const CString& strName, const COleDateTime& date, 
  2082. LPCTSTR lpszDescr/* = NULL*/, DWORD_PTR dwData/* = 0*/,
  2083. UINT nFlags/* = CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_TIME | CBCGPDateTimeCtrl::DTM_DROPCALENDAR*/) :
  2084. CBCGPProp (strName, _variant_t(date, VT_DATE), lpszDescr, dwData)
  2085. {
  2086. m_nFlags = nFlags;
  2087. }
  2088. //*****************************************************************************************
  2089. CBCGPDateTimeProp::~CBCGPDateTimeProp()
  2090. {
  2091. }
  2092. //****************************************************************************************
  2093. void CBCGPDateTimeProp::OnDrawValue (CDC* pDC, CRect rect)
  2094. {
  2095. ASSERT_VALID (m_pWndList);
  2096. rect.DeflateRect (0, 2);
  2097. rect.left = m_pWndList->GetListRect ().left + 
  2098. m_pWndList->GetPropertyColumnWidth () + TEXT_MARGIN + 1;
  2099. DRAWITEMSTRUCT dis;
  2100. memset (&dis, 0, sizeof (DRAWITEMSTRUCT));
  2101. dis.CtlType = ODT_BUTTON;
  2102. dis.hDC = pDC->GetSafeHdc ();
  2103. dis.rcItem = rect;
  2104. m_wndDateTime.m_bDrawDateTimeOnly = !IsSelected () || !m_bEnabled;
  2105. COLORREF clrTextOld = pDC->GetTextColor ();
  2106. m_wndDateTime.SetTextColor (m_bEnabled ? 
  2107. m_pWndList->GetTextColor () : globalData.clrGrayedText, FALSE);
  2108. m_wndDateTime.SetBackgroundColor (m_pWndList->m_clrBackground, FALSE);
  2109. m_wndDateTime.SetFont (
  2110. IsModified () && m_pWndList->m_bMarkModifiedProperties ?
  2111. &m_pWndList->m_fontBold : m_pWndList->GetFont ());
  2112. m_wndDateTime.DrawItem (&dis);
  2113. pDC->SetTextColor (clrTextOld);
  2114. }
  2115. //*****************************************************************************
  2116. CWnd* CBCGPDateTimeProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
  2117. {
  2118. ASSERT_VALID (m_pWndList);
  2119. CBCGPDateTimeCtrl* pDateTime = new CBCGPDateTimeCtrl;
  2120. ASSERT_VALID (pDateTime);
  2121. pDateTime->SetAutoResize (FALSE);
  2122. CRect rectSpin;
  2123. AdjustInPlaceEditRect (rectEdit, rectSpin);
  2124. pDateTime->Create (_T(""), WS_CHILD | WS_VISIBLE, rectEdit, 
  2125. m_pWndList, BCGPROPLIST_ID_INPLACE);
  2126. pDateTime->SetFont (
  2127. IsModified () && m_pWndList->m_bMarkModifiedProperties ? 
  2128. &m_pWndList->m_fontBold : m_pWndList->GetFont ());
  2129. SetState (*pDateTime);
  2130. pDateTime->SetDate (GetDate ());
  2131. pDateTime->SetTextColor (m_pWndList->GetTextColor (), FALSE);
  2132. pDateTime->SetBackgroundColor (m_pWndList->m_clrBackground, FALSE);
  2133. bDefaultFormat = FALSE;
  2134. return pDateTime;
  2135. }
  2136. //*******************************************************************************
  2137. void CBCGPDateTimeProp::OnPosSizeChanged (CRect /*rectOld*/)
  2138. {
  2139. ASSERT_VALID (m_pWndList);
  2140. CRect rectEdit;
  2141. CRect rectSpin;
  2142. AdjustInPlaceEditRect (rectEdit, rectSpin);
  2143. if (m_wndDateTime.GetSafeHwnd () == NULL)
  2144. {
  2145. m_wndDateTime.SetAutoResize (FALSE);
  2146. m_wndDateTime.Create (_T(""), WS_CHILD, rectEdit,
  2147. m_pWndList, (UINT)-1);
  2148. m_wndDateTime.SetFont (
  2149. IsModified () && m_pWndList->m_bMarkModifiedProperties ? 
  2150. &m_pWndList->m_fontBold : m_pWndList->GetFont ());
  2151. SetState (m_wndDateTime);
  2152. m_wndDateTime.SetDate (GetDate ());
  2153. }
  2154. else
  2155. {
  2156. m_wndDateTime.SetFont (
  2157. IsModified () && m_pWndList->m_bMarkModifiedProperties ? 
  2158. &m_pWndList->m_fontBold : m_pWndList->GetFont (), FALSE);
  2159. m_wndDateTime.SetWindowPos (NULL, rectEdit.left, rectEdit.top,
  2160. rectEdit.Width (), rectEdit.Height (),
  2161. SWP_NOZORDER | SWP_NOACTIVATE);
  2162. }
  2163. m_wndDateTime.AdjustControl (rectEdit);
  2164. }
  2165. //******************************************************************************************
  2166. BOOL CBCGPDateTimeProp::OnUpdateValue ()
  2167. {
  2168. ASSERT_VALID (this);
  2169. ASSERT_VALID (m_pWndInPlace);
  2170. ASSERT_VALID (m_pWndList);
  2171. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  2172. CBCGPDateTimeCtrl* pDateTime = DYNAMIC_DOWNCAST (CBCGPDateTimeCtrl, m_pWndInPlace);
  2173. ASSERT_VALID (pDateTime);
  2174. COleDateTime dateOld = GetDate ();
  2175. COleDateTime dateNew = pDateTime->GetDate ();
  2176. m_varValue = _variant_t (dateNew, VT_DATE);
  2177. m_wndDateTime.SetDate (dateNew);
  2178. if (dateOld != dateNew)
  2179. {
  2180. m_pWndList->OnPropertyChanged (this);
  2181. }
  2182. return TRUE;
  2183. }
  2184. //********************************************************************************
  2185. void CBCGPDateTimeProp::SetDate (COleDateTime date)
  2186. {
  2187. ASSERT_VALID (this);
  2188. SetValue (_variant_t (date, VT_DATE));
  2189. if (m_wndDateTime.GetSafeHwnd () != NULL)
  2190. {
  2191. m_wndDateTime.SetDate (date);
  2192. }
  2193. }
  2194. //*********************************************************************************
  2195. void CBCGPDateTimeProp::SetState (CBCGPDateTimeCtrl& wnd)
  2196. {
  2197. ASSERT (wnd.GetSafeHwnd () != NULL);
  2198. UINT stateFlags = 0;
  2199. if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
  2200. {
  2201. stateFlags |= (CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_DROPCALENDAR);
  2202. }
  2203. if (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME))
  2204. {
  2205. stateFlags |= (CBCGPDateTimeCtrl::DTM_TIME | CBCGPDateTimeCtrl::DTM_TIME24HBYLOCALE);
  2206. }
  2207. const UINT stateMask = 
  2208. CBCGPDateTimeCtrl::DTM_SPIN |
  2209. CBCGPDateTimeCtrl::DTM_DROPCALENDAR | 
  2210. CBCGPDateTimeCtrl::DTM_DATE |
  2211. CBCGPDateTimeCtrl::DTM_TIME24H |
  2212. CBCGPDateTimeCtrl::DTM_CHECKBOX |
  2213. CBCGPDateTimeCtrl::DTM_TIME | 
  2214. CBCGPDateTimeCtrl::DTM_TIME24HBYLOCALE;
  2215. wnd.SetState (stateFlags, stateMask);
  2216. }
  2217. //********************************************************************************
  2218. void CBCGPDateTimeProp::OnSetSelection (CBCGPProp* /*pOldSel*/)
  2219. {
  2220. Redraw ();
  2221. }
  2222. //********************************************************************************
  2223. void CBCGPDateTimeProp::OnKillSelection (CBCGPProp* /*pNewSel*/)
  2224. {
  2225. Redraw ();
  2226. }
  2227. //********************************************************************************
  2228. BOOL CBCGPDateTimeProp::PushChar (UINT nChar)
  2229. {
  2230. ASSERT_VALID (this);
  2231. ASSERT_VALID (m_pWndList);
  2232. ASSERT (m_pWndList->GetCurSel () == this);
  2233. ASSERT_VALID (m_pWndInPlace);
  2234. if (m_bEnabled && m_bAllowEdit)
  2235. {
  2236. CString str = (TCHAR) nChar;
  2237. str.MakeUpper ();
  2238. m_pWndInPlace->SendMessage (WM_KEYDOWN, (WPARAM) str [0]);
  2239. return TRUE;
  2240. }
  2241. OnEndEdit ();
  2242. if (::GetCapture () == m_pWndList->GetSafeHwnd ())
  2243. {
  2244. ReleaseCapture ();
  2245. }
  2246. return FALSE;
  2247. }
  2248. //********************************************************************************
  2249. CString CBCGPDateTimeProp::FormatProperty ()
  2250. {
  2251. COleDateTime date = GetDate ();
  2252. CString strTextDate;
  2253. if ((m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE)) &&
  2254. (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME)))
  2255. {
  2256. strTextDate = date.Format ();
  2257. }
  2258. else if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
  2259. {
  2260. strTextDate = date.Format (VAR_DATEVALUEONLY);
  2261. }
  2262. else 
  2263. {
  2264. strTextDate = date.Format (VAR_TIMEVALUEONLY);
  2265. }
  2266. return strTextDate;
  2267. }
  2268. //********************************************************************************
  2269. BOOL CBCGPDateTimeProp::IsValueChanged () const
  2270. {
  2271. COleDateTime date = (DATE) m_varValue;
  2272. COleDateTime date1 = (DATE) m_varValueOrig;
  2273. if ((m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE)) &&
  2274. (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME)))
  2275. {
  2276. return date != date1;
  2277. }
  2278. else if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
  2279. {
  2280. return date.GetYear () != date1.GetYear () ||
  2281. date.GetMonth () != date1.GetMonth () ||
  2282. date.GetDay () != date1.GetDay ();
  2283. }
  2284. return date.GetHour () != date1.GetHour () ||
  2285. date.GetMinute () != date1.GetMinute ();
  2286. }
  2287. //********************************************************************************
  2288. void CBCGPDateTimeProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
  2289. {
  2290. rectSpin.SetRectEmpty ();
  2291. rectEdit = m_Rect;
  2292. rectEdit.DeflateRect (0, 2);
  2293. const int nMargin = 
  2294. m_bIsModified && m_pWndList->m_bMarkModifiedProperties ? 4 : 5;
  2295. rectEdit.left = m_pWndList->GetListRect ().left + 
  2296. m_pWndList->GetPropertyColumnWidth () + 
  2297. nMargin;
  2298. rectEdit.bottom++;
  2299. }
  2300. //********************************************************************************
  2301. BOOL CBCGPDateTimeProp::OnCommand (WPARAM /*wParam*/)
  2302. {
  2303. OnUpdateValue ();
  2304. return FALSE;
  2305. }
  2306. //****************************************************************************************
  2307. void CBCGPDateTimeProp::ResetOriginalValue ()
  2308. {
  2309. CBCGPProp::ResetOriginalValue ();
  2310. if (m_wndDateTime.GetSafeHwnd () != NULL)
  2311. {
  2312. m_wndDateTime.SetDate ((DATE) m_varValue);
  2313. }
  2314. }
  2315. #endif // _BCGPGRID_STANDALONE
  2316. /////////////////////////////////////////////////////////////////////////////
  2317. // CBCGPFontProp object
  2318. IMPLEMENT_DYNAMIC(CBCGPFontProp, CBCGPProp)
  2319. CBCGPFontProp::CBCGPFontProp(const CString& strName, LOGFONT& lf, DWORD dwFontDialogFlags, LPCTSTR lpszDescr, DWORD_PTR dwData, COLORREF color) :
  2320. CBCGPProp (strName, _variant_t((LPCTSTR)lf.lfFaceName), lpszDescr, dwData),
  2321. m_dwFontDialogFlags (dwFontDialogFlags)
  2322. {
  2323. m_dwFlags = PROP_HAS_BUTTON;
  2324. m_lf = lf;
  2325. m_lfOrig = lf;
  2326. m_bAllowEdit = FALSE;
  2327. m_Color = color;
  2328. }
  2329. //*****************************************************************************************
  2330. CBCGPFontProp::~CBCGPFontProp()
  2331. {
  2332. }
  2333. //****************************************************************************************
  2334. void CBCGPFontProp::OnClickButton (CPoint /*point*/)
  2335. {
  2336. ASSERT_VALID (this);
  2337. ASSERT_VALID (m_pWndList);
  2338. ASSERT_VALID (m_pWndInPlace);
  2339. ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
  2340. LOGFONT lfPrev = m_lf;
  2341. COLORREF nColorPrev = m_Color;
  2342. m_bButtonIsDown = TRUE;
  2343. Redraw ();
  2344. #pragma warning (disable : 4244)
  2345. CFontDialog dlg (&m_lf, m_dwFontDialogFlags, NULL, m_pWndList);
  2346. #pragma warning (default : 4244)
  2347. if (m_Color != (COLORREF)-1)
  2348. {
  2349. dlg.m_cf.rgbColors = m_Color;
  2350. }
  2351. if (dlg.DoModal () == IDOK)
  2352. {
  2353. dlg.GetCurrentFont (&m_lf);
  2354. m_Color = dlg.GetColor ();
  2355. if (memcmp (&lfPrev, &m_lf, sizeof (lfPrev) - sizeof (lfPrev.lfFaceName)) ||
  2356. _tcscmp( lfPrev.lfFaceName, m_lf.lfFaceName) ||
  2357. nColorPrev != m_Color)
  2358. {
  2359. m_pWndList->OnPropertyChanged (this);
  2360. }
  2361. if (m_pWndInPlace != NULL)
  2362. {
  2363. m_pWndInPlace->SetWindowText (FormatProperty ());
  2364. }
  2365. else
  2366. {
  2367. m_varValue = (LPCTSTR) FormatProperty ();
  2368. }
  2369. }
  2370. if (m_pWndInPlace != NULL)
  2371. {
  2372. m_pWndInPlace->SetFocus ();
  2373. }
  2374. else
  2375. {
  2376. m_pWndList->SetFocus ();
  2377. }
  2378. m_bButtonIsDown = FALSE;
  2379. Redraw ();
  2380. }
  2381. //*****************************************************************************
  2382. CString CBCGPFontProp::FormatProperty ()
  2383. {
  2384. CString str;
  2385. CWindowDC dc (m_pWndList);
  2386. int nLogY = dc.GetDeviceCaps (LOGPIXELSY);
  2387. if (nLogY != 0)
  2388. {
  2389. str.Format( _T("%s(%i)"), m_lf.lfFaceName, 
  2390. MulDiv (72, -m_lf.lfHeight, nLogY));
  2391. }
  2392. else
  2393. {
  2394. str = m_lf.lfFaceName;
  2395. }
  2396. return str;
  2397. }
  2398. //****************************************************************************************
  2399. void CBCGPFontProp::ResetOriginalValue ()
  2400. {
  2401. CBCGPProp::ResetOriginalValue ();
  2402. m_lf = m_lfOrig;
  2403. }
  2404. //****************************************************************************************
  2405. void CBCGPFontProp::CommitModifiedValue ()
  2406. {
  2407. CBCGPProp::CommitModifiedValue ();
  2408. m_lfOrig = m_lf;
  2409. }
  2410. /////////////////////////////////////////////////////////////////////////////
  2411. // CBCGPPropList
  2412. IMPLEMENT_DYNAMIC(CBCGPPropList, CWnd)
  2413. /////////////////////////////////////////////////////////////////////////////
  2414. // CBCGPPropList notification messages:
  2415. UINT BCGM_PROPERTY_CHANGED = ::RegisterWindowMessage (_T("BCGM_PROPERTYCHANGED"));
  2416. CBCGPPropList::CBCGPPropList()
  2417. {
  2418. m_hFont = NULL;
  2419. m_nEditLeftMargin = 0;
  2420. m_nBoldEditLeftMargin = 0;
  2421. m_bHeaderCtrl = TRUE;
  2422. m_bDescriptionArea = FALSE;
  2423. m_nDescrHeight = -1;
  2424. m_nDescrRows = 3;
  2425. m_bAlphabeticMode = FALSE;
  2426. m_bVSDotNetLook = FALSE;
  2427. m_rectList.SetRectEmpty ();
  2428. m_nLeftColumnWidth = 0;
  2429. m_rectTrackHeader.SetRectEmpty ();
  2430. m_rectTrackDescr.SetRectEmpty ();
  2431. m_nRowHeight = 0;
  2432. m_nHeaderHeight = 0;
  2433. m_nVertScrollOffset = 0;
  2434. m_nVertScrollTotal = 0;
  2435. m_nVertScrollPage = 0;
  2436. m_pSel = NULL;
  2437. m_bFocused = FALSE;
  2438. m_nTooltipsCount = 0;
  2439. m_bAlwaysShowUserTT = TRUE;
  2440. m_bTracking = FALSE;
  2441. m_bTrackingDescr = FALSE;
  2442. m_strTrue = _T("True");
  2443. m_strFalse = _T("False");
  2444. m_cListDelimeter = _T(',');
  2445. m_bControlBarColors = FALSE;
  2446. m_bGroupNameFullWidth = TRUE;
  2447. m_bShowDragContext = TRUE;
  2448. m_clrBackground = (COLORREF)-1;
  2449. m_clrText = (COLORREF)-1;
  2450. m_clrGroupBackground = (COLORREF)-1;
  2451. m_clrGroupText = (COLORREF)-1;
  2452. m_clrDescriptionBackground = (COLORREF)-1;
  2453. m_clrDescriptionText = (COLORREF)-1;
  2454. m_clrLine = (COLORREF)-1;
  2455. m_bMarkModifiedProperties = FALSE;