int CALLBACK CSortListCtrl::CompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData ) { CSortListCtrl* pListCtrl = reinterpret_cast<CSortListCtrl*>( lParamData ); ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) ); ItemData* pid1 = reinterpret_cast<ItemData*>( lParam1 ); ItemData* pid2 = reinterpret_cast<ItemData*>( lParam2 ); ASSERT( pid1 ); ASSERT( pid2 ); LPCTSTR pszText1 = pid1->arrpsz[ pListCtrl->m_iSortColumn ]; LPCTSTR pszText2 = pid2->arrpsz[ pListCtrl->m_iSortColumn ]; ASSERT_VALID_STRING( pszText1 ); ASSERT_VALID_STRING( pszText2 ); if( IsNumber( pszText1 ) ) return pListCtrl->m_bSortAscending ? NumberCompare( pszText1, pszText2 ) : NumberCompare( pszText2, pszText1 ); else if( IsDate( pszText1 ) ) return pListCtrl->m_bSortAscending ? DateCompare( pszText1, pszText2 ) : DateCompare( pszText2, pszText1 ); else // text. return pListCtrl->m_bSortAscending ? lstrcmp( pszText1, pszText2 ) : lstrcmp( pszText2, pszText1 ); }
int NumberCompare( LPCTSTR pszNumber1, LPCTSTR pszNumber2 ) { ASSERT_VALID_STRING( pszNumber1 ); ASSERT_VALID_STRING( pszNumber2 ); const int iNumber1 = atoi( pszNumber1 ); const int iNumber2 = atoi( pszNumber2 ); if( iNumber1 < iNumber2 ) return -1; if( iNumber1 > iNumber2 ) return 1; return 0; }
int CSortListCtrl::AddItem(int id, LPCTSTR pszText, ... ) { const int iIndex = InsertItem( GetItemCount(), pszText ); LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ]; arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ]; (void)lstrcpy( arrpsz[ 0 ], pszText ); va_list list; va_start( list, pszText ); for( int iColumn = 1; iColumn < m_iNumColumns; iColumn++ ) { pszText = va_arg( list, LPCTSTR ); ASSERT_VALID_STRING( pszText ); VERIFY( CListCtrl::SetItem( iIndex, iColumn, LVIF_TEXT, pszText, 0, 0, 0, 0 ) ); arrpsz[ iColumn ] = new TCHAR[ lstrlen( pszText ) + 1 ]; (void)lstrcpy( arrpsz[ iColumn ], pszText ); } va_end( list ); VERIFY( SetTextArray( iIndex, arrpsz, id ) ); return iIndex; }
bool IsNumber( LPCTSTR pszText ) { ASSERT_VALID_STRING( pszText ); for( int i = 0; i < lstrlen( pszText ); i++ ) if( !_istdigit( pszText[ i ] ) ) return false; return true; }
bool IsDate( LPCTSTR pszText ) { ASSERT_VALID_STRING( pszText ); // format should be 99/99/9999. if( lstrlen( pszText ) != 10 ) return false; return _istdigit( pszText[ 0 ] ) && _istdigit( pszText[ 1 ] ) && pszText[ 2 ] == _T('/') && _istdigit( pszText[ 3 ] ) && _istdigit( pszText[ 4 ] ) && pszText[ 5 ] == _T('/') && _istdigit( pszText[ 6 ] ) && _istdigit( pszText[ 7 ] ) && _istdigit( pszText[ 8 ] ) && _istdigit( pszText[ 9 ] ); }
int CSortListCtrl::AddItem( LPCTSTR pszText, ... ) { const int iIndex = InsertItem( GetItemCount(), pszText ); LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ]; COLORREF * clrText = new COLORREF[ m_iNumColumns ]; COLORREF * clrBak= new COLORREF[ m_iNumColumns ]; arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ]; clrText[ 0 ] = crWindowText; clrBak[ 0 ] = crWindow; (void)lstrcpy( arrpsz[ 0 ], pszText ); va_list list; va_start( list, pszText ); //insert sub item and set subitem data for( int iColumn = 1; iColumn < m_iNumColumns; iColumn++ ) { pszText = va_arg( list, LPCTSTR ); ASSERT_VALID_STRING( pszText ); VERIFY( CListCtrl::SetItem( iIndex, iColumn, LVIF_TEXT, pszText, 0, 0, 0, 0 ) ); arrpsz[ iColumn ] = new TCHAR[ lstrlen( pszText ) + 1 ]; clrText[ iColumn ] = crWindowText; clrBak[ iColumn ] = crWindow; (void)lstrcpy( arrpsz[ iColumn ], pszText ); } va_end( list ); VERIFY( SetArray( iIndex, arrpsz,clrText,clrBak ) ); return iIndex; }