www.pudn.com > DriveBrowser.zip > SortClass.cpp


/* 
This SortClass was written by Iuri Apollonio (Excellent job) 
Modified for Sorting Date and Incorporated  
	in this project by Barretto VN 
*/ 
 
#include "stdafx.h" 
#include "SortClass.h" 
 
CString dataType; 
///////////////////////////////////////////////////////////////////////////// 
// CSortClass 
CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol, const CString _DataType) //bool _bIsNumeric ) 
{	 
	iCol = _iCol;	 
	pWnd = _pWnd;	 
//	bIsNumeric = _bIsNumeric;		 
	dataType = _DataType; 
	ASSERT(pWnd); 
	int max = pWnd->GetItemCount();	 
	DWORD dw;	 
	CString txt;	 
	 
//	else 
	if(dataType == "C") 
	{ 
		for (int t = 0; t < max; t++)	 
		{			 
			dw = pWnd->GetItemData(t); 
			txt = pWnd->GetItemText(t, iCol); 
			pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt)); 
		} 
		return; 
	} 
    else 
 
	if(dataType == "D") 
	{ 
		for (int t = 0; t < max; t++)	 
		{			 
			dw = pWnd->GetItemData(t); 
			txt = pWnd->GetItemText(t, iCol); 
			pWnd->SetItemData(t, (DWORD) new CSortItemDate(dw, txt)); 
		} 
		return; 
	} 
 
	if (dataType == "N" ) //(bIsNumeric)	 
	{ 
		for (int t = 0; t < max; t++)		 
		{			 
			dw = pWnd->GetItemData(t); 
			txt = pWnd->GetItemText(t, iCol); 
			pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt));		 
		}	 
		return; 
	}	 
 
} 
 
CSortClass::~CSortClass() 
{	 
	ASSERT(pWnd); 
	int max = pWnd->GetItemCount(); 
 
	if(dataType == "C") 
	{ 
		CSortItem * pItem; 
		for (int t = 0; t < max; t++) 
		{ 
			pItem = (CSortItem *) pWnd->GetItemData(t); 
			ASSERT(pItem); 
			pWnd->SetItemData(t, pItem->dw); 
			delete pItem; 
		} 
		return; 
	} 
 
	if(dataType == "D") 
	{ 
		CSortItemDate * pItem; 
		for (int t = 0; t < max; t++) 
		{ 
			pItem = (CSortItemDate *) pWnd->GetItemData(t); 
			ASSERT(pItem); 
			pWnd->SetItemData(t, pItem->dw); 
			delete pItem; 
		} 
		return; 
	} 
 
	if(dataType == "N") 
	{		 
		CSortItemInt * pItem;		 
		for (int t = 0; t < max; t++)	 
		{ 
			pItem = (CSortItemInt *) pWnd->GetItemData(t);			ASSERT(pItem); 
			pWnd->SetItemData(t, pItem->dw);	 
			delete pItem;	 
		} 
		return; 
	}	 
} 
 
void CSortClass::Sort(const BOOL bAsc) 
{	 
	if(dataType == "C") 
	{	 
		if (bAsc)	 
			pWnd->SortItems(CompareAsc, 0L);	 
		else 
			pWnd->SortItems(CompareDes, 0L); 
 
		return; 
	} 
	else 
	{	 
		if (bAsc)	 
			pWnd->SortItems(CompareAscI, 0L);	 
		else 
			pWnd->SortItems(CompareDesI, 0L); 
 
		return; 
	} 
 
} 
 
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 = atoi(_txt);	 
	dw = _dw; 
} 
 
CSortClass::CSortItemDate::CSortItemDate(const DWORD _dw, const CString & _txt) 
{ 
 
	if(_txt != "") 
	{ 
		CString mth = _txt.Left(3); 
		int iMth = 1; 
 
		if(mth == "Jan") 
				iMth = 1; 
		if(mth == "Feb") 
				iMth = 2; 
		if(mth == "Mar") 
				iMth = 3; 
		if(mth == "Apr") 
				iMth = 4; 
		if(mth == "May") 
				iMth = 5; 
		if(mth == "Jun") 
				iMth = 6; 
		if(mth == "Jul") 
				iMth = 7; 
		if(mth == "Aug") 
				iMth = 8; 
		if(mth == "Sep") 
				iMth = 9; 
		if(mth == "Oct") 
				iMth = 10; 
		if(mth == "Nov") 
				iMth = 11; 
		if(mth == "Dec") 
				iMth = 12; 
		 
		int yr = atoi(_txt.Mid(7,4)); 
		if(yr > 1970) 
		{ 
			int dt = atoi(_txt.Mid(4,2)); 
			CTime t( yr , iMth , dt , 0 , 0 , 0);  	 
			dDate = t; 
			dw = _dw; 
		} 
 
	} 
}