00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <klocale.h>
00023 #include <kconfig.h>
00024 #include <kglobal.h>
00025
00026 #include "field.h"
00027 #include "address.h"
00028
00029 using namespace KABC;
00030
00031 class Field::FieldImpl
00032 {
00033 public:
00034 FieldImpl( int fieldId, int category = 0,
00035 const QString &label = QString::null,
00036 const QString &key = QString::null,
00037 const QString &app = QString::null )
00038 : mFieldId( fieldId ), mCategory( category ), mLabel( label ),
00039 mKey( key ), mApp( app ) {}
00040
00041 enum FieldId
00042 {
00043 CustomField,
00044 FormattedName,
00045 FamilyName,
00046 GivenName,
00047 AdditionalName,
00048 Prefix,
00049 Suffix,
00050 NickName,
00051 Birthday,
00052 HomeAddressStreet,
00053 HomeAddressLocality,
00054 HomeAddressRegion,
00055 HomeAddressPostalCode,
00056 HomeAddressCountry,
00057 HomeAddressLabel,
00058 BusinessAddressStreet,
00059 BusinessAddressLocality,
00060 BusinessAddressRegion,
00061 BusinessAddressPostalCode,
00062 BusinessAddressCountry,
00063 BusinessAddressLabel,
00064 HomePhone,
00065 BusinessPhone,
00066 MobilePhone,
00067 HomeFax,
00068 BusinessFax,
00069 CarPhone,
00070 Isdn,
00071 Pager,
00072 Email,
00073 Mailer,
00074 Title,
00075 Role,
00076 Organization,
00077 Department,
00078 Note,
00079 Url
00080 };
00081
00082 int fieldId() { return mFieldId; }
00083 int category() { return mCategory; }
00084
00085 QString label() { return mLabel; }
00086 QString key() { return mKey; }
00087 QString app() { return mApp; }
00088
00089 private:
00090 int mFieldId;
00091 int mCategory;
00092
00093 QString mLabel;
00094 QString mKey;
00095 QString mApp;
00096 };
00097
00098
00099 Field::List Field::mAllFields;
00100 Field::List Field::mDefaultFields;
00101 Field::List Field::mCustomFields;
00102
00103
00104 Field::Field( FieldImpl *impl )
00105 {
00106 mImpl = impl;
00107 }
00108
00109 Field::~Field()
00110 {
00111 delete mImpl;
00112 }
00113
00114 QString Field::label()
00115 {
00116 switch ( mImpl->fieldId() ) {
00117 case FieldImpl::FormattedName:
00118 return Addressee::formattedNameLabel();
00119 case FieldImpl::FamilyName:
00120 return Addressee::familyNameLabel();
00121 case FieldImpl::GivenName:
00122 return Addressee::givenNameLabel();
00123 case FieldImpl::AdditionalName:
00124 return Addressee::additionalNameLabel();
00125 case FieldImpl::Prefix:
00126 return Addressee::prefixLabel();
00127 case FieldImpl::Suffix:
00128 return Addressee::suffixLabel();
00129 case FieldImpl::NickName:
00130 return Addressee::nickNameLabel();
00131 case FieldImpl::Birthday:
00132 return Addressee::birthdayLabel();
00133 case FieldImpl::HomeAddressStreet:
00134 return Addressee::homeAddressStreetLabel();
00135 case FieldImpl::HomeAddressLocality:
00136 return Addressee::homeAddressLocalityLabel();
00137 case FieldImpl::HomeAddressRegion:
00138 return Addressee::homeAddressRegionLabel();
00139 case FieldImpl::HomeAddressPostalCode:
00140 return Addressee::homeAddressPostalCodeLabel();
00141 case FieldImpl::HomeAddressCountry:
00142 return Addressee::homeAddressCountryLabel();
00143 case FieldImpl::HomeAddressLabel:
00144 return Addressee::homeAddressLabelLabel();
00145 case FieldImpl::BusinessAddressStreet:
00146 return Addressee::businessAddressStreetLabel();
00147 case FieldImpl::BusinessAddressLocality:
00148 return Addressee::businessAddressLocalityLabel();
00149 case FieldImpl::BusinessAddressRegion:
00150 return Addressee::businessAddressRegionLabel();
00151 case FieldImpl::BusinessAddressPostalCode:
00152 return Addressee::businessAddressPostalCodeLabel();
00153 case FieldImpl::BusinessAddressCountry:
00154 return Addressee::businessAddressCountryLabel();
00155 case FieldImpl::BusinessAddressLabel:
00156 return Addressee::businessAddressLabelLabel();
00157 case FieldImpl::HomePhone:
00158 return Addressee::homePhoneLabel();
00159 case FieldImpl::BusinessPhone:
00160 return Addressee::businessPhoneLabel();
00161 case FieldImpl::MobilePhone:
00162 return Addressee::mobilePhoneLabel();
00163 case FieldImpl::HomeFax:
00164 return Addressee::homeFaxLabel();
00165 case FieldImpl::BusinessFax:
00166 return Addressee::businessFaxLabel();
00167 case FieldImpl::CarPhone:
00168 return Addressee::carPhoneLabel();
00169 case FieldImpl::Isdn:
00170 return Addressee::isdnLabel();
00171 case FieldImpl::Pager:
00172 return Addressee::pagerLabel();
00173 case FieldImpl::Email:
00174 return Addressee::emailLabel();
00175 case FieldImpl::Mailer:
00176 return Addressee::mailerLabel();
00177 case FieldImpl::Title:
00178 return Addressee::titleLabel();
00179 case FieldImpl::Role:
00180 return Addressee::roleLabel();
00181 case FieldImpl::Organization:
00182 return Addressee::organizationLabel();
00183 case FieldImpl::Department:
00184 return Addressee::departmentLabel();
00185 case FieldImpl::Note:
00186 return Addressee::noteLabel();
00187 case FieldImpl::Url:
00188 return Addressee::urlLabel();
00189 case FieldImpl::CustomField:
00190 return mImpl->label();
00191 default:
00192 return i18n("Unknown Field");
00193 }
00194 }
00195
00196 int Field::category()
00197 {
00198 return mImpl->category();
00199 }
00200
00201 QString Field::categoryLabel( int category )
00202 {
00203 switch ( category ) {
00204 case All:
00205 return i18n("All");
00206 case Frequent:
00207 return i18n("Frequent");
00208 case Address:
00209 return i18n("street/postal","Address");
00210 case Email:
00211 return i18n("Email");
00212 case Personal:
00213 return i18n("Personal");
00214 case Organization:
00215 return i18n("Organization");
00216 case CustomCategory:
00217 return i18n("Custom");
00218 default:
00219 return i18n("Undefined");
00220 }
00221 }
00222
00223 QString Field::value( const KABC::Addressee &a )
00224 {
00225 switch ( mImpl->fieldId() ) {
00226 case FieldImpl::FormattedName:
00227 return a.formattedName();
00228 case FieldImpl::FamilyName:
00229 return a.familyName();
00230 case FieldImpl::GivenName:
00231 return a.givenName();
00232 case FieldImpl::AdditionalName:
00233 return a.additionalName();
00234 case FieldImpl::Prefix:
00235 return a.prefix();
00236 case FieldImpl::Suffix:
00237 return a.suffix();
00238 case FieldImpl::NickName:
00239 return a.nickName();
00240 case FieldImpl::Mailer:
00241 return a.mailer();
00242 case FieldImpl::Title:
00243 return a.title();
00244 case FieldImpl::Role:
00245 return a.role();
00246 case FieldImpl::Organization:
00247 return a.organization();
00248 case FieldImpl::Department:
00249 return a.department();
00250 case FieldImpl::Note:
00251 return a.note();
00252 case FieldImpl::Email:
00253 return a.preferredEmail();
00254 case FieldImpl::Birthday:
00255 if ( a.birthday().isValid() )
00256 return a.birthday().date().toString( Qt::ISODate );
00257 else
00258 return QString::null;
00259 case FieldImpl::Url:
00260 return a.url().prettyURL();
00261 case FieldImpl::HomePhone:
00262 {
00263 PhoneNumber::List::ConstIterator it;
00264
00265 {
00266
00267 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref );
00268 for ( it = list.begin(); it != list.end(); ++it )
00269 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00270 return (*it).number();
00271 }
00272
00273 {
00274
00275 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home );
00276 for ( it = list.begin(); it != list.end(); ++it )
00277 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home )
00278 return (*it).number();
00279 }
00280
00281 return QString::null;
00282 }
00283 case FieldImpl::BusinessPhone:
00284 {
00285 PhoneNumber::List::ConstIterator it;
00286
00287 {
00288
00289 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref );
00290 for ( it = list.begin(); it != list.end(); ++it )
00291 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00292 return (*it).number();
00293 }
00294
00295 {
00296
00297 const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work );
00298 for ( it = list.begin(); it != list.end(); ++it )
00299 if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work )
00300 return (*it).number();
00301 }
00302
00303 return QString::null;
00304 }
00305 case FieldImpl::MobilePhone:
00306 return a.phoneNumber( PhoneNumber::Cell ).number();
00307 case FieldImpl::HomeFax:
00308 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
00309 case FieldImpl::BusinessFax:
00310 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
00311 case FieldImpl::CarPhone:
00312 return a.phoneNumber( PhoneNumber::Car ).number();
00313 case FieldImpl::Isdn:
00314 return a.phoneNumber( PhoneNumber::Isdn ).number();
00315 case FieldImpl::Pager:
00316 return a.phoneNumber( PhoneNumber::Pager ).number();
00317 case FieldImpl::HomeAddressStreet:
00318 return a.address( Address::Home ).street();
00319 case FieldImpl::HomeAddressLocality:
00320 return a.address( Address::Home ).locality();
00321 case FieldImpl::HomeAddressRegion:
00322 return a.address( Address::Home ).region();
00323 case FieldImpl::HomeAddressPostalCode:
00324 return a.address( Address::Home ).postalCode();
00325 case FieldImpl::HomeAddressCountry:
00326 return a.address( Address::Home ).country();
00327 case FieldImpl::HomeAddressLabel:
00328 return a.address( Address::Home ).label();
00329 case FieldImpl::BusinessAddressStreet:
00330 return a.address( Address::Work ).street();
00331 case FieldImpl::BusinessAddressLocality:
00332 return a.address( Address::Work ).locality();
00333 case FieldImpl::BusinessAddressRegion:
00334 return a.address( Address::Work ).region();
00335 case FieldImpl::BusinessAddressPostalCode:
00336 return a.address( Address::Work ).postalCode();
00337 case FieldImpl::BusinessAddressCountry:
00338 return a.address( Address::Work ).country();
00339 case FieldImpl::BusinessAddressLabel:
00340 return a.address( Address::Work ).label();
00341 case FieldImpl::CustomField:
00342 return a.custom( mImpl->app(), mImpl->key() );
00343 default:
00344 return QString::null;
00345 }
00346 }
00347
00348 bool Field::setValue( KABC::Addressee &a, const QString &value )
00349 {
00350 switch ( mImpl->fieldId() ) {
00351 case FieldImpl::FormattedName:
00352 a.setFormattedName( value );
00353 return true;
00354 case FieldImpl::FamilyName:
00355 a.setFamilyName( value );
00356 return true;
00357 case FieldImpl::GivenName:
00358 a.setGivenName( value );
00359 return true;
00360 case FieldImpl::AdditionalName:
00361 a.setAdditionalName( value );
00362 return true;
00363 case FieldImpl::Prefix:
00364 a.setPrefix( value );
00365 return true;
00366 case FieldImpl::Suffix:
00367 a.setSuffix( value );
00368 return true;
00369 case FieldImpl::NickName:
00370 a.setNickName( value );
00371 return true;
00372 case FieldImpl::Mailer:
00373 a.setMailer( value );
00374 return true;
00375 case FieldImpl::Title:
00376 a.setTitle( value );
00377 return true;
00378 case FieldImpl::Role:
00379 a.setRole( value );
00380 return true;
00381 case FieldImpl::Organization:
00382 a.setOrganization( value );
00383 return true;
00384 case FieldImpl::Department:
00385 a.setDepartment( value );
00386 return true;
00387 case FieldImpl::Note:
00388 a.setNote( value );
00389 return true;
00390 case FieldImpl::MobilePhone:
00391 {
00392 PhoneNumber number = a.phoneNumber( PhoneNumber::Cell );
00393 number.setNumber( value );
00394 a.insertPhoneNumber( number );
00395 return true;
00396 }
00397 case FieldImpl::HomeFax:
00398 {
00399 PhoneNumber number = a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax );
00400 number.setNumber( value );
00401 a.insertPhoneNumber( number );
00402 return true;
00403 }
00404 case FieldImpl::BusinessFax:
00405 {
00406 PhoneNumber number = a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax );
00407 number.setNumber( value );
00408 a.insertPhoneNumber( number );
00409 return true;
00410 }
00411 case FieldImpl::CarPhone:
00412 {
00413 PhoneNumber number = a.phoneNumber( PhoneNumber::Car );
00414 number.setNumber( value );
00415 a.insertPhoneNumber( number );
00416 return true;
00417 }
00418 case FieldImpl::Isdn:
00419 {
00420 PhoneNumber number = a.phoneNumber( PhoneNumber::Isdn );
00421 number.setNumber( value );
00422 a.insertPhoneNumber( number );
00423 return true;
00424 }
00425 case FieldImpl::Pager:
00426 {
00427 PhoneNumber number = a.phoneNumber( PhoneNumber::Pager );
00428 number.setNumber( value );
00429 a.insertPhoneNumber( number );
00430 return true;
00431 }
00432 case FieldImpl::HomeAddressStreet:
00433 {
00434 KABC::Address address = a.address( Address::Home );
00435 address.setStreet( value );
00436 a.insertAddress( address );
00437 return true;
00438 }
00439 case FieldImpl::HomeAddressLocality:
00440 {
00441 KABC::Address address = a.address( Address::Home );
00442 address.setLocality( value );
00443 a.insertAddress( address );
00444 return true;
00445 }
00446 case FieldImpl::HomeAddressRegion:
00447 {
00448 KABC::Address address = a.address( Address::Home );
00449 address.setRegion( value );
00450 a.insertAddress( address );
00451 return true;
00452 }
00453 case FieldImpl::HomeAddressPostalCode:
00454 {
00455 KABC::Address address = a.address( Address::Home );
00456 address.setPostalCode( value );
00457 a.insertAddress( address );
00458 return true;
00459 }
00460 case FieldImpl::HomeAddressCountry:
00461 {
00462 KABC::Address address = a.address( Address::Home );
00463 address.setCountry( value );
00464 a.insertAddress( address );
00465 return true;
00466 }
00467 case FieldImpl::HomeAddressLabel:
00468 {
00469 KABC::Address address = a.address( Address::Home );
00470 address.setLabel( value );
00471 a.insertAddress( address );
00472 return true;
00473 }
00474 case FieldImpl::BusinessAddressStreet:
00475 {
00476 KABC::Address address = a.address( Address::Work );
00477 address.setStreet( value );
00478 a.insertAddress( address );
00479 return true;
00480 }
00481 case FieldImpl::BusinessAddressLocality:
00482 {
00483 KABC::Address address = a.address( Address::Work );
00484 address.setLocality( value );
00485 a.insertAddress( address );
00486 return true;
00487 }
00488 case FieldImpl::BusinessAddressRegion:
00489 {
00490 KABC::Address address = a.address( Address::Work );
00491 address.setRegion( value );
00492 a.insertAddress( address );
00493 return true;
00494 }
00495 case FieldImpl::BusinessAddressPostalCode:
00496 {
00497 KABC::Address address = a.address( Address::Work );
00498 address.setPostalCode( value );
00499 a.insertAddress( address );
00500 return true;
00501 }
00502 case FieldImpl::BusinessAddressCountry:
00503 {
00504 KABC::Address address = a.address( Address::Work );
00505 address.setCountry( value );
00506 a.insertAddress( address );
00507 return true;
00508 }
00509 case FieldImpl::BusinessAddressLabel:
00510 {
00511 KABC::Address address = a.address( Address::Work );
00512 address.setLabel( value );
00513 a.insertAddress( address );
00514 return true;
00515 }
00516 case FieldImpl::Birthday:
00517 a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
00518 return true;
00519 case FieldImpl::CustomField:
00520 a.insertCustom( mImpl->app(), mImpl->key(), value );
00521 return true;
00522 default:
00523 return false;
00524 }
00525 }
00526
00527 QString Field::sortKey( const KABC::Addressee &a )
00528 {
00529 switch ( mImpl->fieldId() ) {
00530 case FieldImpl::FormattedName:
00531 return a.formattedName();
00532 case FieldImpl::FamilyName:
00533 return a.familyName();
00534 case FieldImpl::GivenName:
00535 return a.givenName();
00536 case FieldImpl::AdditionalName:
00537 return a.additionalName();
00538 case FieldImpl::Prefix:
00539 return a.prefix();
00540 case FieldImpl::Suffix:
00541 return a.suffix();
00542 case FieldImpl::NickName:
00543 return a.nickName();
00544 case FieldImpl::Mailer:
00545 return a.mailer();
00546 case FieldImpl::Title:
00547 return a.title();
00548 case FieldImpl::Role:
00549 return a.role();
00550 case FieldImpl::Organization:
00551 return a.organization();
00552 case FieldImpl::Department:
00553 return a.department();
00554 case FieldImpl::Note:
00555 return a.note();
00556 case FieldImpl::Birthday:
00557 if ( a.birthday().isValid() ) {
00558 QDate date = a.birthday().date();
00559 QString key;
00560 key.sprintf( "%02d-%02d", date.month(), date.day() );
00561 return key;
00562 } else
00563 return QString( "00-00" );
00564 default:
00565 return value( a ).lower();
00566 }
00567 }
00568
00569 bool Field::isCustom()
00570 {
00571 return mImpl->fieldId() == FieldImpl::CustomField;
00572 }
00573
00574 Field::List Field::allFields()
00575 {
00576 if ( mAllFields.isEmpty() ) {
00577 createField( FieldImpl::FormattedName, Frequent );
00578 createField( FieldImpl::FamilyName, Frequent );
00579 createField( FieldImpl::GivenName, Frequent );
00580 createField( FieldImpl::AdditionalName );
00581 createField( FieldImpl::Prefix );
00582 createField( FieldImpl::Suffix );
00583 createField( FieldImpl::NickName, Personal );
00584 createField( FieldImpl::Birthday, Personal );
00585 createField( FieldImpl::HomeAddressStreet, Address|Personal );
00586 createField( FieldImpl::HomeAddressLocality, Address|Personal );
00587 createField( FieldImpl::HomeAddressRegion, Address|Personal );
00588 createField( FieldImpl::HomeAddressPostalCode, Address|Personal );
00589 createField( FieldImpl::HomeAddressCountry, Address|Personal );
00590 createField( FieldImpl::HomeAddressLabel, Address|Personal );
00591 createField( FieldImpl::BusinessAddressStreet, Address|Organization );
00592 createField( FieldImpl::BusinessAddressLocality, Address|Organization );
00593 createField( FieldImpl::BusinessAddressRegion, Address|Organization );
00594 createField( FieldImpl::BusinessAddressPostalCode, Address|Organization );
00595 createField( FieldImpl::BusinessAddressCountry, Address|Organization );
00596 createField( FieldImpl::BusinessAddressLabel, Address|Organization );
00597 createField( FieldImpl::HomePhone, Personal|Frequent );
00598 createField( FieldImpl::BusinessPhone, Organization|Frequent );
00599 createField( FieldImpl::MobilePhone, Frequent );
00600 createField( FieldImpl::HomeFax );
00601 createField( FieldImpl::BusinessFax );
00602 createField( FieldImpl::CarPhone );
00603 createField( FieldImpl::Isdn );
00604 createField( FieldImpl::Pager );
00605 createField( FieldImpl::Email, Email|Frequent );
00606 createField( FieldImpl::Mailer, Email );
00607 createField( FieldImpl::Title, Organization );
00608 createField( FieldImpl::Role, Organization );
00609 createField( FieldImpl::Organization, Organization );
00610 createField( FieldImpl::Department, Organization );
00611 createField( FieldImpl::Note );
00612 createField( FieldImpl::Url );
00613 }
00614
00615 return mAllFields;
00616 }
00617
00618 Field::List Field::defaultFields()
00619 {
00620 if ( mDefaultFields.isEmpty() ) {
00621 createDefaultField( FieldImpl::FormattedName );
00622 createDefaultField( FieldImpl::Email );
00623 }
00624
00625 return mDefaultFields;
00626 }
00627
00628 void Field::createField( int id, int category )
00629 {
00630 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
00631 }
00632
00633 void Field::createDefaultField( int id, int category )
00634 {
00635 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
00636 }
00637
00638 void Field::deleteFields()
00639 {
00640 Field::List::ConstIterator it;
00641
00642 for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) {
00643 delete (*it);
00644 }
00645 mAllFields.clear();
00646
00647 for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) {
00648 delete (*it);
00649 }
00650 mDefaultFields.clear();
00651
00652 for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) {
00653 delete (*it);
00654 }
00655 mCustomFields.clear();
00656 }
00657
00658 void Field::saveFields( const QString &identifier,
00659 const Field::List &fields )
00660 {
00661 KConfig *cfg = KGlobal::config();
00662 KConfigGroupSaver( cfg, "KABCFields" );
00663
00664 saveFields( cfg, identifier, fields );
00665 }
00666
00667 void Field::saveFields( KConfig *cfg, const QString &identifier,
00668 const Field::List &fields )
00669 {
00670 QValueList<int> fieldIds;
00671
00672 int custom = 0;
00673 Field::List::ConstIterator it;
00674 for( it = fields.begin(); it != fields.end(); ++it ) {
00675 fieldIds.append( (*it)->mImpl->fieldId() );
00676 if( (*it)->isCustom() ) {
00677 QStringList customEntry;
00678 customEntry << (*it)->mImpl->label();
00679 customEntry << (*it)->mImpl->key();
00680 customEntry << (*it)->mImpl->app();
00681 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
00682 QString::number( custom++ ), customEntry );
00683 }
00684 }
00685
00686 cfg->writeEntry( identifier, fieldIds );
00687 }
00688
00689 Field::List Field::restoreFields( const QString &identifier )
00690 {
00691 KConfig *cfg = KGlobal::config();
00692 KConfigGroupSaver( cfg, "KABCFields" );
00693
00694 return restoreFields( cfg, identifier );
00695 }
00696
00697 Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
00698 {
00699 const QValueList<int> fieldIds = cfg->readIntListEntry( identifier );
00700
00701 Field::List fields;
00702
00703 int custom = 0;
00704 QValueList<int>::ConstIterator it;
00705 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
00706 FieldImpl *f = 0;
00707 if ( (*it) == FieldImpl::CustomField ) {
00708 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
00709 identifier + "_" +
00710 QString::number( custom++ ) );
00711 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
00712 customEntry[ 1 ], customEntry[ 2 ] );
00713 } else {
00714 f = new FieldImpl( *it );
00715 }
00716 fields.append( new Field( f ) );
00717 }
00718
00719 return fields;
00720 }
00721
00722 bool Field::equals( Field *field )
00723 {
00724 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
00725
00726 if ( !sameId ) return false;
00727
00728 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
00729
00730 return mImpl->key() == field->mImpl->key();
00731 }
00732
00733 Field *Field::createCustomField( const QString &label, int category,
00734 const QString &key, const QString &app )
00735 {
00736 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
00737 category | CustomCategory,
00738 label, key, app ) );
00739 mCustomFields.append( field );
00740
00741 return field;
00742 }