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