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 }