PageTreeCtrl.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:10k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 12/4/98 12:48:57 PM
  5.   Comments: PageTreeCtrl.cpp: implementation of the CPageTreeCtrl class.
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "xpropertieswnd.h"
  9. #include "PageTreeCtrl.h"
  10. #include "XPropertiesWndCtl.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. // Function name : CPageTreeCtrl::CPageTreeCtrl
  20. // Description     : default constructor
  21. // Return type : 
  22. CPageTreeCtrl::CPageTreeCtrl(CXPropertiesWndCtrl* pControl, int nHeight ):
  23. CPageListCtrl(pControl, nHeight)
  24. {
  25. }
  26. // Function name : CPageTreeCtrl::~CPageTreeCtrl
  27. // Description     : virtual destructor
  28. // Return type : 
  29. CPageTreeCtrl::~CPageTreeCtrl()
  30. {
  31. }
  32. BEGIN_MESSAGE_MAP(CPageTreeCtrl, CPageListCtrl)
  33. //{{AFX_MSG_MAP(CPageTreeCtrl)
  34. ON_WM_LBUTTONDOWN()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. // Function name : CPageTreeCtrl::OnInit
  38. // Description     : Called by control, when this page has to be initialized
  39. // Return type : BOOL 
  40. BOOL CPageTreeCtrl::OnInit()
  41. {
  42. ASSERT(m_allItemsList.Init(this));
  43. // Insert one column for tree representation
  44. InsertColumn(0, NULL, LVCFMT_LEFT, 16);
  45. return CPageListCtrl::OnInit();
  46. }
  47. static const int dRect = 9;
  48. static const int dDXPlus = 3;
  49. // Function name : CPageTreeCtrl::DrawMinus
  50. // Description     : 
  51. // Return type : void 
  52. // Argument         : CDC *pDC
  53. // Argument         : CPoint p
  54. void CPageTreeCtrl::DrawMinus(CDC *pDC, CPoint p)
  55. {
  56. //Draw the minus
  57. pDC->MoveTo(p);
  58. pDC->LineTo(p + CSize(dDXPlus,0));
  59. pDC->MoveTo(p);
  60. pDC->LineTo(p - CSize(dDXPlus,0));
  61. }
  62. // Function name : CPageTreeCtrl::DrawPlus
  63. // Description     : 
  64. // Return type : void 
  65. // Argument         : CDC *pDC
  66. // Argument         : CPoint p
  67. void CPageTreeCtrl::DrawPlus(CDC *pDC, CPoint p)
  68. {
  69. //Draw the plus
  70. pDC->MoveTo(p);
  71. pDC->LineTo(p + CSize(0, dDXPlus));
  72. pDC->MoveTo(p);
  73. pDC->LineTo(p - CSize(0, dDXPlus));
  74. }
  75. // Function name : CPageTreeCtrl::OnDrawItem
  76. // Description     : On draw item
  77. // Return type : void 
  78. void CPageTreeCtrl::OnBeginDrawItem( CDC* pDC, int nItem , LPARAM itemData)
  79. {
  80. if (IsGroupData(itemData))
  81. {
  82. CRect rLabel;
  83. GetItemRect(nItem, &rLabel, LVIR_LABEL);
  84. CRect rDraw(rLabel);
  85. rDraw.InflateRect(-CSize((rLabel.Width() - dRect) / 2, (rLabel.Height() - dRect) / 2));
  86. rDraw.right = rDraw.left + dRect;
  87. rDraw.bottom = rDraw.top + dRect;
  88. pDC->FrameRect(rDraw, &CBrush(RGB(128,128,128)));
  89. CPoint p((rDraw.left + rDraw.right)/2, (rDraw.top + rDraw.bottom)/2);
  90. DrawMinus(pDC, p);
  91. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(nItem);
  92. if (pGroup)
  93. if (!pGroup->IsExtended())
  94. DrawPlus(pDC, p);
  95. m_pDrawFont = GetControlWnd()->SelectStockFont(pDC);
  96. }
  97. else
  98. CPageListCtrl::OnBeginDrawItem( pDC, nItem, itemData );
  99. }
  100. // Function name : CPageTreeCtrl::OnFontChanged
  101. // Description     : Called when font is changed
  102. // Return type : void 
  103. void CPageTreeCtrl::OnFontChanged()
  104. {
  105. Invalidate();
  106. }
  107. // Function name : CPageTreeCtrl::InsertItemVrt
  108. // Description     : Called when new property is added into control
  109. // Return type : int 
  110. // Argument         : int nItem
  111. // Argument         : LPCTSTR lpszItemName
  112. // Argument         : LPARAM lParam
  113. // Description lParam parameter: MAKELPARAM(asControl, asType)
  114. int CPageTreeCtrl::InsertItemVrt(int nItem, LPCTSTR lpszItemName, LPARAM lParam, LPCTSTR lpszGroup)
  115. {
  116. int nResult = m_allItemsList.OnInsertItemVrt(nItem, lpszItemName, lParam, lpszGroup);
  117. if (IsGroupData(lParam))
  118. {
  119. int nGroup = CPageListCtrl::InsertItemVrt( nItem, lpszItemName, lParam , lpszGroup);
  120. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(nGroup, FALSE);
  121. // Group must be not deleted item...
  122. ASSERT (pGroup);
  123. pGroup->Update(&m_allItemsList);
  124. return nResult;
  125. }
  126. UpdateAllGroup();
  127. return nResult;
  128. }
  129. // Function name : CPageTreeCtrl::UpdateAllGroup
  130. // Description     : Update all group
  131. // Return type : void 
  132. void CPageTreeCtrl::UpdateAllGroup()
  133. {
  134. // We have to search all group and update them
  135. int n = GetItemCount();
  136. for (int i = 0; i < n; i++)
  137. if (IsGroup(i))
  138. {
  139. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(i, FALSE);
  140. ASSERT (pGroup);
  141. pGroup->Update(&m_allItemsList);
  142. }
  143. }
  144. // Function name : CPageTreeCtrl::DeleteItemVrt
  145. // Description     : Called when a propery need to be deleted
  146. // Return type : BOOL 
  147. // Argument         : int nItem
  148. BOOL CPageTreeCtrl::DeleteItemVrt(int nItem)
  149. {
  150. return CPageListCtrl::DeleteItemVrt(nItem);
  151. }
  152. // Function name : CPageTreeCtrl::Expand
  153. // Description     : 
  154. // Return type : void 
  155. // Argument         : int nItem
  156. // Argument         : BOOL &bExppanded
  157. void CPageTreeCtrl::Expand(int nItem, BOOL &bExppanded)
  158. {
  159. ResetEditControl();
  160. BOOL bVisible = GetStyle() & WS_VISIBLE;
  161. BOOL bVScroll = GetStyle() & WS_VSCROLL;
  162. ModifyStyle(WS_VISIBLE, 0, SWP_NOREDRAW);
  163. // Item nItem have to be a group item
  164. ASSERT(IsGroup(nItem));
  165. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(nItem, FALSE);
  166. ASSERT (pGroup);
  167. TArrayIDItem* pChilds = pGroup->GetChilds();
  168. int n = pChilds->GetSize();
  169. bExppanded = !bExppanded;
  170. // Prepare controls
  171. if (int nStep = bExppanded ? n : -n)
  172. {
  173. int nCount = GetItemCount();
  174. if ( bExppanded )
  175. {
  176. for (int j = nCount - 1; j >= nItem + 1; j--)
  177. if (CControlsWnd* pControl = GetControl(j))
  178. pControl->RefreshNDelete(pControl, pControl->GetSelectedItem()  + nStep );
  179. }
  180. else
  181. {
  182. for (int j = nItem + 1; j < nCount; j++ )
  183. if (CControlsWnd* pControl = GetControl(j))
  184. if (pControl->IsGroup())
  185. pControl->RefreshNDelete(pControl, pControl->GetSelectedItem()  + nStep);
  186. else
  187. pControl->Kill();
  188. }
  189. }
  190. // expand the item
  191. if (bExppanded)
  192. {
  193. int nNextItem = 1 + nItem;
  194. for (int i = 0; i < n; i++)
  195. {
  196. int nItem = (*pChilds)[i], nInserted;
  197. nNextItem = 1 + (nInserted = CPageListCtrl::InsertItemVrt(nNextItem, m_allItemsList.GetName(nItem), m_allItemsList.GetUserData(nItem), m_allItemsList.GetGroup(nItem)));
  198. CString sValue = m_allItemsList.GetValue(nItem);
  199. SetDefaultValue(nInserted, sValue);
  200. }
  201. }
  202. else
  203. // collapse it
  204. for (int i = 0; i < n; i++)
  205. CPageListCtrl::DeleteItemVrt(nItem + 1);
  206. EnsureVisible(nItem, TRUE);
  207. RedrawItems(nItem, nItem);
  208. ModifyStyle(0, WS_VISIBLE, SWP_NOREDRAW);
  209. InvalidateNew();
  210. BOOL bNVscroll = GetStyle() & WS_VSCROLL;
  211. if (bVScroll != bNVscroll)
  212. if (bNVscroll)
  213. {
  214. //Redraw the nc area of vertical scrool bar
  215. SetWindowPos(0, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_DRAWFRAME);
  216. }
  217. CreateEditControl(nItem);
  218. }
  219. // Function name : CPageTreeCtrl::OnLoad
  220. // Description     : 
  221. // Return type : int 
  222. // Argument         : LPCTSTR lpszName
  223. // Argument         : LPCTSTR lpszAs
  224. // Argument         : LPCTSTR lpszType
  225. // Argument         : LPCTSTR lpszGroup
  226. int CPageTreeCtrl::OnLoad(LPCTSTR lpszName, LPCTSTR lpszAs, LPCTSTR lpszType, LPCTSTR lpszGroup)
  227. {
  228. static const CString enable(_T("Enable"));
  229. static const CString grayed(_T("Grayed"));
  230. int nItem = InsertItemVrt(m_allItemsList.GetItemCount(), lpszName, MAKELPARAM(m_asControls.GetID(lpszAs), enable.CompareNoCase(lpszType) == 0 ? 0 : (grayed.CompareNoCase(lpszType)) == 0 ? 1 : 2), lpszGroup);
  231. return nItem;
  232. }
  233. // Function name : CPageTreeCtrl::SetPropertyName
  234. // Description     : PageTreeCtrl do not accepts the changing one property name
  235. // Return type : void 
  236. // Argument         : int nIndexProperty
  237. // Argument         : LPCTSTR lpszPropertyName
  238. void CPageTreeCtrl::SetPropertyName(int nIndexProperty, LPCTSTR lpszPropertyName)
  239. {
  240. // do nothing
  241. }
  242. // Function name : CPageTreeCtrl::SetDefaultValue
  243. // Description     : Don't forget to save the default value into m_allItemsList
  244. // Return type : BOOL 
  245. // Argument         : int nIndexProperty
  246. // Argument         : LPCTSTR lpszdefaultValue
  247. BOOL CPageTreeCtrl::SetDefaultValue(int nIndexProperty, LPCTSTR lpszdefaultValue)
  248. {
  249. BOOL bResult = CPageListCtrl::SetDefaultValue(nIndexProperty, lpszdefaultValue );
  250. if (bResult)
  251. if (!IsGroup(nIndexProperty))
  252. {
  253. int nIndexGroup = nIndexProperty;
  254. while (--nIndexGroup >= 0)
  255. if (IsGroup(nIndexGroup))
  256. {
  257. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(nIndexGroup);
  258. int nIndex = nIndexProperty - nIndexGroup - 1;
  259. ASSERT (nIndex >= 0 );
  260. ASSERT (nIndex <  pGroup->GetChilds()->GetSize());
  261. m_allItemsList.SetValue(pGroup->GetChilds()->GetAt(nIndex), lpszdefaultValue);
  262. break;
  263. }
  264. }
  265. return bResult;
  266. }
  267. // Function name : CPageTreeCtrl::IsGroup
  268. // Description     : return TRUE if the item nItem is group or not
  269. // Return type : BOOL 
  270. // Argument         : int nItem
  271. BOOL CPageTreeCtrl::IsGroup(int nItem)
  272. {
  273. if (nItem >= 0)
  274. if (nItem < GetItemCount())
  275. {
  276. LPARAM lParam = GetItemData(nItem);
  277. return IsGroupData(lParam);
  278. }
  279. return FALSE;
  280. }
  281. // Function name : CPageTreeCtrl::IsGroupData
  282. // Description     : 
  283. // Return type : BOOL 
  284. // Argument         : DWORD lParam
  285. BOOL CPageTreeCtrl::IsGroupData(DWORD lParam)
  286. {
  287. return m_asControls.IsGroup(LOWORD(lParam));
  288. }
  289. // Function name : CPageTreeCtrl::DeleteAll
  290. // Description     : Called to remove all items
  291. // Return type : void 
  292. void CPageTreeCtrl::DeleteAll()
  293. {
  294. CPageListCtrl::DeleteAll();
  295. m_allItemsList.DeleteAllItems();
  296. }
  297. // Function name : CPageTreeCtrl::OnLButtonDown
  298. // Description     : Check if user click in first column....
  299. // Return type : void 
  300. // Argument         : UINT nFlags
  301. // Argument         : CPoint point
  302. void CPageTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  303. {
  304. CPageListCtrl::OnLButtonDown(nFlags, point);
  305. int nItem = HitTest(point);
  306. if (nItem >= 0)
  307. {
  308. CRect rect; GetItemRect(nItem, &rect, LVIR_LABEL );
  309. if (rect.PtInRect(point))
  310. if (IsGroup(nItem))
  311. {
  312. CControlsWnd_CGroup* pGroup = (CControlsWnd_CGroup*)GetControl(nItem);
  313. ASSERT (pGroup);
  314. Expand(nItem, pGroup->m_bExpanded);
  315. }
  316. }
  317. }