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 }