00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <kdebug.h>
00023
00024
#include "addresseelist.h"
00025
00026
#include "field.h"
00027
#include "sortmode.h"
00028
00029
using namespace KABC;
00030
00031
00032
00033
00034
00035
00036
00037
bool SortingTraits::Uid::eq(
const Addressee &a1,
const Addressee &a2 )
00038 {
00039
00040
return (
QString::compare( a1.
uid(), a2.
uid() ) == 0 );
00041 }
00042
00043
bool SortingTraits::Uid::lt(
const Addressee &a1,
const Addressee &a2 )
00044 {
00045
00046
return (
QString::compare( a1.
uid(), a2.
uid() ) < 0 );
00047 }
00048
00049
bool SortingTraits::Name::eq(
const Addressee &a1,
const Addressee &a2 )
00050 {
00051
return (
QString::localeAwareCompare( a1.
name(), a2.
name() ) == 0 );
00052 }
00053
00054
bool SortingTraits::Name::lt(
const Addressee &a1,
const Addressee &a2 )
00055 {
00056
return (
QString::localeAwareCompare( a1.
name(), a2.
name() ) < 0 );
00057 }
00058
00059
bool SortingTraits::FormattedName::eq(
const Addressee &a1,
const Addressee &a2 )
00060 {
00061
return (
QString::localeAwareCompare( a1.
formattedName(), a2.
formattedName() ) == 0 );
00062 }
00063
00064
bool SortingTraits::FormattedName::lt(
const Addressee &a1,
const Addressee &a2 )
00065 {
00066
return (
QString::localeAwareCompare( a1.
formattedName(), a2.
formattedName() ) < 0 );
00067 }
00068
00069
bool SortingTraits::FamilyName::eq(
const Addressee &a1,
const Addressee &a2 )
00070 {
00071
return (
QString::localeAwareCompare( a1.
familyName(), a2.
familyName() ) == 0
00072 &&
QString::localeAwareCompare( a1.
givenName(), a2.
givenName() ) == 0 );
00073 }
00074
00075
bool SortingTraits::FamilyName::lt(
const Addressee &a1,
const Addressee &a2 )
00076 {
00077
int family =
QString::localeAwareCompare( a1.
familyName(), a2.
familyName() );
00078
if ( 0 == family ) {
00079
return (
QString::localeAwareCompare( a1.
givenName(), a2.
givenName() ) < 0 );
00080 }
else {
00081
return family < 0;
00082 }
00083 }
00084
00085
bool SortingTraits::GivenName::eq(
const Addressee &a1,
const Addressee &a2 )
00086 {
00087
return (
QString::localeAwareCompare( a1.
givenName(), a2.
givenName() ) == 0
00088 &&
QString::localeAwareCompare( a1.
familyName(), a2.
familyName() ) == 0 );
00089 }
00090
00091
bool SortingTraits::GivenName::lt(
const Addressee &a1,
const Addressee &a2 )
00092 {
00093
int given =
QString::localeAwareCompare( a1.
givenName(), a2.
givenName() );
00094
if ( 0 == given ) {
00095
return (
QString::localeAwareCompare( a1.
familyName(), a2.
familyName() ) < 0 );
00096 }
else {
00097
return given < 0;
00098 }
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
static Field *sActiveField=0;
00108
00109 AddresseeList::AddresseeList()
00110 :
QValueList<
Addressee>()
00111 {
00112 mReverseSorting =
false;
00113 mActiveSortingCriterion = FormattedName;
00114 }
00115
00116 AddresseeList::~AddresseeList()
00117 {
00118 }
00119
00120 AddresseeList::AddresseeList(
const AddresseeList &l )
00121 :
QValueList<
Addressee>( l )
00122 {
00123 mReverseSorting = l.
reverseSorting();
00124 mActiveSortingCriterion = l.
sortingCriterion();
00125 }
00126
00127 AddresseeList::AddresseeList(
const QValueList<Addressee> &l )
00128 :
QValueList<
Addressee>( l )
00129 {
00130 mReverseSorting =
false;
00131 }
00132
00133 void AddresseeList::dump()
const
00134
{
00135
kdDebug(5700) <<
"AddresseeList {" <<
endl;
00136
kdDebug(5700) <<
"reverse order: " << ( mReverseSorting ?
"true" :
"false" ) <<
endl;
00137
00138
QString crit;
00139
if ( Uid == mActiveSortingCriterion ) {
00140 crit =
"Uid";
00141 }
else if ( Name == mActiveSortingCriterion ) {
00142 crit =
"Name";
00143 }
else if ( FormattedName == mActiveSortingCriterion ) {
00144 crit =
"FormattedName";
00145 }
else if ( FamilyName == mActiveSortingCriterion ) {
00146 crit =
"FamilyName";
00147 }
else if ( GivenName == mActiveSortingCriterion ) {
00148 crit =
"GivenName";
00149 }
else {
00150 crit =
"unknown -- update dump method";
00151 }
00152
00153
kdDebug(5700) <<
"sorting criterion: " << crit <<
endl;
00154
00155
for ( const_iterator it =
begin(); it !=
end(); ++it ) {
00156 (*it).dump();
00157 }
00158
00159
kdDebug(5700) <<
"}" <<
endl;
00160 }
00161
00162 void AddresseeList::sortBy( SortingCriterion c )
00163 {
00164 mActiveSortingCriterion = c;
00165
if ( Uid == c ) {
00166 sortByTrait<SortingTraits::Uid>();
00167 }
else if ( Name == c ) {
00168 sortByTrait<SortingTraits::Name>();
00169 }
else if ( FormattedName == c ) {
00170 sortByTrait<SortingTraits::FormattedName>();
00171 }
else if ( FamilyName == c ) {
00172 sortByTrait<SortingTraits::FamilyName>();
00173 }
else if ( GivenName==c ) {
00174 sortByTrait<SortingTraits::GivenName>();
00175 }
else {
00176
kdError(5700) <<
"AddresseeList sorting criterion passed for which a trait is not known. No sorting done." <<
endl;
00177 }
00178 }
00179
00180 void AddresseeList::sort()
00181 {
00182
sortBy( mActiveSortingCriterion );
00183 }
00184
00185
template<
class Trait>
00186 void AddresseeList::sortByTrait()
00187 {
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 iterator i1 =
begin();
00198 iterator endIt =
end();
00199 --endIt;
00200
if ( i1 == endIt )
00201
return;
00202
00203 iterator i2 = endIt;
00204
while( i1 != endIt ) {
00205 iterator j1 =
begin();
00206 iterator j2 = j1;
00207 ++j2;
00208
while( j1 != i2 ) {
00209
if ( !mReverseSorting && Trait::lt( *j2, *j1 )
00210 || mReverseSorting && Trait::lt( *j1, *j2 ) ) {
00211 qSwap( *j1, *j2 );
00212 }
00213 ++j1;
00214 ++j2;
00215 }
00216 ++i1;
00217 --i2;
00218 }
00219 }
00220
00221 void AddresseeList::sortByField( Field *field )
00222 {
00223
if ( !field ) {
00224
kdWarning(5700) <<
"sortByField called with no active sort field" <<
endl;
00225
return;
00226 }
00227
00228 sActiveField = field;
00229
00230
if (
count() == 0 )
00231
return;
00232
00233 KABC::FieldSortMode *mode =
new KABC::FieldSortMode( sActiveField, !mReverseSorting );
00234
00235 KABC::Addressee::setSortMode( mode );
00236 qHeapSort( *
this );
00237 KABC::Addressee::setSortMode( 0 );
00238
00239
delete mode;
00240 }
00241
00242 void AddresseeList::sortByMode(
SortMode *mode )
00243 {
00244
if (
count() == 0 )
00245
return;
00246
00247 KABC::Addressee::setSortMode( mode );
00248 qHeapSort( *
this );
00249 KABC::Addressee::setSortMode( 0 );
00250 }
00251
00252 Field*
00253 AddresseeList::sortingField()
const
00254
{
00255
return sActiveField;
00256 }