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