field.src.cpp

00001 /*
00002     This file is part of libkabc.
00003     Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
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         // check for preferred number
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         // check for normal home number
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         // check for preferred number
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         // check for normal work number
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys