PropertyGridExtItemDegree.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #include "stdafx.h"
  2. #include "PropertyGridInplaceEdit.h"
  3. #include "PropertyGridInplaceButton.h"
  4. #include "PropertyGridInplaceList.h"
  5. #include "PropertyGridItem.h"
  6. #include "PropertyGridExtItemDegree.h"
  7. #include "PropertyGrid.h"
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CInplaceDegreeEdit
  10. /////////////////////////////////////////////////////////////////////////////
  11. CInplaceDegreeEdit::CInplaceDegreeEdit(int nSecondPrecision)
  12. : CDegreeEdit(nSecondPrecision)
  13. , m_pItem(0)
  14. , m_pGrid(0)
  15. {
  16. }
  17. CInplaceDegreeEdit::~CInplaceDegreeEdit()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CInplaceDegreeEdit, CDegreeEdit)
  21. //{{AFX_MSG_MAP(CInplaceDegreeEdit)
  22. ON_WM_CTLCOLOR_REFLECT()
  23. ON_CONTROL_REFLECT(EN_KILLFOCUS, OnEnKillfocus)
  24. ON_CONTROL_REFLECT(EN_SETFOCUS, OnEnSetfocus)
  25. ON_WM_LBUTTONDBLCLK()
  26. ON_WM_GETDLGCODE()
  27. ON_WM_KEYDOWN()
  28. ON_WM_CHAR()
  29. //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()
  31. void CInplaceDegreeEdit::SetValue(CString strValue)
  32. {
  33. m_strValue = strValue;
  34. }
  35. void CInplaceDegreeEdit::Create(CPropertyGridExtItemDegree* pItem, CRect rect)
  36. {
  37. ASSERT(pItem && pItem->GetGrid());
  38. m_pGrid = pItem->GetGrid();
  39. m_pItem = pItem;
  40. if (!m_hWnd)
  41. {
  42. CDegreeEdit::Create(WS_CHILD|ES_AUTOHSCROLL, rect, m_pGrid, 0);
  43. }
  44. SetWindowText(m_strValue);
  45. SetWindowPos(0, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);
  46. }
  47. HBRUSH CInplaceDegreeEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
  48. {
  49. pDC->SetTextColor(GetStyle() & ES_READONLY ? GetSysColor(COLOR_GRAYTEXT): ((CPropertyGridView*)m_pGrid)->m_clrFore);
  50. COLORREF clr = ((CPropertyGridView*)m_pGrid)->m_clrBack;
  51. if (clr != m_clrBack || !m_brBack.GetSafeHandle())
  52. {
  53. m_brBack.DeleteObject();
  54. m_brBack.CreateSolidBrush(clr);
  55. m_clrBack = clr;
  56. }
  57. pDC->SetBkColor(m_clrBack);
  58. return m_brBack;
  59. }
  60. void CInplaceDegreeEdit::OnEnSetfocus()
  61. {
  62. ASSERT(m_pItem && m_pGrid);
  63. m_pGrid->Invalidate(FALSE);
  64. }
  65. void CInplaceDegreeEdit::OnEnKillfocus()
  66. {
  67. if (m_pItem)
  68. {
  69. m_pItem->OnValidateEdit();
  70. m_pGrid->Invalidate(FALSE);
  71. }
  72. }
  73. UINT CInplaceDegreeEdit::OnGetDlgCode()
  74. {
  75. return DLGC_WANTALLKEYS;
  76. }
  77. void CInplaceDegreeEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
  78. {
  79. if (nChar == VK_TAB) return;
  80. if (nChar == VK_ESCAPE || nChar == VK_RETURN)
  81. {
  82. m_pGrid->SetFocus();
  83. return;
  84. }
  85. CDegreeEdit::OnChar(nChar, nRepCnt, nFlags);
  86. }
  87. void CInplaceDegreeEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  88. {
  89. if (nChar == VK_TAB)
  90. {
  91. CWnd* pParent = m_pGrid->GetParent();
  92. if (!pParent || !pParent->GetParent())
  93. {
  94. ASSERT(FALSE);
  95. return;
  96. }
  97. CWnd* pWndNext = pParent->GetParent()->GetNextDlgTabItem( pParent, ::GetKeyState(VK_SHIFT) < 0 );
  98. if (pWndNext != NULL)
  99. {
  100. pWndNext->SetFocus();
  101. }
  102. return;
  103. }
  104. else if (nChar == VK_ESCAPE)
  105. {
  106. SetWindowText(m_strValue);
  107. return;
  108. }
  109. else if (nChar == VK_RETURN)
  110. {
  111. return;
  112. }
  113. else if (nChar == VK_DOWN || nChar == VK_UP)
  114. {
  115. if (SelectConstraint(nChar == VK_DOWN? +1: -1, FALSE))
  116. {
  117. MaskSelectAll();
  118. return;
  119. }
  120. }
  121. CDegreeEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  122. }
  123. BOOL CInplaceDegreeEdit::SelectConstraint(int nDirection, BOOL bCircle)
  124. {
  125. CPGItemConstraints* pList = m_pItem->GetConstraints();
  126. if (pList->IsEmpty())
  127. return FALSE;
  128. CString str;
  129. GetWindowText(str);
  130. int nIndex = pList->FindConstraint( str );
  131. nIndex+= nDirection;
  132. if (nIndex >= pList->GetCount()) nIndex = bCircle ? 0 : (ULONG)pList->GetCount() - 1;
  133. if (nIndex < 0) nIndex = bCircle ? (ULONG)pList->GetCount() - 1 : 0;
  134. POSITION pos = pList->FindIndex(nIndex);
  135. SetWindowText( pList->GetAt(pos) );
  136. return TRUE;
  137. }
  138. void CInplaceDegreeEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
  139. {
  140. if (m_pItem != NULL && !m_pItem->GetReadOnly() && SelectConstraint(+1, TRUE))
  141. {
  142. m_pGrid->SetFocus();
  143. return;
  144. }
  145. CDegreeEdit::OnLButtonDblClk(nFlags, point);
  146. }
  147. void CInplaceDegreeEdit::DestroyItem()
  148. {
  149. // reset variables to defaults.
  150. m_pItem = NULL;
  151. m_pGrid = NULL;
  152. m_strValue.Empty();
  153. m_brBack.DeleteObject();
  154. // destroy the window.
  155. DestroyWindow( );
  156. }
  157. /////////////////////////////////////////////////////////////////////////////
  158. // CPropertyGridExtItemDegree
  159. /////////////////////////////////////////////////////////////////////////////
  160. CPropertyGridExtItemDegree::CPropertyGridExtItemDegree(CString strCaption, double fDegree, int nSecondPrecision)
  161. : CPropertyGridItem(strCaption)
  162. , m_wndDegreeEdit(nSecondPrecision)
  163. {
  164. m_wndDegreeEdit.m_pItem = this;
  165. m_pBindDegree = NULL;
  166. m_nFlags = pgitemHasEdit;
  167. m_nSecondPrecision = nSecondPrecision;
  168. SetDegree(fDegree);
  169. }
  170. CPropertyGridExtItemDegree::CPropertyGridExtItemDegree(UINT nID, double fDegree, int nSecondPrecision)
  171. : CPropertyGridItem(nID)
  172. , m_wndDegreeEdit(nSecondPrecision)
  173. {
  174. m_wndDegreeEdit.m_pItem = this;
  175. m_pBindDegree = NULL;
  176. m_nFlags = pgitemHasEdit;
  177. m_nSecondPrecision = nSecondPrecision;
  178. SetDegree(fDegree);
  179. }
  180. CPropertyGridExtItemDegree::~CPropertyGridExtItemDegree()
  181. {
  182. m_wndDegreeEdit.DestroyItem();
  183. }
  184. void CPropertyGridExtItemDegree::SetDegree(double fDegree)
  185. {
  186. m_fDegree = fDegree;
  187. CPropertyGridItem::SetValue( CDegreeEdit::DegreeToString(m_fDegree, m_nSecondPrecision) );
  188. if (m_pBindDegree)
  189. *m_pBindDegree = m_fDegree;
  190. }
  191. double CPropertyGridExtItemDegree::GetDegree()
  192. {
  193. return m_fDegree;
  194. }
  195. void CPropertyGridExtItemDegree::SetValue(CString strValue)
  196. {
  197. SetDegree(CDegreeEdit::StringToDegree(strValue));
  198. }
  199. void CPropertyGridExtItemDegree::OnValidateEdit()
  200. {
  201. if (m_wndDegreeEdit.GetSafeHwnd())
  202. {
  203. m_wndDegreeEdit.ShowWindow(SW_HIDE);
  204. CString strValue;
  205. m_wndDegreeEdit.GetWindowText(strValue);
  206. if (m_strValue != strValue)
  207. {
  208. OnValueChanged(strValue);
  209. m_pGrid->Invalidate(FALSE);
  210. }
  211. }
  212. }
  213. void CPropertyGridExtItemDegree::SetEditText(CString str)
  214. {
  215. if (!m_pGrid) return;
  216. if (m_wndDegreeEdit.GetSafeHwnd())
  217. m_wndDegreeEdit.SetWindowText(str);
  218. }
  219. void CPropertyGridExtItemDegree::OnSelect()
  220. {
  221. ASSERT(m_bVisible);
  222. if (!m_bReadOnly && (m_nFlags & (pgitemHasComboButton | pgitemHasExpandButton)))
  223. {
  224. GetInplaceButton().Create(this, GetItemRect());
  225. }
  226. if (m_nFlags & pgitemHasEdit)
  227. {
  228. m_wndDegreeEdit.SetValue(m_strValue);
  229. m_wndDegreeEdit.Create(this, GetValueRect());
  230. m_wndDegreeEdit.SetReadOnly(m_bReadOnly);
  231. m_wndDegreeEdit.SetFont(GetGrid()->GetFont());
  232. m_wndDegreeEdit.SetMargins(3, 0);
  233. }
  234. }
  235. BOOL CPropertyGridExtItemDegree::OnChar(UINT nChar)
  236. {
  237. if (m_nFlags & pgitemHasEdit)
  238. {
  239. OnSelect();
  240. m_wndDegreeEdit.SetFocus();
  241. m_wndDegreeEdit.MaskSelectAll();
  242. if (nChar != VK_TAB) m_wndDegreeEdit.SendMessage(WM_CHAR, nChar);
  243. return TRUE;
  244. }
  245. return FALSE;
  246. }
  247. void CPropertyGridExtItemDegree::OnLButtonDblClk()
  248. {
  249. if (HasChilds())
  250. {
  251. if(m_bExpanded) Collapse(); else Expand();
  252. }
  253. else
  254. {
  255. OnSelect();
  256. if (m_nFlags & pgitemHasEdit)
  257. {
  258. if (!GetReadOnly() && m_wndDegreeEdit.SelectConstraint(+1, TRUE))
  259. {
  260. OnValidateEdit();
  261. }
  262. else
  263. {
  264. m_wndDegreeEdit.SetFocus();
  265. m_wndDegreeEdit.MaskSelectAll();
  266. }
  267. }
  268. else if (!GetReadOnly())
  269. {
  270. CPGItemConstraints* pList = GetConstraints();
  271. if (pList->IsEmpty())
  272. return ;
  273. int nIndex = pList->FindConstraint(m_strValue);
  274. nIndex += +1;
  275. if (nIndex >= pList->GetCount()) nIndex = 0;
  276. POSITION pos = pList->FindIndex(nIndex);
  277. OnValueChanged(pList->GetAt(pos));
  278. }
  279. }
  280. }
  281. void CPropertyGridExtItemDegree::BindToDegree(double* pBindDegree)
  282. {
  283. m_pBindDegree = pBindDegree;
  284. if (m_pBindDegree)
  285. SetDegree(*m_pBindDegree);
  286. }