tfilltree.h
上传用户:louyoung
上传日期:2007-01-02
资源大小:123k
文件大小:3k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 6/11/98 2:28:47 PM
  5.   Comments: Header of struct STFillTree and _STSeparators
  6.  ************************************/
  7. #if !defined(AFX_FILLTREE_H__INCLUDED_)
  8. #define AFX_FILLTREE_H__INCLUDED_
  9. #include "stdafx.h"
  10. #include "TreeCtrlMultiColumn.h"
  11. struct _STSeparatorsMultiColumn {
  12. static CString separators;  // contain charcters: "(,)"
  13. static TCHAR separatorItem;
  14. CTreeMultiColumnCtrl* m_pTreeCtrl; // tree control destination
  15. // Function name : _STSeparatorsMultiColumn
  16. // Description     : Constructor
  17. // Return type : 
  18. // Argument         : CTreeMultiColumnCtrl* pTreeCtrl
  19. _STSeparatorsMultiColumn(CTreeMultiColumnCtrl* pTreeCtrl)
  20. {
  21. m_pTreeCtrl = pTreeCtrl;
  22. ASSERT (m_pTreeCtrl);
  23. };
  24. // Function name : Action
  25. // Description     : 
  26. // Return type : void 
  27. // Argument         : int& n
  28. // Argument         : int nParent
  29. // Argument         : TCHAR c
  30. void Action(int& n, int nParent, TCHAR c)
  31. {
  32. switch (c)
  33. {
  34. case TCHAR(','):
  35. n = nParent;
  36. break;
  37. case TCHAR(')'):
  38. n = m_pTreeCtrl->GetItemParent(nParent);
  39. break;
  40. case TCHAR('('):
  41. break;
  42. }
  43. };
  44. };
  45. struct STFillTreeMultiColumn {
  46. CTreeMultiColumnCtrl* m_pTreeCtrl;
  47. CString m_sItems;
  48. _STSeparatorsMultiColumn* m_oSep;
  49. STFillTreeMultiColumn (CWnd* pTreeCtrl, LPCTSTR lpszItems): m_sItems(lpszItems)
  50. {
  51. m_pTreeCtrl = (CTreeMultiColumnCtrl*)pTreeCtrl;
  52. ASSERT (m_pTreeCtrl && ::IsWindow(m_pTreeCtrl->m_hWnd));
  53. m_oSep = new _STSeparatorsMultiColumn(m_pTreeCtrl);
  54. };
  55. ~STFillTreeMultiColumn()
  56. {
  57. delete m_oSep;
  58. };
  59. virtual void Fill()
  60. {
  61. m_pTreeCtrl->DeleteAllItems();
  62. RecFill();
  63. };
  64. // Function name : AddItem
  65. // Description     : 
  66. // Return type : virtual int 
  67. // Argument         : CString* psItem
  68. // Argument         : int nParent
  69. virtual int AddItem(CString* psItem, int nParent)
  70. {
  71. int rnItem = nParent;
  72. if (!psItem->IsEmpty())
  73. {
  74. CString sItem;
  75. AfxExtractSubString(sItem, (LPCTSTR)*psItem, 0, _STSeparatorsMultiColumn::separatorItem);
  76. rnItem = m_pTreeCtrl->InsertItem(m_pTreeCtrl->GetItemCount(), sItem);
  77. for (int i = 1; i < m_pTreeCtrl->GetCountColumn(); i++)
  78. {
  79. AfxExtractSubString(sItem, (LPCTSTR)*psItem, i, _STSeparatorsMultiColumn::separatorItem);
  80. m_pTreeCtrl->SetItemText(rnItem, i, sItem);
  81. }
  82. if (nParent >= 0)
  83. m_pTreeCtrl->SetItemParent(rnItem, nParent);
  84. }
  85. return rnItem;
  86. };
  87. // Function name : RecFill
  88. // Description     : Recursive fill
  89. // Return type : void 
  90. // Argument         : int nCurrent = 0 : position in string
  91. // Argument         : int nParent = -1 ; as root item
  92. void RecFill(int nCurrent = 0, int nParent = -1)
  93. {
  94. int n = nParent;
  95. CString sItems = m_sItems.Mid(nCurrent);
  96. int nSeparator = sItems.FindOneOf(m_oSep->separators);
  97. if (nSeparator < 0)
  98. AddItem(&sItems, nParent);
  99. else
  100. {
  101. n = AddItem(&sItems.Left(nSeparator), nParent);
  102. m_oSep->Action(n, nParent, sItems[nSeparator]);
  103. RecFill(nCurrent + nSeparator + 1, n);
  104. }
  105. };
  106. };
  107. #endif //AFX_FILLTREE_H__INCLUDED_