kabc Library API Documentation

addresseelist.cpp

00001 /*
00002     This file is part of libkabc.
00003     Copyright (c) 2002 Jost Schenck <jost@schenck.de>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 */
00020 
00021 #include <kdebug.h>
00022 
00023 #include "addresseelist.h"
00024 
00025 using namespace KABC;
00026 
00027 //
00028 //
00029 // Traits
00030 //
00031 //
00032 
00033 bool SortingTraits::Uid::eq( const Addressee &a1, const Addressee &a2 )
00034 {
00035   // locale awareness doesn't make sense sorting ids
00036   return ( QString::compare( a1.uid(), a2.uid() ) == 0 );
00037 }
00038 
00039 bool SortingTraits::Uid::lt( const Addressee &a1, const Addressee &a2 )
00040 {
00041   // locale awareness doesn't make sense sorting ids
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 // AddresseeList
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   // FIXME: better sorting algorithm, bubblesort is not acceptable for larger lists.
00182   //
00183   // for i := 1 to n - 1 
00184   //   do for j := 1 to n - i 
00185   //     do if A[j] > A[j+1] 
00186   //       then temp :=  A[j] 
00187   //         A[j] := A[j + 1] 
00188   //         A[j + 1 ] := temp 
00189 
00190   iterator i1 = begin();
00191   iterator endIt = end();
00192   --endIt;
00193   if ( i1 == endIt ) // don't need sorting
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 ) // don't need sorting
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 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 13:29:18 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001