00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <klocale.h>
00022 #include <kconfig.h>
00023 #include <kglobal.h>
00024
00025 #include "field.h"
00026 #include "address.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 --ENUMS--
00044 };
00045
00046 int fieldId() { return mFieldId; }
00047 int category() { return mCategory; }
00048
00049 QString label() { return mLabel; }
00050 QString key() { return mKey; }
00051 QString app() { return mApp; }
00052
00053 private:
00054 int mFieldId;
00055 int mCategory;
00056
00057 QString mLabel;
00058 QString mKey;
00059 QString mApp;
00060 };
00061
00062
00063 Field::List Field::mAllFields;
00064 Field::List Field::mDefaultFields;
00065 Field::List Field::mCustomFields;
00066
00067
00068 Field::Field( FieldImpl *impl )
00069 {
00070 mImpl = impl;
00071 }
00072
00073 Field::~Field()
00074 {
00075 delete mImpl;
00076 }
00077
00078 QString Field::label()
00079 {
00080 switch ( mImpl->fieldId() ) {
00081 --CASELABEL--
00082 case FieldImpl::CustomField:
00083 return mImpl->label();
00084 default:
00085 return i18n("Unknown Field");
00086 }
00087 }
00088
00089 int Field::category()
00090 {
00091 return mImpl->category();
00092 }
00093
00094 QString Field::categoryLabel( int category )
00095 {
00096 switch ( category ) {
00097 case All:
00098 return i18n("All");
00099 case Frequent:
00100 return i18n("Frequent");
00101 case Address:
00102 return i18n("street/postal","Address");
00103 case Email:
00104 return i18n("Email");
00105 case Personal:
00106 return i18n("Personal");
00107 case Organization:
00108 return i18n("Organization");
00109 case CustomCategory:
00110 return i18n("Custom");
00111 default:
00112 return i18n("Undefined");
00113 }
00114 }
00115
00116 QString Field::value( const KABC::Addressee &a )
00117 {
00118 switch ( mImpl->fieldId() ) {
00119 --CASEVALUE--
00120 case FieldImpl::Email:
00121 return a.preferredEmail();
00122 case FieldImpl::Birthday:
00123 if ( a.birthday().isValid() )
00124 return a.birthday().date().toString( Qt::ISODate );
00125 else
00126 return QString::null;
00127 case FieldImpl::Url:
00128 return a.url().prettyURL();
00129 case FieldImpl::HomePhone:
00130 {
00131 PhoneNumber::List::ConstIterator it;
00132
00133 {
00134
00135 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref );
00136 for ( it = list.begin(); it != list.end(); ++it )
00137 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00138 return (*it).number();
00139 }
00140
00141 {
00142
00143 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home );
00144 for ( it = list.begin(); it != list.end(); ++it )
00145 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00146 return (*it).number();
00147 }
00148
00149 return QString::null;
00150 }
00151 case FieldImpl::BusinessPhone:
00152 {
00153 PhoneNumber::List::ConstIterator it;
00154
00155 {
00156
00157 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref );
00158 for ( it = list.begin(); it != list.end(); ++it )
00159 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00160 return (*it).number();
00161 }
00162
00163 {
00164
00165 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work );
00166 for ( it = list.begin(); it != list.end(); ++it )
00167 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00168 return (*it).number();
00169 }
00170
00171 return QString::null;
00172 }
00173 case FieldImpl::MobilePhone:
00174 return a.phoneNumber( PhoneNumber::Cell ).number();
00175 case FieldImpl::HomeFax:
00176 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
00177 case FieldImpl::BusinessFax:
00178 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
00179 case FieldImpl::CarPhone:
00180 return a.phoneNumber( PhoneNumber::Car ).number();
00181 case FieldImpl::Isdn:
00182 return a.phoneNumber( PhoneNumber::Isdn ).number();
00183 case FieldImpl::Pager:
00184 return a.phoneNumber( PhoneNumber::Pager ).number();
00185 case FieldImpl::HomeAddressStreet:
00186 return a.address( Address::Home ).street();
00187 case FieldImpl::HomeAddressLocality:
00188 return a.address( Address::Home ).locality();
00189 case FieldImpl::HomeAddressRegion:
00190 return a.address( Address::Home ).region();
00191 case FieldImpl::HomeAddressPostalCode:
00192 return a.address( Address::Home ).postalCode();
00193 case FieldImpl::HomeAddressCountry:
00194 return a.address( Address::Home ).country();
00195 case FieldImpl::HomeAddressLabel:
00196 return a.address( Address::Home ).label();
00197 case FieldImpl::BusinessAddressStreet:
00198 return a.address( Address::Work ).street();
00199 case FieldImpl::BusinessAddressLocality:
00200 return a.address( Address::Work ).locality();
00201 case FieldImpl::BusinessAddressRegion:
00202 return a.address( Address::Work ).region();
00203 case FieldImpl::BusinessAddressPostalCode:
00204 return a.address( Address::Work ).postalCode();
00205 case FieldImpl::BusinessAddressCountry:
00206 return a.address( Address::Work ).country();
00207 case FieldImpl::BusinessAddressLabel:
00208 return a.address( Address::Work ).label();
00209 case FieldImpl::CustomField:
00210 return a.custom( mImpl->app(), mImpl->key() );
00211 default:
00212 return QString::null;
00213 }
00214 }
00215
00216 bool Field::setValue( KABC::Addressee &a, const QString &value )
00217 {
00218 switch ( mImpl->fieldId() ) {
00219 --CASESETVALUE--
00220 case FieldImpl::MobilePhone:
00221 {
00222 PhoneNumber number = a.phoneNumber( PhoneNumber::Cell );
00223 number.setNumber( value );
00224 a.insertPhoneNumber( number );
00225 return true;
00226 }
00227 case FieldImpl::HomeFax:
00228 {
00229 PhoneNumber number = a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax );
00230 number.setNumber( value );
00231 a.insertPhoneNumber( number );
00232 return true;
00233 }
00234 case FieldImpl::BusinessFax:
00235 {
00236 PhoneNumber number = a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax );
00237 number.setNumber( value );
00238 a.insertPhoneNumber( number );
00239 return true;
00240 }
00241 case FieldImpl::CarPhone:
00242 {
00243 PhoneNumber number = a.phoneNumber( PhoneNumber::Car );
00244 number.setNumber( value );
00245 a.insertPhoneNumber( number );
00246 return true;
00247 }
00248 case FieldImpl::Isdn:
00249 {
00250 PhoneNumber number = a.phoneNumber( PhoneNumber::Isdn );
00251 number.setNumber( value );
00252 a.insertPhoneNumber( number );
00253 return true;
00254 }
00255 case FieldImpl::Pager:
00256 {
00257 PhoneNumber number = a.phoneNumber( PhoneNumber::Pager );
00258 number.setNumber( value );
00259 a.insertPhoneNumber( number );
00260 return true;
00261 }
00262 case FieldImpl::HomeAddressStreet:
00263 {
00264 KABC::Address address = a.address( Address::Home );
00265 address.setStreet( value );
00266 a.insertAddress( address );
00267 return true;
00268 }
00269 case FieldImpl::HomeAddressLocality:
00270 {
00271 KABC::Address address = a.address( Address::Home );
00272 address.setLocality( value );
00273 a.insertAddress( address );
00274 return true;
00275 }
00276 case FieldImpl::HomeAddressRegion:
00277 {
00278 KABC::Address address = a.address( Address::Home );
00279 address.setRegion( value );
00280 a.insertAddress( address );
00281 return true;
00282 }
00283 case FieldImpl::HomeAddressPostalCode:
00284 {
00285 KABC::Address address = a.address( Address::Home );
00286 address.setPostalCode( value );
00287 a.insertAddress( address );
00288 return true;
00289 }
00290 case FieldImpl::HomeAddressCountry:
00291 {
00292 KABC::Address address = a.address( Address::Home );
00293 address.setCountry( value );
00294 a.insertAddress( address );
00295 return true;
00296 }
00297 case FieldImpl::HomeAddressLabel:
00298 {
00299 KABC::Address address = a.address( Address::Home );
00300 address.setLabel( value );
00301 a.insertAddress( address );
00302 return true;
00303 }
00304 case FieldImpl::BusinessAddressStreet:
00305 {
00306 KABC::Address address = a.address( Address::Work );
00307 address.setStreet( value );
00308 a.insertAddress( address );
00309 return true;
00310 }
00311 case FieldImpl::BusinessAddressLocality:
00312 {
00313 KABC::Address address = a.address( Address::Work );
00314 address.setLocality( value );
00315 a.insertAddress( address );
00316 return true;
00317 }
00318 case FieldImpl::BusinessAddressRegion:
00319 {
00320 KABC::Address address = a.address( Address::Work );
00321 address.setRegion( value );
00322 a.insertAddress( address );
00323 return true;
00324 }
00325 case FieldImpl::BusinessAddressPostalCode:
00326 {
00327 KABC::Address address = a.address( Address::Work );
00328 address.setPostalCode( value );
00329 a.insertAddress( address );
00330 return true;
00331 }
00332 case FieldImpl::BusinessAddressCountry:
00333 {
00334 KABC::Address address = a.address( Address::Work );
00335 address.setCountry( value );
00336 a.insertAddress( address );
00337 return true;
00338 }
00339 case FieldImpl::BusinessAddressLabel:
00340 {
00341 KABC::Address address = a.address( Address::Work );
00342 address.setLabel( value );
00343 a.insertAddress( address );
00344 return true;
00345 }
00346 case FieldImpl::Birthday:
00347 a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00348 return true;
00349 case FieldImpl::CustomField:
00350 a.insertCustom( mImpl->app(), mImpl->key(), value );
00351 return true;
00352 default:
00353 return false;
00354 }
00355 }
00356
00357 QString Field::sortKey( const KABC::Addressee &a )
00358 {
00359 switch ( mImpl->fieldId() ) {
00360 --CASEVALUE--
00361 case FieldImpl::Birthday:
00362 if ( a.birthday().isValid() ) {
00363 QDate date = a.birthday().date();
00364 QString key;
00365 key.sprintf( "%02d-%02d", date.month(), date.day() );
00366 return key;
00367 } else
00368 return QString( "00-00" );
00369 default:
00370 return value( a ).lower();
00371 }
00372 }
00373
00374 bool Field::isCustom()
00375 {
00376 return mImpl->fieldId() == FieldImpl::CustomField;
00377 }
00378
00379 Field::List Field::allFields()
00380 {
00381 if ( mAllFields.isEmpty() ) {
00382 --CREATEFIELDS--
00383 }
00384
00385 return mAllFields;
00386 }
00387
00388 Field::List Field::defaultFields()
00389 {
00390 if ( mDefaultFields.isEmpty() ) {
00391 createDefaultField( FieldImpl::FormattedName );
00392 createDefaultField( FieldImpl::Email );
00393 }
00394
00395 return mDefaultFields;
00396 }
00397
00398 void Field::createField( int id, int category )
00399 {
00400 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00401 }
00402
00403 void Field::createDefaultField( int id, int category )
00404 {
00405 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00406 }
00407
00408 void Field::deleteFields()
00409 {
00410 Field::List::ConstIterator it;
00411
00412 for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) {
00413 delete (*it);
00414 }
00415 mAllFields.clear();
00416
00417 for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) {
00418 delete (*it);
00419 }
00420 mDefaultFields.clear();
00421
00422 for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) {
00423 delete (*it);
00424 }
00425 mCustomFields.clear();
00426 }
00427
00428 void Field::saveFields( const QString &identifier,
00429 const Field::List &fields )
00430 {
00431 KConfig *cfg = KGlobal::config();
00432 KConfigGroupSaver( cfg, "KABCFields" );
00433
00434 saveFields( cfg, identifier, fields );
00435 }
00436
00437 void Field::saveFields( KConfig *cfg, const QString &identifier,
00438 const Field::List &fields )
00439 {
00440 QValueList<int> fieldIds;
00441
00442 int custom = 0;
00443 Field::List::ConstIterator it;
00444 for( it = fields.begin(); it != fields.end(); ++it ) {
00445 fieldIds.append( (*it)->mImpl->fieldId() );
00446 if( (*it)->isCustom() ) {
00447 QStringList customEntry;
00448 customEntry << (*it)->mImpl->label();
00449 customEntry << (*it)->mImpl->key();
00450 customEntry << (*it)->mImpl->app();
00451 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00452 QString::number( custom++ ), customEntry );
00453 }
00454 }
00455
00456 cfg->writeEntry( identifier, fieldIds );
00457 }
00458
00459 Field::List Field::restoreFields( const QString &identifier )
00460 {
00461 KConfig *cfg = KGlobal::config();
00462 KConfigGroupSaver( cfg, "KABCFields" );
00463
00464 return restoreFields( cfg, identifier );
00465 }
00466
00467 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00468 {
00469 const QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00470
00471 Field::List fields;
00472
00473 int custom = 0;
00474 QValueList<int>::ConstIterator it;
00475 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00476 FieldImpl *f = 0;
00477 if ( (*it) == FieldImpl::CustomField ) {
00478 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00479 identifier + "_" +
00480 QString::number( custom++ ) );
00481 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00482 customEntry[ 1 ], customEntry[ 2 ] );
00483 } else {
00484 f = new FieldImpl( *it );
00485 }
00486 fields.append( new Field( f ) );
00487 }
00488
00489 return fields;
00490 }
00491
00492 bool Field::equals( Field *field )
00493 {
00494 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00495
00496 if ( !sameId ) return false;
00497
00498 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00499
00500 return mImpl->key() == field->mImpl->key();
00501 }
00502
00503 Field *Field::createCustomField( const QString &label, int category,
00504 const QString &key, const QString &app )
00505 {
00506 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00507 category | CustomCategory,
00508 label, key, app ) );
00509 mCustomFields.append( field );
00510
00511 return field;
00512 }