field.src.cpp
00001 /* 00002 This file is part of libtdeabc. 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 <tdelocale.h> 00022 #include <tdeconfig.h> 00023 #include <tdeglobal.h> 00024 00025 #include "field.h" 00026 #include "address.h" 00027 00028 using namespace TDEABC; 00029 00030 class Field::FieldImpl 00031 { 00032 public: 00033 FieldImpl( int fieldId, int category = 0, 00034 const TQString &label = TQString::null, 00035 const TQString &key = TQString::null, 00036 const TQString &app = TQString::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 TQString label() { return mLabel; } 00050 TQString key() { return mKey; } 00051 TQString app() { return mApp; } 00052 00053 private: 00054 int mFieldId; 00055 int mCategory; 00056 00057 TQString mLabel; 00058 TQString mKey; 00059 TQString 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 TQString 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 TQString 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 TQString Field::value( const TDEABC::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 TQString::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 TQString::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 TQString::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 TQString::null; 00217 } 00218 } 00219 00220 bool Field::setValue( TDEABC::Addressee &a, const TQString &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 TDEABC::Address address = a.address( Address::Home ); 00269 address.setStreet( value ); 00270 a.insertAddress( address ); 00271 return true; 00272 } 00273 case FieldImpl::HomeAddressPostOfficeBox: 00274 { 00275 TDEABC::Address address = a.address( Address::Home ); 00276 address.setPostOfficeBox( value ); 00277 a.insertAddress( address ); 00278 return true; 00279 } 00280 case FieldImpl::HomeAddressLocality: 00281 { 00282 TDEABC::Address address = a.address( Address::Home ); 00283 address.setLocality( value ); 00284 a.insertAddress( address ); 00285 return true; 00286 } 00287 case FieldImpl::HomeAddressRegion: 00288 { 00289 TDEABC::Address address = a.address( Address::Home ); 00290 address.setRegion( value ); 00291 a.insertAddress( address ); 00292 return true; 00293 } 00294 case FieldImpl::HomeAddressPostalCode: 00295 { 00296 TDEABC::Address address = a.address( Address::Home ); 00297 address.setPostalCode( value ); 00298 a.insertAddress( address ); 00299 return true; 00300 } 00301 case FieldImpl::HomeAddressCountry: 00302 { 00303 TDEABC::Address address = a.address( Address::Home ); 00304 address.setCountry( value ); 00305 a.insertAddress( address ); 00306 return true; 00307 } 00308 case FieldImpl::HomeAddressLabel: 00309 { 00310 TDEABC::Address address = a.address( Address::Home ); 00311 address.setLabel( value ); 00312 a.insertAddress( address ); 00313 return true; 00314 } 00315 case FieldImpl::BusinessAddressStreet: 00316 { 00317 TDEABC::Address address = a.address( Address::Work ); 00318 address.setStreet( value ); 00319 a.insertAddress( address ); 00320 return true; 00321 } 00322 case FieldImpl::BusinessAddressPostOfficeBox: 00323 { 00324 TDEABC::Address address = a.address( Address::Work ); 00325 address.setPostOfficeBox( value ); 00326 a.insertAddress( address ); 00327 return true; 00328 } 00329 case FieldImpl::BusinessAddressLocality: 00330 { 00331 TDEABC::Address address = a.address( Address::Work ); 00332 address.setLocality( value ); 00333 a.insertAddress( address ); 00334 return true; 00335 } 00336 case FieldImpl::BusinessAddressRegion: 00337 { 00338 TDEABC::Address address = a.address( Address::Work ); 00339 address.setRegion( value ); 00340 a.insertAddress( address ); 00341 return true; 00342 } 00343 case FieldImpl::BusinessAddressPostalCode: 00344 { 00345 TDEABC::Address address = a.address( Address::Work ); 00346 address.setPostalCode( value ); 00347 a.insertAddress( address ); 00348 return true; 00349 } 00350 case FieldImpl::BusinessAddressCountry: 00351 { 00352 TDEABC::Address address = a.address( Address::Work ); 00353 address.setCountry( value ); 00354 a.insertAddress( address ); 00355 return true; 00356 } 00357 case FieldImpl::BusinessAddressLabel: 00358 { 00359 TDEABC::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( TQT_TQDATE_OBJECT(TQDate::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 TQString Field::sortKey( const TDEABC::Addressee &a ) 00376 { 00377 switch ( mImpl->fieldId() ) { 00378 --CASEVALUE-- 00379 case FieldImpl::Birthday: 00380 if ( a.birthday().isValid() ) { 00381 TQDate date = TQT_TQDATE_OBJECT(a.birthday().date()); 00382 TQString key; 00383 key.sprintf( "%02d-%02d", date.month(), date.day() ); 00384 return key; 00385 } else 00386 return TQString( "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 TQString &identifier, 00447 const Field::List &fields ) 00448 { 00449 TDEConfig *cfg = TDEGlobal::config(); 00450 TDEConfigGroupSaver( cfg, "KABCFields" ); 00451 00452 saveFields( cfg, identifier, fields ); 00453 } 00454 00455 void Field::saveFields( TDEConfig *cfg, const TQString &identifier, 00456 const Field::List &fields ) 00457 { 00458 TQValueList<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 TQStringList customEntry; 00466 customEntry << (*it)->mImpl->label(); 00467 customEntry << (*it)->mImpl->key(); 00468 customEntry << (*it)->mImpl->app(); 00469 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" + 00470 TQString::number( custom++ ), customEntry ); 00471 } 00472 } 00473 00474 cfg->writeEntry( identifier, fieldIds ); 00475 } 00476 00477 Field::List Field::restoreFields( const TQString &identifier ) 00478 { 00479 TDEConfig *cfg = TDEGlobal::config(); 00480 TDEConfigGroupSaver( cfg, "KABCFields" ); 00481 00482 return restoreFields( cfg, identifier ); 00483 } 00484 00485 Field::List Field::restoreFields( TDEConfig *cfg, const TQString &identifier ) 00486 { 00487 const TQValueList<int> fieldIds = cfg->readIntListEntry( identifier ); 00488 00489 Field::List fields; 00490 00491 int custom = 0; 00492 TQValueList<int>::ConstIterator it; 00493 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) { 00494 FieldImpl *f = 0; 00495 if ( (*it) == FieldImpl::CustomField ) { 00496 TQStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" + 00497 identifier + "_" + 00498 TQString::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 TQString &label, int category, 00522 const TQString &key, const TQString &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 }