kabc Library API Documentation

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., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 */
00020 
00021 #include <klocale.h>
00022 #include <kconfig.h>
00023 #include <kglobal.h>
00024 
00025 #include "field.h"
00026 
00027 using namespace KABC;
00028 
00029 class Field::FieldImpl
00030 {
00031   public:
00032     FieldImpl( int fieldId, int category = 0,
00033                const QString &label = QString::null,
00034                const QString &key = QString::null,
00035                const QString &app = QString::null )
00036       : mFieldId( fieldId ), mCategory( category ), mLabel( label ),
00037         mKey( key ), mApp( app ) {}
00038   
00039     enum FieldId
00040     {
00041       CustomField,
00042       --ENUMS--
00043     };
00044 
00045     int fieldId() { return mFieldId; }
00046     int category() { return mCategory; }
00047     
00048     QString label() { return mLabel; }
00049     QString key() { return mKey; }
00050     QString app() { return mApp; }
00051     
00052   private:
00053     int mFieldId;
00054     int mCategory;
00055 
00056     QString mLabel;
00057     QString mKey;
00058     QString mApp;
00059 };
00060 
00061 
00062 Field::List Field::mAllFields;
00063 Field::List Field::mDefaultFields;
00064 Field::List Field::mCustomFields;
00065 
00066 
00067 Field::Field( FieldImpl *impl )
00068 {
00069   mImpl = impl;
00070 }
00071 
00072 Field::~Field()
00073 {
00074   delete mImpl;
00075 }
00076 
00077 QString Field::label()
00078 {
00079   switch ( mImpl->fieldId() ) {
00080     --CASELABEL--
00081     case FieldImpl::CustomField:
00082       return mImpl->label();
00083     default:
00084       return i18n("Unknown Field");
00085   }
00086 }
00087 
00088 int Field::category()
00089 {
00090   return mImpl->category();
00091 }
00092 
00093 QString Field::categoryLabel( int category )
00094 {
00095   switch ( category ) {
00096     case All:
00097       return i18n("All");
00098     case Frequent:
00099       return i18n("Frequent");
00100     case Address:
00101       return i18n("Address");
00102     case Email:
00103       return i18n("Email");
00104     case Personal:
00105       return i18n("Personal");
00106     case Organization:
00107       return i18n("Organization");
00108     case CustomCategory:
00109       return i18n("Custom");
00110     default:
00111       return i18n("Undefined");
00112   }
00113 }
00114 
00115 QString Field::value( const KABC::Addressee &a )
00116 {
00117   switch ( mImpl->fieldId() ) {
00118     --CASEVALUE--
00119     case FieldImpl::Email:
00120       return a.preferredEmail();
00121     case FieldImpl::Birthday:
00122       if ( a.birthday().isValid() )
00123         return a.birthday().date().toString( Qt::ISODate );
00124       else
00125         return QString::null;
00126     case FieldImpl::Url:
00127       return a.url().prettyURL();
00128     case FieldImpl::HomePhone:
00129     {
00130       // check for preferred number
00131       PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref );
00132       PhoneNumber::List::Iterator it;
00133       for ( it = list.begin(); it != list.end(); ++it )
00134         if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00135           return (*it).number();
00136 
00137       // check for normal home number
00138       list = a.phoneNumbers( PhoneNumber::Home );
00139       for ( it = list.begin(); it != list.end(); ++it )
00140         if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00141           return (*it).number();
00142 
00143       return QString::null;
00144     }
00145     case FieldImpl::BusinessPhone:
00146     {
00147       // check for preferred number
00148       PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref );
00149       PhoneNumber::List::Iterator it;
00150       for ( it = list.begin(); it != list.end(); ++it )
00151         if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00152           return (*it).number();
00153 
00154       // check for normal work number
00155       list = a.phoneNumbers( PhoneNumber::Work );
00156       for ( it = list.begin(); it != list.end(); ++it )
00157         if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00158           return (*it).number();
00159       return QString::null;
00160     }
00161     case FieldImpl::MobilePhone:
00162       return a.phoneNumber( PhoneNumber::Cell ).number();
00163     case FieldImpl::HomeFax:
00164       return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
00165     case FieldImpl::BusinessFax:
00166       return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
00167     case FieldImpl::CarPhone:
00168       return a.phoneNumber( PhoneNumber::Car ).number();
00169     case FieldImpl::Isdn:
00170       return a.phoneNumber( PhoneNumber::Isdn ).number();
00171     case FieldImpl::Pager:
00172       return a.phoneNumber( PhoneNumber::Pager ).number();
00173     case FieldImpl::HomeAddressStreet:
00174       return a.address( Address::Home ).street();
00175     case FieldImpl::HomeAddressLocality:
00176       return a.address( Address::Home ).locality();
00177     case FieldImpl::HomeAddressRegion:
00178       return a.address( Address::Home ).region();
00179     case FieldImpl::HomeAddressPostalCode:
00180       return a.address( Address::Home ).postalCode();
00181     case FieldImpl::HomeAddressCountry:
00182       return a.address( Address::Home ).country();
00183     case FieldImpl::BusinessAddressStreet:
00184       return a.address( Address::Work ).street();
00185     case FieldImpl::BusinessAddressLocality:
00186       return a.address( Address::Work ).locality();
00187     case FieldImpl::BusinessAddressRegion:
00188       return a.address( Address::Work ).region();
00189     case FieldImpl::BusinessAddressPostalCode:
00190       return a.address( Address::Work ).postalCode();
00191     case FieldImpl::BusinessAddressCountry:
00192       return a.address( Address::Work ).country();
00193     case FieldImpl::CustomField:
00194       return a.custom( mImpl->app(), mImpl->key() );
00195     default:
00196       return QString::null;
00197   }
00198 }
00199 
00200 bool Field::setValue( KABC::Addressee &a, const QString &value )
00201 {
00202   switch ( mImpl->fieldId() ) {
00203     --CASESETVALUE--
00204     case FieldImpl::Birthday:
00205       a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00206     case FieldImpl::CustomField:
00207       a.insertCustom( mImpl->app(), mImpl->key(), value );
00208     default:
00209       return false;
00210   }
00211 }
00212 
00213 QString Field::sortKey( const KABC::Addressee &a )
00214 {
00215   switch ( mImpl->fieldId() ) {
00216     --CASEVALUE--
00217     case FieldImpl::Birthday:
00218       if ( a.birthday().isValid() ) {
00219         QDate date = a.birthday().date();
00220         QString key;
00221         key.sprintf( "%02d-%02d", date.month(), date.day() );
00222         return key;
00223       } else
00224         return QString( "00-00" );
00225     default:
00226       return value( a ).lower();
00227   }
00228 }
00229 
00230 bool Field::isCustom()
00231 {
00232   return mImpl->fieldId() == FieldImpl::CustomField;
00233 }
00234 
00235 Field::List Field::allFields()
00236 {
00237   if ( mAllFields.isEmpty() ) {
00238     --CREATEFIELDS--
00239   }
00240 
00241   return mAllFields;
00242 }
00243 
00244 Field::List Field::defaultFields()
00245 {
00246   if ( mDefaultFields.isEmpty() ) {
00247     createDefaultField( FieldImpl::GivenName );
00248     createDefaultField( FieldImpl::FamilyName );
00249     createDefaultField( FieldImpl::Email );
00250   }
00251 
00252   return mDefaultFields;
00253 }
00254 
00255 void Field::createField( int id, int category )
00256 {
00257   mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00258 }
00259 
00260 void Field::createDefaultField( int id, int category )
00261 {
00262   mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00263 }
00264 
00265 void Field::deleteFields()
00266 {
00267   Field::List::ConstIterator it;
00268 
00269   for( it = mAllFields.begin(); it != mAllFields.end(); ++it ) {
00270     delete (*it);
00271   }
00272   mAllFields.clear();
00273 
00274   for( it = mDefaultFields.begin(); it != mDefaultFields.end(); ++it ) {
00275     delete (*it);
00276   }
00277   mDefaultFields.clear();
00278 
00279   for( it = mCustomFields.begin(); it != mCustomFields.end(); ++it ) {
00280     delete (*it);
00281   }
00282   mCustomFields.clear();
00283 }
00284 
00285 void Field::saveFields( const QString &identifier,
00286                         const Field::List &fields )
00287 {
00288   KConfig *cfg = KGlobal::config();
00289   KConfigGroupSaver( cfg, "KABCFields" );
00290 
00291   saveFields( cfg, identifier, fields );
00292 }
00293 
00294 void Field::saveFields( KConfig *cfg, const QString &identifier,
00295                         const Field::List &fields )
00296 {
00297   QValueList<int> fieldIds;
00298   
00299   int custom = 0;
00300   Field::List::ConstIterator it;
00301   for( it = fields.begin(); it != fields.end(); ++it ) {
00302     fieldIds.append( (*it)->mImpl->fieldId() );
00303     if( (*it)->isCustom() ) {
00304       QStringList customEntry;
00305       customEntry << (*it)->mImpl->label();
00306       customEntry << (*it)->mImpl->key();
00307       customEntry << (*it)->mImpl->app();
00308       cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00309                        QString::number( custom++ ), customEntry );
00310     }
00311   }
00312   
00313   cfg->writeEntry( identifier, fieldIds );
00314 }
00315 
00316 Field::List Field::restoreFields( const QString &identifier )
00317 {
00318   KConfig *cfg = KGlobal::config();
00319   KConfigGroupSaver( cfg, "KABCFields" );
00320  
00321   return restoreFields( cfg, identifier );
00322 }
00323 
00324 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00325 {
00326   QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00327 
00328   Field::List fields;
00329 
00330   int custom = 0;
00331   QValueList<int>::ConstIterator it;
00332   for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00333     FieldImpl *f = 0;
00334     if ( (*it) == FieldImpl::CustomField ) {
00335       QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00336                                                  identifier + "_" +
00337                                                  QString::number( custom++ ) );
00338       f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00339                          customEntry[ 1 ], customEntry[ 2 ] );
00340     } else {
00341       f = new FieldImpl( *it );
00342     }
00343     fields.append( new Field( f ) );
00344   }
00345   
00346   return fields;
00347 }
00348 
00349 bool Field::equals( Field *field )
00350 {
00351   bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00352 
00353   if ( !sameId ) return false;
00354 
00355   if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00356   
00357   return mImpl->key() == field->mImpl->key();
00358 }
00359 
00360 Field *Field::createCustomField( const QString &label, int category,
00361                                  const QString &key, const QString &app )
00362 {
00363   Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00364                                            category | CustomCategory,
00365                                            label, key, app ) );
00366   mCustomFields.append( field );
00367 
00368   return field;
00369 }
KDE Logo
This file is part of the documentation for kabc Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Sep 23 17:13:01 2004 by doxygen 1.3.8-20040913 written by Dimitri van Heesch, © 1997-2003