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