XTSortClass.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTSortClass.cpp : implementation of the CXTSortClass class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTDefines.h"
  22. #include "XTGlobal.h"
  23. #include "XTSortClass.h"
  24. #ifdef _DEBUG
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #define new DEBUG_NEW
  28. #endif
  29. struct CXTSortClass::SORT_ITEM
  30. {
  31. SORT_ITEM(const DWORD_PTR dwData, const CString &strItemText)
  32. {
  33. m_dwData = dwData;
  34. m_strItemText = strItemText;
  35. }
  36. DWORD_PTR   m_dwData;
  37. CString m_strItemText;
  38. };
  39. //////////////////////////////////////////////////////////////////////
  40. // CXTSortClass
  41. //
  42. CXTSortClass::CXTSortClass(CListCtrl* pListCtrl, const int nCol)
  43. {
  44. ASSERT(pListCtrl);
  45. if (!pListCtrl)
  46. return;
  47. m_pListCtrl = pListCtrl;
  48. int nCount = m_pListCtrl->GetItemCount();
  49. // Replace Item data with pointer to XT_SORT_ITEM structure
  50. int i;
  51. for (i = 0; i < nCount; i++)
  52. {
  53. DWORD_PTR dwData = m_pListCtrl->GetItemData(i); // save current data to restore it later
  54. CString strItemText = m_pListCtrl->GetItemText(i, nCol);
  55. m_pListCtrl->SetItemData(i, (DWORD_PTR)new SORT_ITEM(dwData, strItemText));
  56. }
  57. }
  58. CXTSortClass::~CXTSortClass()
  59. {
  60. ASSERT(m_pListCtrl);
  61. if (!m_pListCtrl)
  62. return;
  63. int nCount = m_pListCtrl->GetItemCount();
  64. int i;
  65. for (i = 0; i < nCount; i++)
  66. {
  67. SORT_ITEM* pItem = (SORT_ITEM*)m_pListCtrl->GetItemData(i);
  68. ASSERT(pItem);
  69. if (pItem)
  70. {
  71. m_pListCtrl->SetItemData(i, pItem->m_dwData);
  72. delete pItem;
  73. }
  74. }
  75. }
  76. void CXTSortClass::Sort(bool bAsc, XTSortType eType)
  77. {
  78. long lParamSort = eType;
  79. // if lParamSort positive - ascending sort order, negative - descending
  80. if (!bAsc)
  81. {
  82. lParamSort *= -1;
  83. }
  84. m_pListCtrl->SortItems(Compare, lParamSort);
  85. }
  86. int CALLBACK CXTSortClass::Compare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  87. {
  88. SORT_ITEM* item1 = (SORT_ITEM*)lParam1;
  89. SORT_ITEM* item2 = (SORT_ITEM*)lParam2;
  90. ASSERT(item1 && item2);
  91. if (!item1 || !item2)
  92. return 0;
  93. // Restore data type and sort order from lParamSort
  94. // if lParamSort positive - ascending sort order, negative - descending
  95. short sOrder = lParamSort < 0 ? (short) -1 : (short) 1;
  96. XTSortType eType = (XTSortType) (lParamSort * sOrder); // get rid of sign
  97. // declare typed buffers
  98. COleDateTime t1, t2;
  99. switch (eType)
  100. {
  101. case xtSortInt:
  102. {
  103. CString cs1 = item1->m_strItemText;
  104. CString cs2 = item2->m_strItemText;
  105. RemoveNonNumeric(cs1);
  106. RemoveNonNumeric(cs2);
  107. return (_ttol(cs1) - _ttol(cs2)) * sOrder;
  108. }
  109. case xtSortDecimal:
  110. #ifdef _UNICODE
  111. {
  112. char szText1[ 256 ];
  113. char szText2[ 256 ];
  114. ::WideCharToMultiByte(CP_ACP, 0, item1->m_strItemText, -1, szText1,
  115. 255, NULL, NULL);
  116. ::WideCharToMultiByte(CP_ACP, 0, item2->m_strItemText, -1, szText2,
  117. 255, NULL, NULL);
  118. return (atof(szText1) < atof(szText2) ? -1 : 1) * sOrder;
  119. }
  120. #else
  121. return (atof (item1->m_strItemText) < atof(item2->m_strItemText) ? -1 : 1) * sOrder;
  122. #endif
  123. case xtSortDateTime:
  124. if (t1.ParseDateTime(item1->m_strItemText) && t2.ParseDateTime(item2->m_strItemText))
  125. {
  126. return (t1 < t2 ? -1 : 1) * sOrder;
  127. }
  128. return 0;
  129. case xtSortString:
  130. return item1->m_strItemText.CompareNoCase(item2->m_strItemText) * sOrder;
  131. default:
  132. ASSERT("Error: attempt to sort a column without type.");
  133. return 0;
  134. }
  135. }
  136. int CXTSortClass::RemoveNonNumeric(CString &csSource)
  137. {
  138. TCHAR ch;
  139. CString temp;
  140. int nLen = csSource.GetLength();
  141. int i = 0;
  142. while (i < nLen)
  143. {
  144. ch = csSource.GetAt(i);
  145. if (_istdigit(ch))
  146. temp += ch;
  147. ++i;
  148. }
  149. csSource = temp;
  150. return csSource.GetLength();
  151. }