00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <klocale.h>
00023 #include <kconfig.h>
00024 #include <kglobal.h>
00025
00026 #include "field.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 FormattedName,
00044 FamilyName,
00045 GivenName,
00046 AdditionalName,
00047 Prefix,
00048 Suffix,
00049 NickName,
00050 Birthday,
00051 HomeAddressStreet,
00052 HomeAddressLocality,
00053 HomeAddressRegion,
00054 HomeAddressPostalCode,
00055 HomeAddressCountry,
00056 HomeAddressLabel,
00057 BusinessAddressStreet,
00058 BusinessAddressLocality,
00059 BusinessAddressRegion,
00060 BusinessAddressPostalCode,
00061 BusinessAddressCountry,
00062 BusinessAddressLabel,
00063 HomePhone,
00064 BusinessPhone,
00065 MobilePhone,
00066 HomeFax,
00067 BusinessFax,
00068 CarPhone,
00069 Isdn,
00070 Pager,
00071 Email,
00072 Mailer,
00073 Title,
00074 Role,
00075 Organization,
00076 Note,
00077 Url
00078 };
00079
00080 int fieldId() { return mFieldId; }
00081 int category() { return mCategory; }
00082
00083 QString label() { return mLabel; }
00084 QString key() { return mKey; }
00085 QString app() { return mApp; }
00086
00087 private:
00088 int mFieldId;
00089 int mCategory;
00090
00091 QString mLabel;
00092 QString mKey;
00093 QString mApp;
00094 };
00095
00096
00097 Field::List Field::mAllFields;
00098 Field::List Field::mDefaultFields;
00099 Field::List Field::mCustomFields;
00100
00101
00102 Field::Field( FieldImpl *impl )
00103 {
00104 mImpl = impl;
00105 }
00106
00107 Field::~Field()
00108 {
00109 delete mImpl;
00110 }
00111
00112 QString Field::label()
00113 {
00114 switch ( mImpl->fieldId() ) {
00115 case FieldImpl::FormattedName:
00116 return Addressee::formattedNameLabel();
00117 case FieldImpl::FamilyName:
00118 return Addressee::familyNameLabel();
00119 case FieldImpl::GivenName:
00120 return Addressee::givenNameLabel();
00121 case FieldImpl::AdditionalName:
00122 return Addressee::additionalNameLabel();
00123 case FieldImpl::Prefix:
00124 return Addressee::prefixLabel();
00125 case FieldImpl::Suffix:
00126 return Addressee::suffixLabel();
00127 case FieldImpl::NickName:
00128 return Addressee::nickNameLabel();
00129 case FieldImpl::Birthday:
00130 return Addressee::birthdayLabel();
00131 case FieldImpl::HomeAddressStreet:
00132 return Addressee::homeAddressStreetLabel();
00133 case FieldImpl::HomeAddressLocality:
00134 return Addressee::homeAddressLocalityLabel();
00135 case FieldImpl::HomeAddressRegion:
00136 return Addressee::homeAddressRegionLabel();
00137 case FieldImpl::HomeAddressPostalCode:
00138 return Addressee::homeAddressPostalCodeLabel();
00139 case FieldImpl::HomeAddressCountry:
00140 return Addressee::homeAddressCountryLabel();
00141 case FieldImpl::HomeAddressLabel:
00142 return Addressee::homeAddressLabelLabel();
00143 case FieldImpl::BusinessAddressStreet:
00144 return Addressee::businessAddressStreetLabel();
00145 case FieldImpl::BusinessAddressLocality:
00146 return Addressee::businessAddressLocalityLabel();
00147 case FieldImpl::BusinessAddressRegion:
00148 return Addressee::businessAddressRegionLabel();
00149 case FieldImpl::BusinessAddressPostalCode:
00150 return Addressee::businessAddressPostalCodeLabel();
00151 case FieldImpl::BusinessAddressCountry:
00152 return Addressee::businessAddressCountryLabel();
00153 case FieldImpl::BusinessAddressLabel:
00154 return Addressee::businessAddressLabelLabel();
00155 case FieldImpl::HomePhone:
00156 return Addressee::homePhoneLabel();
00157 case FieldImpl::BusinessPhone:
00158 return Addressee::businessPhoneLabel();
00159 case FieldImpl::MobilePhone:
00160 return Addressee::mobilePhoneLabel();
00161 case FieldImpl::HomeFax:
00162 return Addressee::homeFaxLabel();
00163 case FieldImpl::BusinessFax:
00164 return Addressee::businessFaxLabel();
00165 case FieldImpl::CarPhone:
00166 return Addressee::carPhoneLabel();
00167 case FieldImpl::Isdn:
00168 return Addressee::isdnLabel();
00169 case FieldImpl::Pager:
00170 return Addressee::pagerLabel();
00171 case FieldImpl::Email:
00172 return Addressee::emailLabel();
00173 case FieldImpl::Mailer:
00174 return Addressee::mailerLabel();
00175 case FieldImpl::Title:
00176 return Addressee::titleLabel();
00177 case FieldImpl::Role:
00178 return Addressee::roleLabel();
00179 case FieldImpl::Organization:
00180 return Addressee::organizationLabel();
00181 case FieldImpl::Note:
00182 return Addressee::noteLabel();
00183 case FieldImpl::Url:
00184 return Addressee::urlLabel();
00185 case FieldImpl::CustomField:
00186 return mImpl->label();
00187 default:
00188 return i18n("Unknown Field");
00189 }
00190 }
00191
00192 int Field::category()
00193 {
00194 return mImpl->category();
00195 }
00196
00197 QString Field::categoryLabel( int category )
00198 {
00199 switch ( category ) {
00200 case All:
00201 return i18n("All");
00202 case Frequent:
00203 return i18n("Frequent");
00204 case Address:
00205 return i18n("Address");
00206 case Email:
00207 return i18n("Email");
00208 case Personal:
00209 return i18n("Personal");
00210 case Organization:
00211 return i18n("Organization");
00212 case CustomCategory:
00213 return i18n("Custom");
00214 default:
00215 return i18n("Undefined");
00216 }
00217 }
00218
00219 QString Field::value( const KABC::Addressee &a )
00220 {
00221 switch ( mImpl->fieldId() ) {
00222 case FieldImpl::FormattedName:
00223 return a.formattedName();
00224 case FieldImpl::FamilyName:
00225 return a.familyName();
00226 case FieldImpl::GivenName:
00227 return a.givenName();
00228 case FieldImpl::AdditionalName:
00229 return a.additionalName();
00230 case FieldImpl::Prefix:
00231 return a.prefix();
00232 case FieldImpl::Suffix:
00233 return a.suffix();
00234 case FieldImpl::NickName:
00235 return a.nickName();
00236 case FieldImpl::Mailer:
00237 return a.mailer();
00238 case FieldImpl::Title:
00239 return a.title();
00240 case FieldImpl::Role:
00241 return a.role();
00242 case FieldImpl::Organization:
00243 return a.organization();
00244 case FieldImpl::Note:
00245 return a.note();
00246 case FieldImpl::Email:
00247 return a.preferredEmail();
00248 case FieldImpl::Birthday:
00249 if ( a.birthday().isValid() )
00250 return a.birthday().date().toString( Qt::ISODate );
00251 else
00252 return QString::null;
00253 case FieldImpl::Url:
00254 return a.url().prettyURL();
00255 case FieldImpl::HomePhone:
00256 {
00257 PhoneNumber::List::ConstIterator it;
00258
00259 {
00260
00261 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref );
00262 for ( it = list.begin(); it != list.end(); ++it )
00263 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00264 return (*it).number();
00265 }
00266
00267 {
00268
00269 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home );
00270 for ( it = list.begin(); it != list.end(); ++it )
00271 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00272 return (*it).number();
00273 }
00274
00275 return QString::null;
00276 }
00277 case FieldImpl::BusinessPhone:
00278 {
00279 PhoneNumber::List::ConstIterator it;
00280
00281 {
00282
00283 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref );
00284 for ( it = list.begin(); it != list.end(); ++it )
00285 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00286 return (*it).number();
00287 }
00288
00289 {
00290
00291 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work );
00292 for ( it = list.begin(); it != list.end(); ++it )
00293 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00294 return (*it).number();
00295 }
00296
00297 return QString::null;
00298 }
00299 case FieldImpl::MobilePhone:
00300 return a.phoneNumber( PhoneNumber::Cell ).number();
00301 case FieldImpl::HomeFax:
00302 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
00303 case FieldImpl::BusinessFax:
00304 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
00305 case FieldImpl::CarPhone:
00306 return a.phoneNumber( PhoneNumber::Car ).number();
00307 case FieldImpl::Isdn:
00308 return a.phoneNumber( PhoneNumber::Isdn ).number();
00309 case FieldImpl::Pager:
00310 return a.phoneNumber( PhoneNumber::Pager ).number();
00311 case FieldImpl::HomeAddressStreet:
00312 return a.address( Address::Home ).street();
00313 case FieldImpl::HomeAddressLocality:
00314 return a.address( Address::Home ).locality();
00315 case FieldImpl::HomeAddressRegion:
00316 return a.address( Address::Home ).region();
00317 case FieldImpl::HomeAddressPostalCode:
00318 return a.address( Address::Home ).postalCode();
00319 case FieldImpl::HomeAddressCountry:
00320 return a.address( Address::Home ).country();
00321 case FieldImpl::BusinessAddressStreet:
00322 return a.address( Address::Work ).street();
00323 case FieldImpl::BusinessAddressLocality:
00324 return a.address( Address::Work ).locality();
00325 case FieldImpl::BusinessAddressRegion:
00326 return a.address( Address::Work ).region();
00327 case FieldImpl::BusinessAddressPostalCode:
00328 return a.address( Address::Work ).postalCode();
00329 case FieldImpl::BusinessAddressCountry:
00330 return a.address( Address::Work ).country();
00331 case FieldImpl::CustomField:
00332 return a.custom( mImpl->app(), mImpl->key() );
00333 default:
00334 return QString::null;
00335 }
00336 }
00337
00338 bool Field::setValue( KABC::Addressee &a, const QString &value )
00339 {
00340 switch ( mImpl->fieldId() ) {
00341 case FieldImpl::FormattedName:
00342 a.setFormattedName( value );
00343 return true;
00344 case FieldImpl::FamilyName:
00345 a.setFamilyName( value );
00346 return true;
00347 case FieldImpl::GivenName:
00348 a.setGivenName( value );
00349 return true;
00350 case FieldImpl::AdditionalName:
00351 a.setAdditionalName( value );
00352 return true;
00353 case FieldImpl::Prefix:
00354 a.setPrefix( value );
00355 return true;
00356 case FieldImpl::Suffix:
00357 a.setSuffix( value );
00358 return true;
00359 case FieldImpl::NickName:
00360 a.setNickName( value );
00361 return true;
00362 case FieldImpl::Mailer:
00363 a.setMailer( value );
00364 return true;
00365 case FieldImpl::Title:
00366 a.setTitle( value );
00367 return true;
00368 case FieldImpl::Role:
00369 a.setRole( value );
00370 return true;
00371 case FieldImpl::Organization:
00372 a.setOrganization( value );
00373 return true;
00374 case FieldImpl::Note:
00375 a.setNote( value );
00376 return true;
00377 case FieldImpl::Birthday:
00378 a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00379 case FieldImpl::CustomField:
00380 a.insertCustom( mImpl->app(), mImpl->key(), value );
00381 default:
00382 return false;
00383 }
00384 }
00385
00386 QString Field::sortKey( const KABC::Addressee &a )
00387 {
00388 switch ( mImpl->fieldId() ) {
00389 case FieldImpl::FormattedName:
00390 return a.formattedName();
00391 case FieldImpl::FamilyName:
00392 return a.familyName();
00393 case FieldImpl::GivenName:
00394 return a.givenName();
00395 case FieldImpl::AdditionalName:
00396 return a.additionalName();
00397 case FieldImpl::Prefix:
00398 return a.prefix();
00399 case FieldImpl::Suffix:
00400 return a.suffix();
00401 case FieldImpl::NickName:
00402 return a.nickName();
00403 case FieldImpl::Mailer:
00404 return a.mailer();
00405 case FieldImpl::Title:
00406 return a.title();
00407 case FieldImpl::Role:
00408 return a.role();
00409 case FieldImpl::Organization:
00410 return a.organization();
00411 case FieldImpl::Note:
00412 return a.note();
00413 case FieldImpl::Birthday:
00414 if ( a.birthday().isValid() ) {
00415 QDate date = a.birthday().date();
00416 QString key;
00417 key.sprintf( "%02d-%02d", date.month(), date.day() );
00418 return key;
00419 } else
00420 return QString( "00-00" );
00421 default:
00422 return value( a ).lower();
00423 }
00424 }
00425
00426 bool Field::isCustom()
00427 {
00428 return mImpl->fieldId() == FieldImpl::CustomField;
00429 }
00430
00431 Field::List Field::allFields()
00432 {
00433 if ( mAllFields.isEmpty() ) {
00434 createField( FieldImpl::FormattedName, Frequent );
00435 createField( FieldImpl::FamilyName, Frequent );
00436 createField( FieldImpl::GivenName, Frequent );
00437 createField( FieldImpl::AdditionalName );
00438 createField( FieldImpl::Prefix );
00439 createField( FieldImpl::Suffix );
00440 createField( FieldImpl::NickName, Personal );
00441 createField( FieldImpl::Birthday, Personal );
00442 createField( FieldImpl::HomeAddressStreet, Address|Personal );
00443 createField( FieldImpl::HomeAddressLocality, Address|Personal );
00444 createField( FieldImpl::HomeAddressRegion, Address|Personal );
00445 createField( FieldImpl::HomeAddressPostalCode, Address|Personal );
00446 createField( FieldImpl::HomeAddressCountry, Address|Personal );
00447 createField( FieldImpl::HomeAddressLabel, Address|Personal );
00448 createField( FieldImpl::BusinessAddressStreet, Address|Organization );
00449 createField( FieldImpl::BusinessAddressLocality, Address|Organization );
00450 createField( FieldImpl::BusinessAddressRegion, Address|Organization );
00451 createField( FieldImpl::BusinessAddressPostalCode, Address|Organization );
00452 createField( FieldImpl::BusinessAddressCountry, Address|Organization );
00453 createField( FieldImpl::BusinessAddressLabel, Address|Organization );
00454 createField( FieldImpl::HomePhone, Personal|Frequent );
00455 createField( FieldImpl::BusinessPhone, Organization|Frequent );
00456 createField( FieldImpl::MobilePhone, Frequent );
00457 createField( FieldImpl::HomeFax );
00458 createField( FieldImpl::BusinessFax );
00459 createField( FieldImpl::CarPhone );
00460 createField( FieldImpl::Isdn );
00461 createField( FieldImpl::Pager );
00462 createField( FieldImpl::Email, Email|Frequent );
00463 createField( FieldImpl::Mailer, Email );
00464 createField( FieldImpl::Title, Organization );
00465 createField( FieldImpl::Role, Organization );
00466 createField( FieldImpl::Organization, Organization );
00467 createField( FieldImpl::Note );
00468 createField( FieldImpl::Url );
00469 }
00470
00471 return mAllFields;
00472 }
00473
00474 Field::List Field::defaultFields()
00475 {
00476 if ( mDefaultFields.isEmpty() ) {
00477 createDefaultField( FieldImpl::FormattedName );
00478 createDefaultField( FieldImpl::Email );
00479 }
00480
00481 return mDefaultFields;
00482 }
00483
00484 void Field::createField( int id, int category )
00485 {
00486 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00487 }
00488
00489 void Field::createDefaultField( int id, int category )
00490 {
00491 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00492 }
00493
00494 void Field::deleteFields()
00495 {
00496 Field::List::ConstIterator it;
00497
00498 for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) {
00499 delete (*it);
00500 }
00501 mAllFields.clear();
00502
00503 for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) {
00504 delete (*it);
00505 }
00506 mDefaultFields.clear();
00507
00508 for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) {
00509 delete (*it);
00510 }
00511 mCustomFields.clear();
00512 }
00513
00514 void Field::saveFields( const QString &identifier,
00515 const Field::List &fields )
00516 {
00517 KConfig *cfg = KGlobal::config();
00518 KConfigGroupSaver( cfg, "KABCFields" );
00519
00520 saveFields( cfg, identifier, fields );
00521 }
00522
00523 void Field::saveFields( KConfig *cfg, const QString &identifier,
00524 const Field::List &fields )
00525 {
00526 QValueList<int> fieldIds;
00527
00528 int custom = 0;
00529 Field::List::ConstIterator it;
00530 for( it = fields.begin(); it != fields.end(); ++it ) {
00531 fieldIds.append( (*it)->mImpl->fieldId() );
00532 if( (*it)->isCustom() ) {
00533 QStringList customEntry;
00534 customEntry << (*it)->mImpl->label();
00535 customEntry << (*it)->mImpl->key();
00536 customEntry << (*it)->mImpl->app();
00537 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00538 QString::number( custom++ ), customEntry );
00539 }
00540 }
00541
00542 cfg->writeEntry( identifier, fieldIds );
00543 }
00544
00545 Field::List Field::restoreFields( const QString &identifier )
00546 {
00547 KConfig *cfg = KGlobal::config();
00548 KConfigGroupSaver( cfg, "KABCFields" );
00549
00550 return restoreFields( cfg, identifier );
00551 }
00552
00553 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00554 {
00555 const QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00556
00557 Field::List fields;
00558
00559 int custom = 0;
00560 QValueList<int>::ConstIterator it;
00561 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00562 FieldImpl *f = 0;
00563 if ( (*it) == FieldImpl::CustomField ) {
00564 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00565 identifier + "_" +
00566 QString::number( custom++ ) );
00567 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00568 customEntry[ 1 ], customEntry[ 2 ] );
00569 } else {
00570 f = new FieldImpl( *it );
00571 }
00572 fields.append( new Field( f ) );
00573 }
00574
00575 return fields;
00576 }
00577
00578 bool Field::equals( Field *field )
00579 {
00580 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00581
00582 if ( !sameId ) return false;
00583
00584 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00585
00586 return mImpl->key() == field->mImpl->key();
00587 }
00588
00589 Field *Field::createCustomField( const QString &label, int category,
00590 const QString &key, const QString &app )
00591 {
00592 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00593 category | CustomCategory,
00594 label, key, app ) );
00595 mCustomFields.append( field );
00596
00597 return field;
00598 }