00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include <kabc/addresseelist.h>
00026 #include <kdeversion.h>
00027
00028 #include "searchmanager.h"
00029
00030 using namespace KAB;
00031
00032 SearchManager::SearchManager( KABC::AddressBook *ab,
00033 TQObject *parent, const char *name )
00034 : TQObject( parent, name ), mAddressBook( ab )
00035 {
00036 }
00037
00038 void SearchManager::search( const TQString &pattern, const KABC::Field::List &fields, Type type )
00039 {
00040 mPattern = pattern;
00041 mFields = fields;
00042 mType = type;
00043
00044 KABC::Addressee::List allContacts;
00045 mContacts.clear();
00046
00047 #if KDE_VERSION >= 319
00048 KABC::AddresseeList list( mAddressBook->allAddressees() );
00049 if ( !fields.isEmpty() )
00050 list.sortByField( fields.first() );
00051
00052 allContacts = list;
00053 #else
00054 KABC::AddressBook::ConstIterator abIt( mAddressBook->begin() );
00055 const KABC::AddressBook::ConstIterator abEndIt( mAddressBook->end() );
00056 for ( ; abIt != abEndIt; ++abIt )
00057 allContacts.append( *abIt );
00058 #endif
00059
00060 #ifdef KDEPIM_NEW_DISTRLISTS
00061
00062 mDistributionLists.clear();
00063 KABC::Addressee::List::Iterator rmIt( allContacts.begin() );
00064 const KABC::Addressee::List::Iterator rmEndIt( allContacts.end() );
00065 while ( rmIt != rmEndIt ) {
00066 if ( KPIM::DistributionList::isDistributionList( *rmIt ) ) {
00067 mDistributionLists.append( static_cast<KPIM::DistributionList>( *rmIt ) );
00068 rmIt = allContacts.remove( rmIt );
00069 } else
00070 ++rmIt;
00071 }
00072
00073 typedef KPIM::DistributionList::Entry Entry;
00074 if ( !mSelectedDistributionList.isNull() ) {
00075 const KPIM::DistributionList dl = KPIM::DistributionList::findByName( mAddressBook, mSelectedDistributionList );
00076 if ( !dl.isEmpty() ) {
00077 allContacts.clear();
00078 const Entry::List entries = dl.entries( mAddressBook );
00079 const Entry::List::ConstIterator end = entries.end();
00080 for ( Entry::List::ConstIterator it = entries.begin(); it != end; ++it ) {
00081 allContacts.append( (*it).addressee );
00082 }
00083 }
00084 }
00085
00086 #endif
00087
00088 if ( mPattern.isEmpty() ) {
00089 mContacts = allContacts;
00090
00091 emit contactsUpdated();
00092
00093 return;
00094 }
00095
00096 const KABC::Field::List fieldList = !mFields.isEmpty() ? mFields : KABC::Field::allFields();
00097
00098 KABC::Addressee::List::ConstIterator it( allContacts.begin() );
00099 const KABC::Addressee::List::ConstIterator endIt( allContacts.end() );
00100 for ( ; it != endIt; ++it ) {
00101 #ifdef KDEPIM_NEW_DISTRLISTS
00102 if ( KPIM::DistributionList::isDistributionList( *it ) )
00103 continue;
00104 #endif
00105
00106 bool found = false;
00107
00108 KABC::Field::List::ConstIterator fieldIt( fieldList.begin() );
00109 const KABC::Field::List::ConstIterator fieldEndIt( fieldList.end() );
00110 for ( ; fieldIt != fieldEndIt; ++fieldIt ) {
00111
00112 if ( type == StartsWith && (*fieldIt)->value( *it ).startsWith( pattern, false ) ) {
00113 mContacts.append( *it );
00114 found = true;
00115 break;
00116 } else if ( type == EndsWith && (*fieldIt)->value( *it ).endsWith( pattern, false ) ) {
00117 mContacts.append( *it );
00118 found = true;
00119 break;
00120 } else if ( type == Contains && (*fieldIt)->value( *it ).find( pattern, 0, false ) != -1 ) {
00121 mContacts.append( *it );
00122 found = true;
00123 break;
00124 } else if ( type == Equals && (*fieldIt)->value( *it ).localeAwareCompare( pattern ) == 0 ) {
00125 mContacts.append( *it );
00126 found = true;
00127 break;
00128 }
00129 }
00130
00131 if ( !found ) {
00132
00133 const TQStringList customs = (*it).customs();
00134
00135 TQStringList::ConstIterator customIt( customs.begin() );
00136 const TQStringList::ConstIterator customEndIt( customs.end() );
00137 for ( ; customIt != customEndIt; ++customIt ) {
00138 int pos = (*customIt).find( ':' );
00139 if ( pos != -1 ) {
00140 const TQString value = (*customIt).mid( pos + 1 );
00141 if ( type == StartsWith && value.startsWith( pattern, false ) ) {
00142 mContacts.append( *it );
00143 break;
00144 } else if ( type == EndsWith && value.endsWith( pattern, false ) ) {
00145 mContacts.append( *it );
00146 break;
00147 } else if ( type == Contains && value.find( pattern, 0, false ) != -1 ) {
00148 mContacts.append( *it );
00149 break;
00150 } else if ( type == Equals && value.localeAwareCompare( pattern ) == 0 ) {
00151 mContacts.append( *it );
00152 break;
00153 }
00154 }
00155 }
00156 }
00157 }
00158
00159 emit contactsUpdated();
00160 }
00161
00162 KABC::Addressee::List SearchManager::contacts() const
00163 {
00164 return mContacts;
00165 }
00166
00167 void SearchManager::reload()
00168 {
00169 search( mPattern, mFields, mType );
00170 }
00171
00172 #ifdef KDEPIM_NEW_DISTRLISTS
00173
00174 void KAB::SearchManager::setSelectedDistributionList( const TQString &name )
00175 {
00176 if ( mSelectedDistributionList == name )
00177 return;
00178 mSelectedDistributionList = name;
00179 reload();
00180 }
00181
00182 KPIM::DistributionList::List KAB::SearchManager::distributionLists() const
00183 {
00184 return mDistributionLists;
00185 }
00186
00187 TQStringList KAB::SearchManager::distributionListNames() const
00188 {
00189 TQStringList lst;
00190 KPIM::DistributionList::List::ConstIterator it( mDistributionLists.begin() );
00191 const KPIM::DistributionList::List::ConstIterator endIt( mDistributionLists.end() );
00192 for ( ; it != endIt; ++it ) {
00193 lst.append( (*it).formattedName() );
00194 }
00195 return lst;
00196 }
00197 #endif
00198
00199 #include "searchmanager.moc"