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