GroupTree.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // GroupTree.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "cp_main.h"
  5. #include "GroupTree.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CGroupTree
  13. CGroupTree::CGroupTree()
  14. {
  15. m_bHide = true;
  16. m_lSelectedFolderID = -1;
  17. m_bSendAllready = false;
  18. }
  19. CGroupTree::~CGroupTree()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CGroupTree, CTreeCtrl)
  23. //{{AFX_MSG_MAP(CGroupTree)
  24. ON_WM_CREATE()
  25. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  26. ON_WM_KILLFOCUS()
  27. ON_WM_ACTIVATE()
  28. ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
  29. ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CGroupTree message handlers
  34. BOOL CGroupTree::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  35. {
  36. // TODO: Add your specialized code here and/or call the base class
  37. return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  38. }
  39. int CGroupTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
  40. {
  41. if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  42. return -1;
  43. CImageList iml;
  44. iml.Create(18, 16, ILC_COLOR8, 0, 1);
  45. m_bmClosedFolder.LoadBitmap(IDB_CLOSED_FOLDER);
  46. iml.Add(&m_bmClosedFolder, RGB(255, 0, 0));
  47. m_bmOpenFolder.LoadBitmap(IDB_OPEN_FOLDER);
  48. iml.Add(&m_bmOpenFolder, RGB(255, 0, 0));
  49. SetImageList(&iml, TVSIL_NORMAL);
  50. iml.Detach();
  51. return 0;
  52. }
  53. void CGroupTree::FillTree()
  54. {
  55. DeleteAllItems();
  56. m_bSendAllready = false;
  57. HTREEITEM hItem = InsertItem("Root", TVI_ROOT);
  58. SetItemData(hItem, 0);
  59. SetItemState(hItem, TVIS_EXPANDED, TVIS_EXPANDED);
  60. if(m_lSelectedFolderID < 0)
  61. SelectItem(hItem);
  62. FillTree(0, hItem);
  63. }
  64. void CGroupTree::FillTree(long lParentID, HTREEITEM hParent)
  65. {
  66. try
  67. {
  68. CMainTable recset;
  69. recset.m_strFilter.Format("bIsGroup = TRUE AND lParentID = %d", lParentID);
  70. recset.Open();
  71. if(recset.IsEOF() == FALSE)
  72. {
  73. HTREEITEM hItem;
  74. while(!recset.IsEOF())
  75. {
  76. if(recset.m_lID == m_lSelectedFolderID)
  77. {
  78. hItem = InsertItem(recset.m_strText, 1, 1, hParent);
  79. SelectItem(hItem);
  80. }
  81. else
  82. {
  83. hItem = InsertItem(recset.m_strText, 0, 0, hParent);
  84. }
  85. SetItemData(hItem, recset.m_lID);
  86. FillTree(recset.m_lID, hItem);
  87. recset.MoveNext();
  88. }
  89. }
  90. }
  91. catch(CDaoException* e)
  92. {
  93. ASSERT(FALSE);
  94. e->Delete();
  95. return;
  96. }
  97. }
  98. void CGroupTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
  99. {
  100. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  101. // TODO: Add your control notification handler code here
  102. // if(m_bHide == true)
  103. // {
  104. // ::SendMessage(m_NotificationWnd, NM_GROUP_TREE_MESSAGE, GetItemData(pNMTreeView->itemNew.hItem), 0);
  105. // }
  106. *pResult = 0;
  107. }
  108. void CGroupTree::OnKillFocus(CWnd* pNewWnd)
  109. {
  110. TRACE("TREE Kill Focus\n");
  111. CTreeCtrl::OnKillFocus(pNewWnd);
  112. }
  113. void CGroupTree::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  114. {
  115. CTreeCtrl::OnActivate(nState, pWndOther, bMinimized);
  116. if(m_bHide)
  117. {
  118. if (nState == WA_INACTIVE)
  119. {
  120. TRACE("TREE Inactivate\n");
  121. SendToParent(-1);
  122. }
  123. }
  124. }
  125. void CGroupTree::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
  126. {
  127. TRACE("Dbl Click\n");
  128. HTREEITEM hItem = GetNextItem(TVI_ROOT, TVGN_CARET);
  129. if(hItem)
  130. SendToParent(GetItemData(hItem));
  131. *pResult = 1;
  132. }
  133. long CGroupTree::GetSelectedTree()
  134. {
  135. HTREEITEM hItem = GetNextItem(TVI_ROOT, TVGN_CARET);
  136. if(hItem)
  137. return (long)GetItemData(hItem);
  138. return -1;
  139. }
  140. void CGroupTree::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
  141. {
  142. TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  143. switch(pTVKeyDown->wVKey)
  144. {
  145. case VK_RETURN:
  146. {
  147. TRACE("Return\n");
  148. HTREEITEM hItem = GetNextItem(TVI_ROOT, TVGN_CARET);
  149. if(hItem)
  150. SendToParent(GetItemData(hItem));
  151. break;
  152. }
  153. case VK_ESCAPE:
  154. {
  155. TRACE("Escape\n");
  156. SendToParent(-1);
  157. break;
  158. }
  159. }
  160. *pResult = 1;
  161. }
  162. void CGroupTree::SendToParent(long lID)
  163. {
  164. if(m_bSendAllready == false)
  165. {
  166. m_bSendAllready = true;
  167. ::PostMessage(m_NotificationWnd, NM_GROUP_TREE_MESSAGE, lID, 0);
  168. }
  169. }
  170. bool CGroupTree::AddNode(CString csText, long lID)
  171. {
  172. HTREEITEM hItem;
  173. HTREEITEM hParent = GetNextItem(TVI_ROOT, TVGN_CARET);
  174. if(hParent == NULL)
  175. return false;
  176. hItem = InsertItem(csText, 1, 1, hParent);
  177. SelectItem(hItem);
  178. SetItemData(hItem, lID);
  179. return true;
  180. }