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::HomeAddressPostOfficeBox:
00188 return a.address( Address::Home ).postOfficeBox();
00189 case FieldImpl::HomeAddressLocality:
00190 return a.address( Address::Home ).locality();
00191 case FieldImpl::HomeAddressRegion:
00192 return a.address( Address::Home ).region();
00193 case FieldImpl::HomeAddressPostalCode:
00194 return a.address( Address::Home ).postalCode();
00195 case FieldImpl::HomeAddressCountry:
00196 return a.address( Address::Home ).country();
00197 case FieldImpl::HomeAddressLabel:
00198 return a.address( Address::Home ).label();
00199 case FieldImpl::BusinessAddressStreet:
00200 return a.address( Address::Work ).street();
00201 case FieldImpl::BusinessAddressPostOfficeBox:
00202 return a.address( Address::Work ).postOfficeBox();
00203 case FieldImpl::BusinessAddressLocality:
00204 return a.address( Address::Work ).locality();
00205 case FieldImpl::BusinessAddressRegion:
00206 return a.address( Address::Work ).region();
00207 case FieldImpl::BusinessAddressPostalCode:
00208 return a.address( Address::Work ).postalCode();
00209 case FieldImpl::BusinessAddressCountry:
00210 return a.address( Address::Work ).country();
00211 case FieldImpl::BusinessAddressLabel:
00212 return a.address( Address::Work ).label();
00213 case FieldImpl::CustomField:
00214 return a.custom( mImpl->app(), mImpl->key() );
00215 default:
00216 return QString::null;
00217 }
00218 }
00219
00220 bool Field::setValue( KABC::Addressee &a, const QString &value )
00221 {
00222 switch ( mImpl->fieldId() ) {
00223 --CASESETVALUE--
00224 case FieldImpl::MobilePhone:
00225 {
00226 PhoneNumber number = a.phoneNumber( PhoneNumber::Cell );
00227 number.setNumber( value );
00228 a.insertPhoneNumber( number );
00229 return true;
00230 }
00231 case FieldImpl::HomeFax:
00232 {
00233 PhoneNumber number = a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax );
00234 number.setNumber( value );
00235 a.insertPhoneNumber( number );
00236 return true;
00237 }
00238 case FieldImpl::BusinessFax:
00239 {
00240 PhoneNumber number = a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax );
00241 number.setNumber( value );
00242 a.insertPhoneNumber( number );
00243 return true;
00244 }
00245 case FieldImpl::CarPhone:
00246 {
00247 PhoneNumber number = a.phoneNumber( PhoneNumber::Car );
00248 number.setNumber( value );
00249 a.insertPhoneNumber( number );
00250 return true;
00251 }
00252 case FieldImpl::Isdn:
00253 {
00254 PhoneNumber number = a.phoneNumber( PhoneNumber::Isdn );
00255 number.setNumber( value );
00256 a.insertPhoneNumber( number );
00257 return true;
00258 }
00259 case FieldImpl::Pager:
00260 {
00261 PhoneNumber number = a.phoneNumber( PhoneNumber::Pager );
00262 number.setNumber( value );
00263 a.insertPhoneNumber( number );
00264 return true;
00265 }
00266 case FieldImpl::HomeAddressStreet:
00267 {
00268 KABC::Address address = a.address( Address::Home );
00269 address.setStreet( value );
00270 a.insertAddress( address );
00271 return true;
00272 }
00273 case FieldImpl::HomeAddressPostOfficeBox:
00274 {
00275 KABC::Address address = a.address( Address::Home );
00276 address.setPostOfficeBox( value );
00277 a.insertAddress( address );
00278 return true;
00279 }
00280 case FieldImpl::HomeAddressLocality:
00281 {
00282 KABC::Address address = a.address( Address::Home );
00283 address.setLocality( value );
00284 a.insertAddress( address );
00285 return true;
00286 }
00287 case FieldImpl::HomeAddressRegion:
00288 {
00289 KABC::Address address = a.address( Address::Home );
00290 address.setRegion( value );
00291 a.insertAddress( address );
00292 return true;
00293 }
00294 case FieldImpl::HomeAddressPostalCode:
00295 {
00296 KABC::Address address = a.address( Address::Home );
00297 address.setPostalCode( value );
00298 a.insertAddress( address );
00299 return true;
00300 }
00301 case FieldImpl::HomeAddressCountry:
00302 {
00303 KABC::Address address = a.address( Address::Home );
00304 address.setCountry( value );
00305 a.insertAddress( address );
00306 return true;
00307 }
00308 case FieldImpl::HomeAddressLabel:
00309 {
00310 KABC::Address address = a.address( Address::Home );
00311 address.setLabel( value );
00312 a.insertAddress( address );
00313 return true;
00314 }
00315 case FieldImpl::BusinessAddressStreet:
00316 {
00317 KABC::Address address = a.address( Address::Work );
00318 address.setStreet( value );
00319 a.insertAddress( address );
00320 return true;
00321 }
00322 case FieldImpl::BusinessAddressPostOfficeBox:
00323 {
00324 KABC::Address address = a.address( Address::Work );
00325 address.setPostOfficeBox( value );
00326 a.insertAddress( address );
00327 return true;
00328 }
00329 case FieldImpl::BusinessAddressLocality:
00330 {
00331 KABC::Address address = a.address( Address::Work );
00332 address.setLocality( value );
00333 a.insertAddress( address );
00334 return true;
00335 }
00336 case FieldImpl::BusinessAddressRegion:
00337 {
00338 KABC::Address address = a.address( Address::Work );
00339 address.setRegion( value );
00340 a.insertAddress( address );
00341 return true;
00342 }
00343 case FieldImpl::BusinessAddressPostalCode:
00344 {
00345 KABC::Address address = a.address( Address::Work );
00346 address.setPostalCode( value );
00347 a.insertAddress( address );
00348 return true;
00349 }
00350 case FieldImpl::BusinessAddressCountry:
00351 {
00352 KABC::Address address = a.address( Address::Work );
00353 address.setCountry( value );
00354 a.insertAddress( address );
00355 return true;
00356 }
00357 case FieldImpl::BusinessAddressLabel:
00358 {
00359 KABC::Address address = a.address( Address::Work );
00360 address.setLabel( value );
00361 a.insertAddress( address );
00362 return true;
00363 }
00364 case FieldImpl::Birthday:
00365 a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00366 return true;
00367 case FieldImpl::CustomField:
00368 a.insertCustom( mImpl->app(), mImpl->key(), value );
00369 return true;
00370 default:
00371 return false;
00372 }
00373 }
00374
00375 QString Field::sortKey( const KABC::Addressee &a )
00376 {
00377 switch ( mImpl->fieldId() ) {
00378 --CASEVALUE--
00379 case FieldImpl::Birthday:
00380 if ( a.birthday().isValid() ) {
00381 QDate date = a.birthday().date();
00382 QString key;
00383 key.sprintf( "%02d-%02d", date.month(), date.day() );
00384 return key;
00385 } else
00386 return QString( "00-00" );
00387 default:
00388 return value( a ).lower();
00389 }
00390 }
00391
00392 bool Field::isCustom()
00393 {
00394 return mImpl->fieldId() == FieldImpl::CustomField;
00395 }
00396
00397 Field::List Field::allFields()
00398 {
00399 if ( mAllFields.isEmpty() ) {
00400 --CREATEFIELDS--
00401 }
00402
00403 return mAllFields;
00404 }
00405
00406 Field::List Field::defaultFields()
00407 {
00408 if ( mDefaultFields.isEmpty() ) {
00409 createDefaultField( FieldImpl::FormattedName );
00410 createDefaultField( FieldImpl::Email );
00411 }
00412
00413 return mDefaultFields;
00414 }
00415
00416 void Field::createField( int id, int category )
00417 {
00418 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00419 }
00420
00421 void Field::createDefaultField( int id, int category )
00422 {
00423 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00424 }
00425
00426 void Field::deleteFields()
00427 {
00428 Field::List::ConstIterator it;
00429
00430 for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) {
00431 delete (*it);
00432 }
00433 mAllFields.clear();
00434
00435 for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) {
00436 delete (*it);
00437 }
00438 mDefaultFields.clear();
00439
00440 for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) {
00441 delete (*it);
00442 }
00443 mCustomFields.clear();
00444 }
00445
00446 void Field::saveFields( const QString &identifier,
00447 const Field::List &fields )
00448 {
00449 KConfig *cfg = KGlobal::config();
00450 KConfigGroupSaver( cfg, "KABCFields" );
00451
00452 saveFields( cfg, identifier, fields );
00453 }
00454
00455 void Field::saveFields( KConfig *cfg, const QString &identifier,
00456 const Field::List &fields )
00457 {
00458 QValueList<int> fieldIds;
00459
00460 int custom = 0;
00461 Field::List::ConstIterator it;
00462 for( it = fields.begin(); it != fields.end(); ++it ) {
00463 fieldIds.append( (*it)->mImpl->fieldId() );
00464 if( (*it)->isCustom() ) {
00465 QStringList customEntry;
00466 customEntry << (*it)->mImpl->label();
00467 customEntry << (*it)->mImpl->key();
00468 customEntry << (*it)->mImpl->app();
00469 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00470 QString::number( custom++ ), customEntry );
00471 }
00472 }
00473
00474 cfg->writeEntry( identifier, fieldIds );
00475 }
00476
00477 Field::List Field::restoreFields( const QString &identifier )
00478 {
00479 KConfig *cfg = KGlobal::config();
00480 KConfigGroupSaver( cfg, "KABCFields" );
00481
00482 return restoreFields( cfg, identifier );
00483 }
00484
00485 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00486 {
00487 const QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00488
00489 Field::List fields;
00490
00491 int custom = 0;
00492 QValueList<int>::ConstIterator it;
00493 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00494 FieldImpl *f = 0;
00495 if ( (*it) == FieldImpl::CustomField ) {
00496 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00497 identifier + "_" +
00498 QString::number( custom++ ) );
00499 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00500 customEntry[ 1 ], customEntry[ 2 ] );
00501 } else {
00502 f = new FieldImpl( *it );
00503 }
00504 fields.append( new Field( f ) );
00505 }
00506
00507 return fields;
00508 }
00509
00510 bool Field::equals( Field *field )
00511 {
00512 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00513
00514 if ( !sameId ) return false;
00515
00516 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00517
00518 return mImpl->key() == field->mImpl->key();
00519 }
00520
00521 Field *Field::createCustomField( const QString &label, int category,
00522 const QString &key, const QString &app )
00523 {
00524 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00525 category | CustomCategory,
00526 label, key, app ) );
00527 mCustomFields.append( field );
00528
00529 return field;
00530 }