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