/* This file is part of libkabc. Copyright (c) 2002 Cornelius Schumacher This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "field.h" #include "address.h" using namespace KABC; class Field::FieldImpl { public: FieldImpl( int fieldId, int category = 0, const TQString &label = TQString::null, const TQString &key = TQString::null, const TQString &app = TQString::null ) : mFieldId( fieldId ), mCategory( category ), mLabel( label ), mKey( key ), mApp( app ) {} enum FieldId { CustomField, --ENUMS-- }; int fieldId() { return mFieldId; } int category() { return mCategory; } TQString label() { return mLabel; } TQString key() { return mKey; } TQString app() { return mApp; } private: int mFieldId; int mCategory; TQString mLabel; TQString mKey; TQString mApp; }; Field::List Field::mAllFields; Field::List Field::mDefaultFields; Field::List Field::mCustomFields; Field::Field( FieldImpl *impl ) { mImpl = impl; } Field::~Field() { delete mImpl; } TQString Field::label() { switch ( mImpl->fieldId() ) { --CASELABEL-- case FieldImpl::CustomField: return mImpl->label(); default: return i18n("Unknown Field"); } } int Field::category() { return mImpl->category(); } TQString Field::categoryLabel( int category ) { switch ( category ) { case All: return i18n("All"); case Frequent: return i18n("Frequent"); case Address: return i18n("street/postal","Address"); case Email: return i18n("Email"); case Personal: return i18n("Personal"); case Organization: return i18n("Organization"); case CustomCategory: return i18n("Custom"); default: return i18n("Undefined"); } } TQString Field::value( const KABC::Addressee &a ) { switch ( mImpl->fieldId() ) { --CASEVALUE-- case FieldImpl::Email: return a.preferredEmail(); case FieldImpl::Birthday: if ( a.birthday().isValid() ) return a.birthday().date().toString( Qt::ISODate ); else return TQString::null; case FieldImpl::Url: return a.url().prettyURL(); case FieldImpl::HomePhone: { PhoneNumber::List::ConstIterator it; { // check for preferred number const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home | PhoneNumber::Pref ); for ( it = list.begin(); it != list.end(); ++it ) if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home ) return (*it).number(); } { // check for normal home number const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Home ); for ( it = list.begin(); it != list.end(); ++it ) if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Home ) return (*it).number(); } return TQString::null; } case FieldImpl::BusinessPhone: { PhoneNumber::List::ConstIterator it; { // check for preferred number const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work | PhoneNumber::Pref ); for ( it = list.begin(); it != list.end(); ++it ) if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work ) return (*it).number(); } { // check for normal work number const PhoneNumber::List list = a.phoneNumbers( PhoneNumber::Work ); for ( it = list.begin(); it != list.end(); ++it ) if ( ((*it).type() & ~(PhoneNumber::Pref)) == PhoneNumber::Work ) return (*it).number(); } return TQString::null; } case FieldImpl::MobilePhone: return a.phoneNumber( PhoneNumber::Cell ).number(); case FieldImpl::HomeFax: return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number(); case FieldImpl::BusinessFax: return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number(); case FieldImpl::CarPhone: return a.phoneNumber( PhoneNumber::Car ).number(); case FieldImpl::Isdn: return a.phoneNumber( PhoneNumber::Isdn ).number(); case FieldImpl::Pager: return a.phoneNumber( PhoneNumber::Pager ).number(); case FieldImpl::HomeAddressStreet: return a.address( Address::Home ).street(); case FieldImpl::HomeAddressPostOfficeBox: return a.address( Address::Home ).postOfficeBox(); case FieldImpl::HomeAddressLocality: return a.address( Address::Home ).locality(); case FieldImpl::HomeAddressRegion: return a.address( Address::Home ).region(); case FieldImpl::HomeAddressPostalCode: return a.address( Address::Home ).postalCode(); case FieldImpl::HomeAddressCountry: return a.address( Address::Home ).country(); case FieldImpl::HomeAddressLabel: return a.address( Address::Home ).label(); case FieldImpl::BusinessAddressStreet: return a.address( Address::Work ).street(); case FieldImpl::BusinessAddressPostOfficeBox: return a.address( Address::Work ).postOfficeBox(); case FieldImpl::BusinessAddressLocality: return a.address( Address::Work ).locality(); case FieldImpl::BusinessAddressRegion: return a.address( Address::Work ).region(); case FieldImpl::BusinessAddressPostalCode: return a.address( Address::Work ).postalCode(); case FieldImpl::BusinessAddressCountry: return a.address( Address::Work ).country(); case FieldImpl::BusinessAddressLabel: return a.address( Address::Work ).label(); case FieldImpl::CustomField: return a.custom( mImpl->app(), mImpl->key() ); default: return TQString::null; } } bool Field::setValue( KABC::Addressee &a, const TQString &value ) { switch ( mImpl->fieldId() ) { --CASESETVALUE-- case FieldImpl::MobilePhone: { PhoneNumber number = a.phoneNumber( PhoneNumber::Cell ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::HomeFax: { PhoneNumber number = a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::BusinessFax: { PhoneNumber number = a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::CarPhone: { PhoneNumber number = a.phoneNumber( PhoneNumber::Car ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::Isdn: { PhoneNumber number = a.phoneNumber( PhoneNumber::Isdn ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::Pager: { PhoneNumber number = a.phoneNumber( PhoneNumber::Pager ); number.setNumber( value ); a.insertPhoneNumber( number ); return true; } case FieldImpl::HomeAddressStreet: { KABC::Address address = a.address( Address::Home ); address.setStreet( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressPostOfficeBox: { KABC::Address address = a.address( Address::Home ); address.setPostOfficeBox( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressLocality: { KABC::Address address = a.address( Address::Home ); address.setLocality( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressRegion: { KABC::Address address = a.address( Address::Home ); address.setRegion( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressPostalCode: { KABC::Address address = a.address( Address::Home ); address.setPostalCode( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressCountry: { KABC::Address address = a.address( Address::Home ); address.setCountry( value ); a.insertAddress( address ); return true; } case FieldImpl::HomeAddressLabel: { KABC::Address address = a.address( Address::Home ); address.setLabel( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressStreet: { KABC::Address address = a.address( Address::Work ); address.setStreet( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressPostOfficeBox: { KABC::Address address = a.address( Address::Work ); address.setPostOfficeBox( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressLocality: { KABC::Address address = a.address( Address::Work ); address.setLocality( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressRegion: { KABC::Address address = a.address( Address::Work ); address.setRegion( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressPostalCode: { KABC::Address address = a.address( Address::Work ); address.setPostalCode( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressCountry: { KABC::Address address = a.address( Address::Work ); address.setCountry( value ); a.insertAddress( address ); return true; } case FieldImpl::BusinessAddressLabel: { KABC::Address address = a.address( Address::Work ); address.setLabel( value ); a.insertAddress( address ); return true; } case FieldImpl::Birthday: a.setBirthday( TQT_TQDATE_OBJECT(TQDate::fromString( value, Qt::ISODate )) ); return true; case FieldImpl::CustomField: a.insertCustom( mImpl->app(), mImpl->key(), value ); return true; default: return false; } } TQString Field::sortKey( const KABC::Addressee &a ) { switch ( mImpl->fieldId() ) { --CASEVALUE-- case FieldImpl::Birthday: if ( a.birthday().isValid() ) { TQDate date = TQT_TQDATE_OBJECT(a.birthday().date()); TQString key; key.sprintf( "%02d-%02d", date.month(), date.day() ); return key; } else return TQString( "00-00" ); default: return value( a ).lower(); } } bool Field::isCustom() { return mImpl->fieldId() == FieldImpl::CustomField; } Field::List Field::allFields() { if ( mAllFields.isEmpty() ) { --CREATEFIELDS-- } return mAllFields; } Field::List Field::defaultFields() { if ( mDefaultFields.isEmpty() ) { createDefaultField( FieldImpl::FormattedName ); createDefaultField( FieldImpl::Email ); } return mDefaultFields; } void Field::createField( int id, int category ) { mAllFields.append( new Field( new FieldImpl( id, category ) ) ); } void Field::createDefaultField( int id, int category ) { mDefaultFields.append( new Field( new FieldImpl( id, category ) ) ); } void Field::deleteFields() { Field::List::ConstIterator it; for ( it = mAllFields.constBegin(); it != mAllFields.constEnd(); ++it ) { delete (*it); } mAllFields.clear(); for ( it = mDefaultFields.constBegin(); it != mDefaultFields.constEnd(); ++it ) { delete (*it); } mDefaultFields.clear(); for ( it = mCustomFields.constBegin(); it != mCustomFields.constEnd(); ++it ) { delete (*it); } mCustomFields.clear(); } void Field::saveFields( const TQString &identifier, const Field::List &fields ) { KConfig *cfg = KGlobal::config(); KConfigGroupSaver( cfg, "KABCFields" ); saveFields( cfg, identifier, fields ); } void Field::saveFields( KConfig *cfg, const TQString &identifier, const Field::List &fields ) { TQValueList fieldIds; int custom = 0; Field::List::ConstIterator it; for( it = fields.begin(); it != fields.end(); ++it ) { fieldIds.append( (*it)->mImpl->fieldId() ); if( (*it)->isCustom() ) { TQStringList customEntry; customEntry << (*it)->mImpl->label(); customEntry << (*it)->mImpl->key(); customEntry << (*it)->mImpl->app(); cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" + TQString::number( custom++ ), customEntry ); } } cfg->writeEntry( identifier, fieldIds ); } Field::List Field::restoreFields( const TQString &identifier ) { KConfig *cfg = KGlobal::config(); KConfigGroupSaver( cfg, "KABCFields" ); return restoreFields( cfg, identifier ); } Field::List Field::restoreFields( KConfig *cfg, const TQString &identifier ) { const TQValueList fieldIds = cfg->readIntListEntry( identifier ); Field::List fields; int custom = 0; TQValueList::ConstIterator it; for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) { FieldImpl *f = 0; if ( (*it) == FieldImpl::CustomField ) { TQStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" + identifier + "_" + TQString::number( custom++ ) ); f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ], customEntry[ 1 ], customEntry[ 2 ] ); } else { f = new FieldImpl( *it ); } fields.append( new Field( f ) ); } return fields; } bool Field::equals( Field *field ) { bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() ); if ( !sameId ) return false; if ( mImpl->fieldId() != FieldImpl::CustomField ) return true; return mImpl->key() == field->mImpl->key(); } Field *Field::createCustomField( const TQString &label, int category, const TQString &key, const TQString &app ) { Field *field = new Field( new FieldImpl( FieldImpl::CustomField, category | CustomCategory, label, key, app ) ); mCustomFields.append( field ); return field; }