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

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 5/22/98 9:22:52 AM
  5.   Comments: TSortColumn.cpp: implementation of the CTSortColumns class.
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "TSortColumn.h"
  9. #include "tsyslistviewex.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. // Function name : ShowProgressBar
  19. // Description     : Shows progress bar indicator
  20. // Return type : void 
  21. // Argument         : CTSortColumns* pSort
  22. void ShowProgressBar(CTSortColumns* pSort)
  23. {
  24. pSort->m_pListCtrl->Progress((int)((double)pSort->m_nCmpsCur++ / pSort->m_nCmpsMax * 100));
  25. }
  26. // Function name : HideProgressBar
  27. // Description     : Hides progress bar indicator
  28. // Return type : void 
  29. // Argument         : CTSortColumns* pSort
  30. void HideProgressBar(CTSortColumns* pSort)
  31. {
  32. return;
  33. }
  34. // Function name : CTSortColumns::CTSortColumns
  35. // Description     : Constructor
  36. // Return type :  -
  37. CTSortColumns::CTSortColumns()
  38. {
  39. m_pListCtrl = NULL;
  40. m_nOrderColumn = 0;
  41. m_nCmpsMax = 0;
  42. m_nCmpsCur = 0;
  43. }
  44. // Function name : CTSortColumns::~CTSortColumns
  45. // Description     : Destructor
  46. // Return type : -
  47. CTSortColumns::~CTSortColumns()
  48. {
  49. m_mapColumnsSort.RemoveAll();
  50. ResetOrderColumn();
  51. }
  52. // Function name : CTSortColumns::AttachControl
  53. // Description     : Attach a control to the table
  54. // Return type : void 
  55. // Argument         : CTsyslistviewex * pListCtrl ; control to attach
  56. void CTSortColumns::AttachControl(CTsyslistviewex * pListCtrl)
  57. {
  58. m_pListCtrl = pListCtrl;
  59. }
  60. // Function name : CTSortColumns::Delete
  61. // Description     : Delete a sort column
  62. // Return type : void 
  63. // Argument         : int nColumn
  64. void CTSortColumns::Delete(int nColumn)
  65. {
  66. m_mapColumnsSort.RemoveKey(nColumn);
  67. }
  68. // Function name : CTSortColumns::Add
  69. // Description     : Add a sort column with callback function for comparation
  70. // Return type : void 
  71. // Argument         : int nColumn
  72. // Argument         : COLUMNCALLBACKCOMPARE pCallBackCompare
  73. void CTSortColumns::Add(int nColumn, COLUMNCALLBACKCOMPARE pCallBackCompare)
  74. {
  75. ASSERT ( pCallBackCompare != NULL);
  76. ASSERT ( m_pListCtrl != NULL );
  77. m_mapColumnsSort[nColumn] = pCallBackCompare;
  78. }
  79. // Function name : CTSortColumns::ResetOrderColumn
  80. // Description     : Remove all sort columns from this object
  81. // Return type : void 
  82. void CTSortColumns::ResetOrderColumn()
  83. {
  84. for (int i = 0; i < m_arOrderColumn.GetSize(); i++)
  85. delete m_arOrderColumn[i];
  86. m_arOrderColumn.RemoveAll();
  87. m_nOrderColumn = 0 ;
  88. }
  89. // Function name : CTSortColumns::AddOrderColumn
  90. // Description     : New sort column
  91. // Return type : void 
  92. // Argument         : int nColumn
  93. // Argument         : short nAsc
  94. void CTSortColumns::AddOrderColumn(int nColumn, short nAsc)
  95. {
  96. ASSERT (m_pListCtrl != NULL);
  97. ASSERT (nAsc != 0);
  98. ASSERT (nAsc == 1 || nAsc == -1);
  99. if (ColumnOrder* pColumnOrder = new ColumnOrder(nColumn, nAsc))
  100. {
  101. m_arOrderColumn.Add(pColumnOrder);
  102. m_nOrderColumn++;
  103. COLUMNCALLBACKCOMPARE pCallBackCompare  = NULL;;
  104. if (!m_mapColumnsSort.Lookup(nColumn, pCallBackCompare))
  105. m_mapColumnsSort[nColumn] = strcmp;
  106. }
  107. }
  108. // Function name : CTSortColumns::GetCountOrderColumn
  109. // Description     : Get number of order columns
  110. // Return type : int 
  111. int CTSortColumns::GetCountOrderColumn() const
  112. {
  113. return m_nOrderColumn;
  114. }
  115. // Function name : CompareFuncUni 
  116. // Description     : Function for compare an unique column. For speed only.
  117. // Return type : int CALLBACK 
  118. // Argument         : LPARAM lParam1
  119. // Argument         : LPARAM lParam2
  120. // Argument         : LPARAM lParamSort
  121. int CALLBACK CompareFuncUni (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  122. {
  123. CompareColumnOrder* pCco = (CompareColumnOrder*)lParamSort;
  124. int result = pCco->m_pCallBackCompare ( ((SItemStructUni*)lParam1)->m_strItemText, ((SItemStructUni*)lParam2)->m_strItemText );
  125. result *= pCco->m_nAsc;
  126. return result;
  127. }
  128. // Function name : CompareFuncMulti 
  129. // Description     : Function for compare more columns.
  130. // Return type : int CALLBACK 
  131. // Argument         : LPARAM lParam1
  132. // Argument         : LPARAM lParam2
  133. // Argument         : LPARAM lParamSort
  134. int CALLBACK CompareFuncMulti (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  135. {
  136. CTSortColumns* pSort = (CTSortColumns*)lParamSort;
  137. SItemStruct* pItemTextDataI = (SItemStruct*)lParam1;
  138. SItemStruct* pItemTextDataJ = (SItemStruct*)lParam2;
  139. pSort->m_pFctShowProgressBar(pSort);
  140. register int result = 0;
  141. for (int i = 0; (i < pSort->m_nOrderColumn) && (result == 0); i++)
  142. {
  143. COLUMNCALLBACKCOMPARE pCallBackCompare = NULL;;
  144. pSort->m_mapColumnsSort.Lookup(pSort->m_arOrderColumn[i]->m_nColumn, pCallBackCompare);
  145. ASSERT( pCallBackCompare  != NULL);
  146. result = pCallBackCompare ( pItemTextDataI->m_arStrItemText[i], pItemTextDataJ->m_arStrItemText[i] );
  147. result *= pSort->m_arOrderColumn[i]->m_nAsc;
  148. }
  149. return result;
  150. }
  151. // Function name : CTSortColumns::SortMultiColumn
  152. // Description     : Sort more columns.
  153. // Return type : void 
  154. void CTSortColumns::SortMultiColumn()
  155. {
  156. CListCtrl* pListCtrl = m_pListCtrl;
  157. int nItems = pListCtrl->GetItemCount();
  158. for (int i = 0 ; i < nItems; i++)
  159. {
  160. SItemStruct* pItemTextData = new SItemStruct();
  161. pItemTextData->m_lParam = pListCtrl->GetItemData(i);
  162. pItemTextData->m_arStrItemText.SetSize(m_nOrderColumn);
  163. for (int j = 0; j < m_nOrderColumn; j++)
  164. pItemTextData->m_arStrItemText[j] = pListCtrl->GetItemText(i, m_arOrderColumn[j]->m_nColumn);
  165. pListCtrl->SetItemData(i, (DWORD)pItemTextData);
  166. }
  167. pListCtrl->SortItems(CompareFuncMulti, (LPARAM)this);
  168. for (i = 0 ; i < nItems; i++)
  169. {
  170. SItemStruct* pItemTextData = (SItemStruct*)pListCtrl->GetItemData(i);
  171. pListCtrl->SetItemData(i, (DWORD)pItemTextData->m_lParam);
  172. delete pItemTextData;
  173. }
  174. }
  175. // Function name : CTSortColumns::SortUniColumn
  176. // Description     : Sort one column
  177. // Return type : void 
  178. void CTSortColumns::SortUniColumn()
  179. {
  180. ASSERT (m_arOrderColumn.GetSize() == 1);
  181. CListCtrl* pListCtrl = m_pListCtrl;
  182. int nItems = pListCtrl->GetItemCount();
  183. ColumnOrder* pColumnOrder = m_arOrderColumn[0];
  184. int nSortColumn = pColumnOrder->m_nColumn;
  185. for (int i = 0 ; i < nItems; i++)
  186. {
  187. SItemStructUni* pItemTextData = new SItemStructUni(pListCtrl->GetItemText(i, nSortColumn), pListCtrl->GetItemData(i));
  188. pListCtrl->SetItemData(i, (DWORD)pItemTextData);
  189. }
  190. COLUMNCALLBACKCOMPARE pCallBackCompare = NULL;;
  191. m_mapColumnsSort.Lookup(pColumnOrder->m_nColumn, pCallBackCompare);
  192. ASSERT (pCallBackCompare != NULL);
  193. CompareColumnOrder cco(pCallBackCompare, pColumnOrder->m_nAsc);
  194. pListCtrl->SortItems(CompareFuncUni, (LPARAM)&cco);
  195. for (i = 0 ; i < nItems; i++)
  196. {
  197. SItemStructUni* pItemTextData = (SItemStructUni*)pListCtrl->GetItemData(i);
  198. pListCtrl->SetItemData(i, (DWORD)pItemTextData->m_lParam);
  199. delete pItemTextData;
  200. }
  201. }
  202. // Function name : CTSortColumns::Sort
  203. // Description     : Sort.
  204. // Return type : void 
  205. void CTSortColumns::Sort()
  206. {
  207. if (GetCountOrderColumn() == 1)
  208. SortUniColumn();
  209. else
  210. {
  211. CListCtrl* pListCtrl = m_pListCtrl;
  212. int nItems = pListCtrl->GetItemCount();
  213. m_nCmpsMax = int( nItems * log(nItems) / log(2) + nItems ) / 2;
  214. m_nCmpsCur = 0;
  215. BOOL bShow = nItems >= 256;
  216. m_pFctShowProgressBar = bShow ? ShowProgressBar : HideProgressBar;
  217. SortMultiColumn();
  218. if (bShow)
  219. m_pListCtrl->Progress(100);
  220. }
  221. }