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.0.