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