#include "stdafx.h" #include "SortClass.h" ///////////////////////////////////////////////////////////////////////////// // CSortClass CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol, const BOOL _bIsNumeric ) { iCol = _iCol; pWnd = _pWnd; bIsNumeric = _bIsNumeric; ASSERT(pWnd); int max = pWnd->GetItemCount(); DWORD dw; CString txt; if (bIsNumeric) { for (int t = 0; t < max; t++) { dw = (DWORD)pWnd->GetItemData(t); txt = pWnd->GetItemText(t, iCol); pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt)); } } else { for (int t = 0; t < max; t++) { dw = (DWORD)pWnd->GetItemData(t); txt = pWnd->GetItemText(t, iCol); pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt)); } } } CSortClass::~CSortClass() { ASSERT(pWnd); int max = pWnd->GetItemCount(); if (bIsNumeric) { CSortItemInt * pItem; for (int t = 0; t < max; t++) { pItem = (CSortItemInt *) pWnd->GetItemData(t); ASSERT(pItem); pWnd->SetItemData(t, pItem->dw); if (pItem) { delete pItem; pItem = NULL; } } } else { CSortItem * pItem; for (int t = 0; t < max; t++) { pItem = (CSortItem *) pWnd->GetItemData(t); ASSERT(pItem); pWnd->SetItemData(t, pItem->dw); if (pItem) { delete pItem; pItem = NULL; } } } } void CSortClass::Sort(const bool bAsc) { if (bIsNumeric) { if (bAsc) pWnd->SortItems(CompareAscI, 0L); else pWnd->SortItems(CompareDesI, 0L); } else { if (bAsc) pWnd->SortItems(CompareAsc, 0L); else pWnd->SortItems(CompareDes, 0L); } } int CALLBACK CSortClass::CompareAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CSortItem * i1 = (CSortItem *) lParam1; CSortItem * i2 = (CSortItem *) lParam2; ASSERT(i1 && i2); return i1->txt.CompareNoCase(i2->txt); } int CALLBACK CSortClass::CompareDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CSortItem * i1 = (CSortItem *) lParam1; CSortItem * i2 = (CSortItem *) lParam2; ASSERT(i1 && i2); return i2->txt.CompareNoCase(i1->txt); } int CALLBACK CSortClass::CompareAscI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CSortItemInt * i1 = (CSortItemInt *) lParam1; CSortItemInt * i2 = (CSortItemInt *) lParam2; ASSERT(i1 && i2); if (i1->iInt == i2->iInt) return 0; return i1->iInt > i2->iInt ? 1 : -1; } int CALLBACK CSortClass::CompareDesI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CSortItemInt * i1 = (CSortItemInt *) lParam1; CSortItemInt * i2 = (CSortItemInt *) lParam2; ASSERT(i1 && i2); if (i1->iInt == i2->iInt) return 0; return i1->iInt < i2->iInt ? 1 : -1; } CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt) { dw = _dw; txt = _txt; } CSortClass::CSortItem::~CSortItem() { } CSortClass::CSortItemInt::CSortItemInt(const DWORD _dw, const CString & _txt) { iInt = _ttoi(_txt); dw = _dw; }