SortClass.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // SortClass.cpp: implementation of the CSortClass class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "SortClass.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol)
  16. {
  17. pWnd = _pWnd;
  18. ASSERT(pWnd);
  19. int max = pWnd->GetItemCount();
  20. DWORD dw;
  21. CString txt;
  22. // replace Item data with pointer to CSortItem structure
  23. for (int t = 0; t < max; t++)
  24. {
  25. dw = pWnd->GetItemData(t); // save current data to restore it later
  26. txt = pWnd->GetItemText(t, _iCol); 
  27. pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt));
  28. }
  29. }
  30. CSortClass::~CSortClass()
  31. {
  32. ASSERT(pWnd);
  33. int max = pWnd->GetItemCount();
  34. CSortItem * pItem;
  35. for (int t = 0; t < max; t++)
  36. {
  37. pItem = (CSortItem *) pWnd->GetItemData(t);
  38. ASSERT(pItem);
  39. pWnd->SetItemData(t, pItem->dw);
  40. delete pItem;
  41. }
  42. }
  43. void CSortClass::Sort(bool _bAsc, EDataType _dtype)
  44. {
  45. long lParamSort = _dtype;
  46. // if lParamSort positive - ascending sort order, negative - descending
  47. if (!_bAsc)
  48. lParamSort *= -1; 
  49. pWnd->SortItems(Compare1, lParamSort);
  50. }
  51. int CALLBACK CSortClass::Compare1(LPARAM lParam1, LPARAM lParam2, LPARAM 
  52.  lParamSort)
  53. {
  54. CSortItem * item1 = (CSortItem *) lParam1;
  55. CSortItem * item2 = (CSortItem *) lParam2;
  56. ASSERT(item1 && item2);
  57. // restore data type and sort order from lParamSort
  58. // if lParamSort positive - ascending sort order, negative - descending
  59. short   sOrder = lParamSort < 0 ? -1 : 1; 
  60. EDataType dType  = (EDataType) (lParamSort * sOrder); // get rid of sign
  61. // declare typed buffers
  62. COleDateTime t1, t2;
  63. switch (dType)
  64. {
  65. case  EDataType::dtINT:
  66. return (atol(item1->txt) - atol(item2->txt))*sOrder;
  67. case  EDataType::dtDEC:
  68. return (atof(item1->txt) < atof(item2->txt) ? -1 : 1)*sOrder;
  69. case  EDataType::dtDATETIME:
  70. if (t1.ParseDateTime(item1->txt) && t2.ParseDateTime(item2->txt))
  71. return (t1 < t2 ? -1 : 1 )*sOrder;
  72. else
  73. return 0;
  74. case  EDataType::dtSTRING:
  75. return item1->txt.CompareNoCase(item2->txt)*sOrder;
  76. default:
  77. ASSERT("Error: attempt to sort a column without type.");
  78. return 0;
  79. }
  80. }
  81. CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt)
  82. {
  83. dw  = _dw;
  84. txt = _txt;
  85. }