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
00258 PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref );
00259 PhoneNumber::List::Iterator it;
00260 for ( it = list.begin(); it != list.end(); ++it )
00261 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00262 return (*it).number();
00263
00264
00265 list = a.phoneNumbers( PhoneNumber::Home );
00266 for ( it = list.begin(); it != list.end(); ++it )
00267 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00268 return (*it).number();
00269
00270 return QString::null;
00271 }
00272 case FieldImpl::BusinessPhone:
00273 {
00274
00275 PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref );
00276 PhoneNumber::List::Iterator it;
00277 for ( it = list.begin(); it != list.end(); ++it )
00278 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00279 return (*it).number();
00280
00281
00282 list = a.phoneNumbers( PhoneNumber::Work );
00283 for ( it = list.begin(); it != list.end(); ++it )
00284 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00285 return (*it).number();
00286 return QString::null;
00287 }
00288 case FieldImpl::MobilePhone:
00289 return a.phoneNumber( PhoneNumber::Cell ).number();
00290 case FieldImpl::HomeFax:
00291 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
00292 case FieldImpl::BusinessFax:
00293 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
00294 case FieldImpl::CarPhone:
00295 return a.phoneNumber( PhoneNumber::Car ).number();
00296 case FieldImpl::Isdn:
00297 return a.phoneNumber( PhoneNumber::Isdn ).number();
00298 case FieldImpl::Pager:
00299 return a.phoneNumber( PhoneNumber::Pager ).number();
00300 case FieldImpl::HomeAddressStreet:
00301 return a.address( Address::Home ).street();
00302 case FieldImpl::HomeAddressLocality:
00303 return a.address( Address::Home ).locality();
00304 case FieldImpl::HomeAddressRegion:
00305 return a.address( Address::Home ).region();
00306 case FieldImpl::HomeAddressPostalCode:
00307 return a.address( Address::Home ).postalCode();
00308 case FieldImpl::HomeAddressCountry:
00309 return a.address( Address::Home ).country();
00310 case FieldImpl::BusinessAddressStreet:
00311 return a.address( Address::Work ).street();
00312 case FieldImpl::BusinessAddressLocality:
00313 return a.address( Address::Work ).locality();
00314 case FieldImpl::BusinessAddressRegion:
00315 return a.address( Address::Work ).region();
00316 case FieldImpl::BusinessAddressPostalCode:
00317 return a.address( Address::Work ).postalCode();
00318 case FieldImpl::BusinessAddressCountry:
00319 return a.address( Address::Work ).country();
00320 case FieldImpl::CustomField:
00321 return a.custom( mImpl->app(), mImpl->key() );
00322 default:
00323 return QString::null;
00324 }
00325 }
00326
00327 bool Field::setValue( KABC::Addressee &a, const QString &value )
00328 {
00329 switch ( mImpl->fieldId() ) {
00330 case FieldImpl::FormattedName:
00331 a.setFormattedName( value );
00332 return true;
00333 case FieldImpl::FamilyName:
00334 a.setFamilyName( value );
00335 return true;
00336 case FieldImpl::GivenName:
00337 a.setGivenName( value );
00338 return true;
00339 case FieldImpl::AdditionalName:
00340 a.setAdditionalName( value );
00341 return true;
00342 case FieldImpl::Prefix:
00343 a.setPrefix( value );
00344 return true;
00345 case FieldImpl::Suffix:
00346 a.setSuffix( value );
00347 return true;
00348 case FieldImpl::NickName:
00349 a.setNickName( value );
00350 return true;
00351 case FieldImpl::Mailer:
00352 a.setMailer( value );
00353 return true;
00354 case FieldImpl::Title:
00355 a.setTitle( value );
00356 return true;
00357 case FieldImpl::Role:
00358 a.setRole( value );
00359 return true;
00360 case FieldImpl::Organization:
00361 a.setOrganization( value );
00362 return true;
00363 case FieldImpl::Note:
00364 a.setNote( value );
00365 return true;
00366 case FieldImpl::Birthday:
00367 a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00368 case FieldImpl::CustomField:
00369 a.insertCustom( mImpl->app(), mImpl->key(), value );
00370 default:
00371 return false;
00372 }
00373 }
00374
00375 QString Field::sortKey( const KABC::Addressee &a )
00376 {
00377 switch ( mImpl->fieldId() ) {
00378 case FieldImpl::FormattedName:
00379 return a.formattedName();
00380 case FieldImpl::FamilyName:
00381 return a.familyName();
00382 case FieldImpl::GivenName:
00383 return a.givenName();
00384 case FieldImpl::AdditionalName:
00385 return a.additionalName();
00386 case FieldImpl::Prefix:
00387 return a.prefix();
00388 case FieldImpl::Suffix:
00389 return a.suffix();
00390 case FieldImpl::NickName:
00391 return a.nickName();
00392 case FieldImpl::Mailer:
00393 return a.mailer();
00394 case FieldImpl::Title:
00395 return a.title();
00396 case FieldImpl::Role:
00397 return a.role();
00398 case FieldImpl::Organization:
00399 return a.organization();
00400 case FieldImpl::Note:
00401 return a.note();
00402 case FieldImpl::Birthday:
00403 if ( a.birthday().isValid() ) {
00404 QDate date = a.birthday().date();
00405 QString key;
00406 key.sprintf( "%02d-%02d", date.month(), date.day() );
00407 return key;
00408 } else
00409 return QString( "00-00" );
00410 default:
00411 return value( a ).lower();
00412 }
00413 }
00414
00415 bool Field::isCustom()
00416 {
00417 return mImpl->fieldId() == FieldImpl::CustomField;
00418 }
00419
00420 Field::List Field::allFields()
00421 {
00422 if ( mAllFields.isEmpty() ) {
00423 createField( FieldImpl::FormattedName, Frequent );
00424 createField( FieldImpl::FamilyName, Frequent );
00425 createField( FieldImpl::GivenName, Frequent );
00426 createField( FieldImpl::AdditionalName );
00427 createField( FieldImpl::Prefix );
00428 createField( FieldImpl::Suffix );
00429 createField( FieldImpl::NickName, Personal );
00430 createField( FieldImpl::Birthday, Personal );
00431 createField( FieldImpl::HomeAddressStreet, Address|Personal );
00432 createField( FieldImpl::HomeAddressLocality, Address|Personal );
00433 createField( FieldImpl::HomeAddressRegion, Address|Personal );
00434 createField( FieldImpl::HomeAddressPostalCode, Address|Personal );
00435 createField( FieldImpl::HomeAddressCountry, Address|Personal );
00436 createField( FieldImpl::HomeAddressLabel, Address|Personal );
00437 createField( FieldImpl::BusinessAddressStreet, Address|Organization );
00438 createField( FieldImpl::BusinessAddressLocality, Address|Organization );
00439 createField( FieldImpl::BusinessAddressRegion, Address|Organization );
00440 createField( FieldImpl::BusinessAddressPostalCode, Address|Organization );
00441 createField( FieldImpl::BusinessAddressCountry, Address|Organization );
00442 createField( FieldImpl::BusinessAddressLabel, Address|Organization );
00443 createField( FieldImpl::HomePhone, Personal|Frequent );
00444 createField( FieldImpl::BusinessPhone, Organization|Frequent );
00445 createField( FieldImpl::MobilePhone, Frequent );
00446 createField( FieldImpl::HomeFax );
00447 createField( FieldImpl::BusinessFax );
00448 createField( FieldImpl::CarPhone );
00449 createField( FieldImpl::Isdn );
00450 createField( FieldImpl::Pager );
00451 createField( FieldImpl::Email, Email|Frequent );
00452 createField( FieldImpl::Mailer, Email );
00453 createField( FieldImpl::Title, Organization );
00454 createField( FieldImpl::Role, Organization );
00455 createField( FieldImpl::Organization, Organization );
00456 createField( FieldImpl::Note );
00457 createField( FieldImpl::Url );
00458 }
00459
00460 return mAllFields;
00461 }
00462
00463 Field::List Field::defaultFields()
00464 {
00465 if ( mDefaultFields.isEmpty() ) {
00466 createDefaultField( FieldImpl::GivenName );
00467 createDefaultField( FieldImpl::FamilyName );
00468 createDefaultField( FieldImpl::Email );
00469 }
00470
00471 return mDefaultFields;
00472 }
00473
00474 void Field::createField( int id, int category )
00475 {
00476 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00477 }
00478
00479 void Field::createDefaultField( int id, int category )
00480 {
00481 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00482 }
00483
00484 void Field::deleteFields()
00485 {
00486 Field::List::ConstIterator it;
00487
00488 for( it = mAllFields.begin(); it != mAllFields.end(); ++it ) {
00489 delete (*it);
00490 }
00491 mAllFields.clear();
00492
00493 for( it = mDefaultFields.begin(); it != mDefaultFields.end(); ++it ) {
00494 delete (*it);
00495 }
00496 mDefaultFields.clear();
00497
00498 for( it = mCustomFields.begin(); it != mCustomFields.end(); ++it ) {
00499 delete (*it);
00500 }
00501 mCustomFields.clear();
00502 }
00503
00504 void Field::saveFields( const QString &identifier,
00505 const Field::List &fields )
00506 {
00507 KConfig *cfg = KGlobal::config();
00508 KConfigGroupSaver( cfg, "KABCFields" );
00509
00510 saveFields( cfg, identifier, fields );
00511 }
00512
00513 void Field::saveFields( KConfig *cfg, const QString &identifier,
00514 const Field::List &fields )
00515 {
00516 QValueList<int> fieldIds;
00517
00518 int custom = 0;
00519 Field::List::ConstIterator it;
00520 for( it = fields.begin(); it != fields.end(); ++it ) {
00521 fieldIds.append( (*it)->mImpl->fieldId() );
00522 if( (*it)->isCustom() ) {
00523 QStringList customEntry;
00524 customEntry << (*it)->mImpl->label();
00525 customEntry << (*it)->mImpl->key();
00526 customEntry << (*it)->mImpl->app();
00527 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00528 QString::number( custom++ ), customEntry );
00529 }
00530 }
00531
00532 cfg->writeEntry( identifier, fieldIds );
00533 }
00534
00535 Field::List Field::restoreFields( const QString &identifier )
00536 {
00537 KConfig *cfg = KGlobal::config();
00538 KConfigGroupSaver( cfg, "KABCFields" );
00539
00540 return restoreFields( cfg, identifier );
00541 }
00542
00543 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00544 {
00545 QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00546
00547 Field::List fields;
00548
00549 int custom = 0;
00550 QValueList<int>::ConstIterator it;
00551 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00552 FieldImpl *f = 0;
00553 if ( (*it) == FieldImpl::CustomField ) {
00554 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00555 identifier + "_" +
00556 QString::number( custom++ ) );
00557 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00558 customEntry[ 1 ], customEntry[ 2 ] );
00559 } else {
00560 f = new FieldImpl( *it );
00561 }
00562 fields.append( new Field( f ) );
00563 }
00564
00565 return fields;
00566 }
00567
00568 bool Field::equals( Field *field )
00569 {
00570 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00571
00572 if ( !sameId ) return false;
00573
00574 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00575
00576 return mImpl->key() == field->mImpl->key();
00577 }
00578
00579 Field *Field::createCustomField( const QString &label, int category,
00580 const QString &key, const QString &app )
00581 {
00582 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00583 category | CustomCategory,
00584 label, key, app ) );
00585 mCustomFields.append( field );
00586
00587 return field;
00588 }