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::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 }
KDE Home | KDE Accessibility Home | Description of Access Keys