field.src.cpp
00001 /* 00002 This file is part of libkabc. 00003 Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> 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., 51 Franklin Street, Fifth Floor, 00018 Boston, MA 02110-1301, USA. 00019 */ 00020 00021 #include <klocale.h> 00022 #include <kconfig.h> 00023 #include <kglobal.h> 00024 00025 #include "field.h" 00026 #include "address.h" 00027 00028 using namespace KABC; 00029 00030 class Field::FieldImpl 00031 { 00032 public: 00033 FieldImpl( int fieldId, int category = 0, 00034 const QString &label = QString::null, 00035 const QString &key = QString::null, 00036 const QString &app = QString::null ) 00037 : mFieldId( fieldId ), mCategory( category ), mLabel( label ), 00038 mKey( key ), mApp( app ) {} 00039 00040 enum FieldId 00041 { 00042 CustomField, 00043 --ENUMS-- 00044 }; 00045 00046 int fieldId() { return mFieldId; } 00047 int category() { return mCategory; } 00048 00049 QString label() { return mLabel; } 00050 QString key() { return mKey; } 00051 QString app() { return mApp; } 00052 00053 private: 00054 int mFieldId; 00055 int mCategory; 00056 00057 QString mLabel; 00058 QString mKey; 00059 QString mApp; 00060 }; 00061 00062 00063 Field::List Field::mAllFields; 00064 Field::List Field::mDefaultFields; 00065 Field::List Field::mCustomFields; 00066 00067 00068 Field::Field( FieldImpl *impl ) 00069 { 00070 mImpl = impl; 00071 } 00072 00073 Field::~Field() 00074 { 00075 delete mImpl; 00076 } 00077 00078 QString Field::label() 00079 { 00080 switch ( mImpl->fieldId() ) { 00081 --CASELABEL-- 00082 case FieldImpl::CustomField: 00083 return mImpl->label(); 00084 default: 00085 return i18n("Unknown Field"); 00086 } 00087 } 00088 00089 int Field::category() 00090 { 00091 return mImpl->category(); 00092 } 00093 00094 QString Field::categoryLabel( int category ) 00095 { 00096 switch ( category ) { 00097 case All: 00098 return i18n("All"); 00099 case Frequent: 00100 return i18n("Frequent"); 00101 case Address: 00102 return i18n("street/postal","Address"); 00103 case Email: 00104 return i18n("Email"); 00105 case Personal: 00106 return i18n("Personal"); 00107 case Organization: 00108 return i18n("Organization"); 00109 case CustomCategory: 00110 return i18n("Custom"); 00111 default: 00112 return i18n("Undefined"); 00113 } 00114 } 00115 00116 QString Field::value( const KABC::Addressee &a ) 00117 { 00118 switch ( mImpl->fieldId() ) { 00119 --CASEVALUE-- 00120 case FieldImpl::Email: 00121 return a.preferredEmail(); 00122 case FieldImpl::Birthday: 00123 if ( a.birthday().isValid() ) 00124 return a.birthday().date().toString( Qt::ISODate ); 00125 else 00126 return QString::null; 00127 case FieldImpl::Url: 00128 return a.url().prettyURL(); 00129 case FieldImpl::HomePhone: 00130 { 00131 PhoneNumber::List::ConstIterator it; 00132 00133 { 00134 // check for preferred number 00135 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref ); 00136 for ( it = list.begin(); it != list.end(); ++it ) 00137 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home ) 00138 return (*it).number(); 00139 } 00140 00141 { 00142 // check for normal home number 00143 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home ); 00144 for ( it = list.begin(); it != list.end(); ++it ) 00145 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home ) 00146 return (*it).number(); 00147 } 00148 00149 return QString::null; 00150 } 00151 case FieldImpl::BusinessPhone: 00152 { 00153 PhoneNumber::List::ConstIterator it; 00154 00155 { 00156 // check for preferred number 00157 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref ); 00158 for ( it = list.begin(); it != list.end(); ++it ) 00159 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work ) 00160 return (*it).number(); 00161 } 00162 00163 { 00164 // check for normal work number 00165 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work ); 00166 for ( it = list.begin(); it != list.end(); ++it ) 00167 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work ) 00168 return (*it).number(); 00169 } 00170 00171 return QString::null; 00172 } 00173 case FieldImpl::MobilePhone: 00174 return a.phoneNumber( PhoneNumber::Cell ).number(); 00175 case FieldImpl::HomeFax: 00176 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number(); 00177 case FieldImpl::BusinessFax: 00178 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number(); 00179 case FieldImpl::CarPhone: 00180 return a.phoneNumber( PhoneNumber::Car ).number(); 00181 case FieldImpl::Isdn: 00182 return a.phoneNumber( PhoneNumber::Isdn ).number(); 00183 case FieldImpl::Pager: 00184 return a.phoneNumber( PhoneNumber::Pager ).number(); 00185 case FieldImpl::HomeAddressStreet: 00186 return a.address( Address::Home ).street(); 00187 case FieldImpl::HomeAddressLocality: 00188 return a.address( Address::Home ).locality(); 00189 case FieldImpl::HomeAddressRegion: 00190 return a.address( Address::Home ).region(); 00191 case FieldImpl::HomeAddressPostalCode: 00192 return a.address( Address::Home ).postalCode(); 00193 case FieldImpl::HomeAddressCountry: 00194 return a.address( Address::Home ).country(); 00195 case FieldImpl::HomeAddressLabel: 00196 return a.address( Address::Home ).label(); 00197 case FieldImpl::BusinessAddressStreet: 00198 return a.address( Address::Work ).street(); 00199 case FieldImpl::BusinessAddressLocality: 00200 return a.address( Address::Work ).locality(); 00201 case FieldImpl::BusinessAddressRegion: 00202 return a.address( Address::Work ).region(); 00203 case FieldImpl::BusinessAddressPostalCode: 00204 return a.address( Address::Work ).postalCode(); 00205 case FieldImpl::BusinessAddressCountry: 00206 return a.address( Address::Work ).country(); 00207 case FieldImpl::BusinessAddressLabel: 00208 return a.address( Address::Work ).label(); 00209 case FieldImpl::CustomField: 00210 return a.custom( mImpl->app(), mImpl->key() ); 00211 default: 00212 return QString::null; 00213 } 00214 } 00215 00216 bool Field::setValue( KABC::Addressee &a, const QString &value ) 00217 { 00218 switch ( mImpl->fieldId() ) { 00219 --CASESETVALUE-- 00220 case FieldImpl::MobilePhone: 00221 { 00222 PhoneNumber number = a.phoneNumber( PhoneNumber::Cell ); 00223 number.setNumber( value ); 00224 a.insertPhoneNumber( number ); 00225 return true; 00226 } 00227 case FieldImpl::HomeFax: 00228 { 00229 PhoneNumber number = a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ); 00230 number.setNumber( value ); 00231 a.insertPhoneNumber( number ); 00232 return true; 00233 } 00234 case FieldImpl::BusinessFax: 00235 { 00236 PhoneNumber number = a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ); 00237 number.setNumber( value ); 00238 a.insertPhoneNumber( number ); 00239 return true; 00240 } 00241 case FieldImpl::CarPhone: 00242 { 00243 PhoneNumber number = a.phoneNumber( PhoneNumber::Car ); 00244 number.setNumber( value ); 00245 a.insertPhoneNumber( number ); 00246 return true; 00247 } 00248 case FieldImpl::Isdn: 00249 { 00250 PhoneNumber number = a.phoneNumber( PhoneNumber::Isdn ); 00251 number.setNumber( value ); 00252 a.insertPhoneNumber( number ); 00253 return true; 00254 } 00255 case FieldImpl::Pager: 00256 { 00257 PhoneNumber number = a.phoneNumber( PhoneNumber::Pager ); 00258 number.setNumber( value ); 00259 a.insertPhoneNumber( number ); 00260 return true; 00261 } 00262 case FieldImpl::HomeAddressStreet: 00263 { 00264 KABC::Address address = a.address( Address::Home ); 00265 address.setStreet( value ); 00266 a.insertAddress( address ); 00267 return true; 00268 } 00269 case FieldImpl::HomeAddressLocality: 00270 { 00271 KABC::Address address = a.address( Address::Home ); 00272 address.setLocality( value ); 00273 a.insertAddress( address ); 00274 return true; 00275 } 00276 case FieldImpl::HomeAddressRegion: 00277 { 00278 KABC::Address address = a.address( Address::Home ); 00279 address.setRegion( value ); 00280 a.insertAddress( address ); 00281 return true; 00282 } 00283 case FieldImpl::HomeAddressPostalCode: 00284 { 00285 KABC::Address address = a.address( Address::Home ); 00286 address.setPostalCode( value ); 00287 a.insertAddress( address ); 00288 return true; 00289 } 00290 case FieldImpl::HomeAddressCountry: 00291 { 00292 KABC::Address address = a.address( Address::Home ); 00293 address.setCountry( value ); 00294 a.insertAddress( address ); 00295 return true; 00296 } 00297 case FieldImpl::HomeAddressLabel: 00298 { 00299 KABC::Address address = a.address( Address::Home ); 00300 address.setLabel( value ); 00301 a.insertAddress( address ); 00302 return true; 00303 } 00304 case FieldImpl::BusinessAddressStreet: 00305 { 00306 KABC::Address address = a.address( Address::Work ); 00307 address.setStreet( value ); 00308 a.insertAddress( address ); 00309 return true; 00310 } 00311 case FieldImpl::BusinessAddressLocality: 00312 { 00313 KABC::Address address = a.address( Address::Work ); 00314 address.setLocality( value ); 00315 a.insertAddress( address ); 00316 return true; 00317 } 00318 case FieldImpl::BusinessAddressRegion: 00319 { 00320 KABC::Address address = a.address( Address::Work ); 00321 address.setRegion( value ); 00322 a.insertAddress( address ); 00323 return true; 00324 } 00325 case FieldImpl::BusinessAddressPostalCode: 00326 { 00327 KABC::Address address = a.address( Address::Work ); 00328 address.setPostalCode( value ); 00329 a.insertAddress( address ); 00330 return true; 00331 } 00332 case FieldImpl::BusinessAddressCountry: 00333 { 00334 KABC::Address address = a.address( Address::Work ); 00335 address.setCountry( value ); 00336 a.insertAddress( address ); 00337 return true; 00338 } 00339 case FieldImpl::BusinessAddressLabel: 00340 { 00341 KABC::Address address = a.address( Address::Work ); 00342 address.setLabel( value ); 00343 a.insertAddress( address ); 00344 return true; 00345 } 00346 case FieldImpl::Birthday: 00347 a.setBirthday( QDate::fromString( value, Qt::ISODate ) ); 00348 return true; 00349 case FieldImpl::CustomField: 00350 a.insertCustom( mImpl->app(), mImpl->key(), value ); 00351 return true; 00352 default: 00353 return false; 00354 } 00355 } 00356 00357 QString Field::sortKey( const KABC::Addressee &a ) 00358 { 00359 switch ( mImpl->fieldId() ) { 00360 --CASEVALUE-- 00361 case FieldImpl::Birthday: 00362 if ( a.birthday().isValid() ) { 00363 QDate date = a.birthday().date(); 00364 QString key; 00365 key.sprintf( "%02d-%02d", date.month(), date.day() ); 00366 return key; 00367 } else 00368 return QString( "00-00" ); 00369 default: 00370 return value( a ).lower(); 00371 } 00372 } 00373 00374 bool Field::isCustom() 00375 { 00376 return mImpl->fieldId() == FieldImpl::CustomField; 00377 } 00378 00379 Field::List Field::allFields() 00380 { 00381 if ( mAllFields.isEmpty() ) { 00382 --CREATEFIELDS-- 00383 } 00384 00385 return mAllFields; 00386 } 00387 00388 Field::List Field::defaultFields() 00389 { 00390 if ( mDefaultFields.isEmpty() ) { 00391 createDefaultField( FieldImpl::FormattedName ); 00392 createDefaultField( FieldImpl::Email ); 00393 } 00394 00395 return mDefaultFields; 00396 } 00397 00398 void Field::createField( int id, int category ) 00399 { 00400 mAllFields.append( new Field( new FieldImpl( id, category ) ) ); 00401 } 00402 00403 void Field::createDefaultField( int id, int category ) 00404 { 00405 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) ); 00406 } 00407 00408 void Field::deleteFields() 00409 { 00410 Field::List::ConstIterator it; 00411 00412 for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) { 00413 delete (*it); 00414 } 00415 mAllFields.clear(); 00416 00417 for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) { 00418 delete (*it); 00419 } 00420 mDefaultFields.clear(); 00421 00422 for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) { 00423 delete (*it); 00424 } 00425 mCustomFields.clear(); 00426 } 00427 00428 void Field::saveFields( const QString &identifier, 00429 const Field::List &fields ) 00430 { 00431 KConfig *cfg = KGlobal::config(); 00432 KConfigGroupSaver( cfg, "KABCFields" ); 00433 00434 saveFields( cfg, identifier, fields ); 00435 } 00436 00437 void Field::saveFields( KConfig *cfg, const QString &identifier, 00438 const Field::List &fields ) 00439 { 00440 QValueList<int> fieldIds; 00441 00442 int custom = 0; 00443 Field::List::ConstIterator it; 00444 for( it = fields.begin(); it != fields.end(); ++it ) { 00445 fieldIds.append( (*it)->mImpl->fieldId() ); 00446 if( (*it)->isCustom() ) { 00447 QStringList customEntry; 00448 customEntry << (*it)->mImpl->label(); 00449 customEntry << (*it)->mImpl->key(); 00450 customEntry << (*it)->mImpl->app(); 00451 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" + 00452 QString::number( custom++ ), customEntry ); 00453 } 00454 } 00455 00456 cfg->writeEntry( identifier, fieldIds ); 00457 } 00458 00459 Field::List Field::restoreFields( const QString &identifier ) 00460 { 00461 KConfig *cfg = KGlobal::config(); 00462 KConfigGroupSaver( cfg, "KABCFields" ); 00463 00464 return restoreFields( cfg, identifier ); 00465 } 00466 00467 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier ) 00468 { 00469 const QValueList<int> fieldIds = cfg->readIntListEntry( identifier ); 00470 00471 Field::List fields; 00472 00473 int custom = 0; 00474 QValueList<int>::ConstIterator it; 00475 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) { 00476 FieldImpl *f = 0; 00477 if ( (*it) == FieldImpl::CustomField ) { 00478 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" + 00479 identifier + "_" + 00480 QString::number( custom++ ) ); 00481 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ], 00482 customEntry[ 1 ], customEntry[ 2 ] ); 00483 } else { 00484 f = new FieldImpl( *it ); 00485 } 00486 fields.append( new Field( f ) ); 00487 } 00488 00489 return fields; 00490 } 00491 00492 bool Field::equals( Field *field ) 00493 { 00494 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() ); 00495 00496 if ( !sameId ) return false; 00497 00498 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true; 00499 00500 return mImpl->key() == field->mImpl->key(); 00501 } 00502 00503 Field *Field::createCustomField( const QString &label, int category, 00504 const QString &key, const QString &app ) 00505 { 00506 Field *field = new Field( new FieldImpl( FieldImpl::CustomField, 00507 category | CustomCategory, 00508 label, key, app ) ); 00509 mCustomFields.append( field ); 00510 00511 return field; 00512 }