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