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