addresseelist.cpp
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 }
This file is part of the documentation for kabc Library Version 3.2.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Mar 4 22:45:21 2004 by
doxygen 1.3.6-20040222 written by
Dimitri van Heesch, © 1997-2003