diff options
Diffstat (limited to 'libtdepim/addresseeview.cpp')
-rw-r--r-- | libtdepim/addresseeview.cpp | 792 |
1 files changed, 792 insertions, 0 deletions
diff --git a/libtdepim/addresseeview.cpp b/libtdepim/addresseeview.cpp new file mode 100644 index 000000000..15c7215ed --- /dev/null +++ b/libtdepim/addresseeview.cpp @@ -0,0 +1,792 @@ +/* + This file is part of libtdepim. + + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + 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 <tqbuffer.h> +#include <tqimage.h> +#include <tqpopupmenu.h> +#include <tqurl.h> + +#include <kabc/address.h> +#include <kabc/addressee.h> +#include <kabc/phonenumber.h> +#include <kabc/resource.h> +#include <kactionclasses.h> +#include <kapplication.h> +#include <kconfig.h> +#include <kglobal.h> +#include <kglobalsettings.h> +#include <kiconloader.h> +#include <kio/job.h> +#include <klocale.h> +#include <kmdcodec.h> +#include <kmessagebox.h> +#include <krun.h> +#include <kstringhandler.h> +#include <ktempfile.h> + +#include <kdebug.h> + +#include "addresseeview.h" +#include "sendsmsdialog.h" +#include "resourceabc.h" + +using namespace KPIM; + +AddresseeView::AddresseeView( TQWidget *parent, const char *name, + KConfig *config ) + : KTextBrowser( parent, name ), mDefaultConfig( false ), mImageJob( 0 ), + mLinkMask( AddressLinks | EmailLinks | PhoneLinks | URLLinks | IMLinks | CustomFields ) +{ + setWrapPolicy( TQTextEdit::AtWordBoundary ); + setLinkUnderline( false ); + setVScrollBarMode( TQScrollView::AlwaysOff ); + setHScrollBarMode( TQScrollView::AlwaysOff ); + + TQStyleSheet *sheet = styleSheet(); + TQStyleSheetItem *link = sheet->item( "a" ); + link->setColor( KGlobalSettings::linkColor() ); + + connect( this, TQT_SIGNAL( mailClick( const TQString&, const TQString& ) ), + this, TQT_SLOT( slotMailClicked( const TQString&, const TQString& ) ) ); + connect( this, TQT_SIGNAL( urlClick( const TQString& ) ), + this, TQT_SLOT( slotUrlClicked( const TQString& ) ) ); + connect( this, TQT_SIGNAL( highlighted( const TQString& ) ), + this, TQT_SLOT( slotHighlighted( const TQString& ) ) ); + + setNotifyClick( true ); + + mActionShowBirthday = new KToggleAction( i18n( "Show Birthday" ) ); + mActionShowBirthday->setCheckedState( i18n( "Hide Birthday" ) ); + mActionShowAddresses = new KToggleAction( i18n( "Show Postal Addresses" ) ); + mActionShowAddresses->setCheckedState( i18n( "Hide Postal Addresses" ) ); + mActionShowEmails = new KToggleAction( i18n( "Show Email Addresses" ) ); + mActionShowEmails->setCheckedState( i18n( "Hide Email Addresses" ) ); + mActionShowPhones = new KToggleAction( i18n( "Show Telephone Numbers" ) ); + mActionShowPhones->setCheckedState( i18n( "Hide Telephone Numbers" ) ); + mActionShowURLs = new KToggleAction( i18n( "Show Web Pages (URLs)" ) ); + mActionShowURLs->setCheckedState( i18n( "Hide Web Pages (URLs)" ) ); + mActionShowIMAddresses = new KToggleAction( i18n( "Show Instant Messaging Addresses" ) ); + mActionShowIMAddresses->setCheckedState( i18n( "Hide Instant Messaging Addresses" ) ); + mActionShowCustomFields = new KToggleAction( i18n( "Show Custom Fields" ) ); + mActionShowCustomFields->setCheckedState( i18n( "Hide Custom Fields" ) ); + + connect( mActionShowBirthday, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowAddresses, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowEmails, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowPhones, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowURLs, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowIMAddresses, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + connect( mActionShowCustomFields, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( configChanged() ) ); + + if ( !config ) { + mConfig = new KConfig( "kaddressbookrc" ); + mDefaultConfig = true; + } else + mConfig = config; + + load(); + + // set up IMProxy to display contacts' IM presence and make connections to keep the display live + mKIMProxy = ::KIMProxy::instance( kapp->dcopClient() ); + connect( mKIMProxy, TQT_SIGNAL( sigContactPresenceChanged( const TQString& ) ), + this, TQT_SLOT( slotPresenceChanged( const TQString& ) ) ); + connect( mKIMProxy, TQT_SIGNAL( sigPresenceInfoExpired() ), + this, TQT_SLOT( slotPresenceInfoExpired() ) ); +} + +AddresseeView::~AddresseeView() +{ + if ( mDefaultConfig ) + delete mConfig; + mConfig = 0; + + delete mActionShowBirthday; + delete mActionShowAddresses; + delete mActionShowEmails; + delete mActionShowPhones; + delete mActionShowURLs; + delete mActionShowIMAddresses; + delete mActionShowCustomFields; + + mKIMProxy = 0; +} + +void AddresseeView::setAddressee( const KABC::Addressee& addr ) +{ + mAddressee = addr; + + if ( mImageJob ) { + mImageJob->kill(); + mImageJob = 0; + } + + mImageData.truncate( 0 ); + + updateView(); +} + +void AddresseeView::enableLinks( int linkMask ) +{ + mLinkMask = linkMask; +} + +TQString AddresseeView::vCardAsHTML( const KABC::Addressee& addr, ::KIMProxy *proxy, LinkMask linkMask, + bool internalLoading, FieldMask fieldMask ) +{ + TQString image = TQString( "contact_%1_image" ).tqarg( addr.uid() ); + + // Style strings from Gentix; this is just an initial version. + // + // These will be substituted into various HTML strings with .tqarg(). + // Search for @STYLE@ to find where. Note how we use %1 as a + // placeholder where we fill in something else (in this case, + // the global background color). + // + TQString backgroundColor = KGlobalSettings::alternateBackgroundColor().name(); + TQString cellStyle = TQString::tqfromLatin1( + "style=\"" + "padding-right: 2px; " + "border-right: #000 dashed 1px; " + "background: %1;\"").tqarg(backgroundColor); + TQString backgroundColor2 = KGlobalSettings::baseColor().name(); + TQString cellStyle2 = TQString::tqfromLatin1( + "style=\"" + "padding-left: 2px; " + "background: %1;\"").tqarg(backgroundColor2); + TQString tableStyle = TQString::tqfromLatin1( + "style=\"" + "border: solid 1px; " + "margin: 0em;\""); + + // We'll be building a table to display the vCard in. + // Each row of the table will be built using this string for its HTML. + // + TQString rowFmtStr = TQString::tqfromLatin1( + "<tr>" + "<td align=\"right\" valign=\"top\" width=\"30%\" "); // Tag unclosed + rowFmtStr.append( cellStyle ); + rowFmtStr.append( TQString::tqfromLatin1( + ">" // Close tag + "<b>%1</b>" + "</td>" + "<td align=\"left\" valign=\"top\" width=\"70%\" ") ); // Tag unclosed + rowFmtStr.append( cellStyle2 ); + rowFmtStr.append( TQString::tqfromLatin1( + ">" // Close tag + "%2" + "</td>" + "</tr>\n" + ) ); + + // Build the table's rows here + TQString dynamicPart; + + + if ( !internalLoading ) { + KABC::Picture pic = addr.photo(); + if ( pic.isIntern() && !pic.data().isNull() ) { + image = pixmapAsDataUrl( pic.data() ); + } else if ( !pic.url().isEmpty() ) { + image = (pic.url().startsWith( "http://" ) || pic.url().startsWith( "https://" ) ? pic.url() : "http://" + pic.url()); + } else { + image = "file:" + KGlobal::iconLoader()->iconPath( "personal", KIcon::Desktop ); + } + } + + if ( fieldMask & BirthdayFields ) { + TQDate date = addr.birthday().date(); + + if ( date.isValid() ) + dynamicPart += rowFmtStr + .tqarg( KABC::Addressee::birthdayLabel() ) + .tqarg( KGlobal::locale()->formatDate( date, true ) ); + } + + if ( fieldMask & PhoneFields ) { + KABC::PhoneNumber::List phones = addr.phoneNumbers(); + KABC::PhoneNumber::List::ConstIterator phoneIt; + for ( phoneIt = phones.begin(); phoneIt != phones.end(); ++phoneIt ) { + TQString number = TQStyleSheet::escape( (*phoneIt).number() ); + + TQString url; + if ( (*phoneIt).type() & KABC::PhoneNumber::Fax ) + url = TQString::tqfromLatin1( "fax:" ) + number; + else + url = TQString::tqfromLatin1( "phone:" ) + number; + + if ( linkMask & PhoneLinks ) { + TQString smsURL; + if ( (*phoneIt).type() & KABC::PhoneNumber::Cell ) + smsURL = TQString(" (<a href=\"sms:%1\">%2</a>)" ).tqarg( number ).tqarg( i18n( "SMS") ); + + dynamicPart += rowFmtStr + .tqarg( (*phoneIt).typeLabel().replace( " ", " " ) ) + .tqarg( TQString::tqfromLatin1( "<a href=\"%1\">%2</a>%3" ).tqarg( url ).tqarg( number ).tqarg( smsURL ) ); + } else { + dynamicPart += rowFmtStr + .tqarg( (*phoneIt).typeLabel().replace( " ", " " ) ) + .tqarg( number ); + } + } + } + + if ( fieldMask & EmailFields ) { + TQStringList emails = addr.emails(); + TQStringList::ConstIterator emailIt; + TQString type = i18n( "Email" ); + for ( emailIt = emails.begin(); emailIt != emails.end(); ++emailIt ) { + TQString fullEmail = addr.fullEmail( *emailIt ); + TQUrl::encode( fullEmail ); + + if ( linkMask & EmailLinks ) { + dynamicPart += rowFmtStr.tqarg( type ) + .tqarg( TQString::tqfromLatin1( "<a href=\"mailto:%1\">%2</a>" ) + .tqarg( fullEmail, TQStyleSheet::escape( *emailIt ) ) ); + } else { + dynamicPart += rowFmtStr.tqarg( type ).tqarg( *emailIt ); + } + } + } + + if ( fieldMask & URLFields ) { + if ( !addr.url().url().isEmpty() ) { + TQString url; + if ( linkMask & URLLinks ) { + url = (addr.url().url().startsWith( "http://" ) || addr.url().url().startsWith( "https://" ) ? addr.url().prettyURL() : + "http://" + addr.url().prettyURL()); + url = KStringHandler::tagURLs( url ); + } else { + url = addr.url().prettyURL(); + } + dynamicPart += rowFmtStr.tqarg( i18n("Homepage") ).tqarg( url ); + } + + TQString blog = addr.custom( "KADDRESSBOOK", "BlogFeed" ); + if ( !blog.isEmpty() ) { + if ( linkMask & URLLinks ) { + blog = KStringHandler::tagURLs( blog ); + } + dynamicPart += rowFmtStr.tqarg( i18n("Blog Feed") ).tqarg( blog ); + } + } + + if ( fieldMask & AddressFields ) { + KABC::Address::List addresses = addr.addresses(); + KABC::Address::List::ConstIterator addrIt; + for ( addrIt = addresses.begin(); addrIt != addresses.end(); ++addrIt ) { + if ( (*addrIt).label().isEmpty() ) { + TQString formattedAddress; + + formattedAddress = TQStyleSheet::escape( (*addrIt).formattedAddress().stripWhiteSpace() ); + formattedAddress = formattedAddress.replace( '\n', "<br>" ); + + TQString link = "<a href=\"addr:" + (*addrIt).id() + "\">" + + formattedAddress + "</a>"; + + if ( linkMask & AddressLinks ) { + dynamicPart += rowFmtStr + .tqarg( KABC::Address::typeLabel( (*addrIt).type() ) ) + .tqarg( link ); + } else { + dynamicPart += rowFmtStr + .tqarg( KABC::Address::typeLabel( (*addrIt).type() ) ) + .tqarg( formattedAddress ); + } + } else { + TQString link = "<a href=\"addr:" + (*addrIt).id() + "\">" + + (*addrIt).label().replace( '\n', "<br>" ) + "</a>"; + + if ( linkMask & AddressLinks ) { + dynamicPart += rowFmtStr + .tqarg( KABC::Address::typeLabel( (*addrIt).type() ) ) + .tqarg( link ); + } else { + dynamicPart += rowFmtStr + .tqarg( KABC::Address::typeLabel( (*addrIt).type() ) ) + .tqarg( (*addrIt).label().replace( '\n', "<br>" ) ); + } + } + } + } + + TQString notes; + if ( !addr.note().isEmpty() ) { + // @STYLE@ - substitute the cell style in first, and append + // the data afterwards (keeps us safe from possible % signs + // in either one). + notes = TQStyleSheet::escape( addr.note() ); + notes = rowFmtStr.tqarg( i18n( "Notes" ) ).tqarg( notes.replace( '\n', "<br>" ) ) ; + } + + TQString customData; + if ( fieldMask & CustomFields ) { + static TQMap<TQString, TQString> titleMap; + if ( titleMap.isEmpty() ) { + titleMap.insert( "Department", i18n( "Department" ) ); + titleMap.insert( "Profession", i18n( "Profession" ) ); + titleMap.insert( "AssistantsName", i18n( "Assistant's Name" ) ); + titleMap.insert( "ManagersName", i18n( "Manager's Name" ) ); + titleMap.insert( "SpousesName", i18n( "Partner's Name" ) ); + titleMap.insert( "Office", i18n( "Office" ) ); + titleMap.insert( "Anniversary", i18n( "Anniversary" ) ); + } + + if ( !addr.customs().empty() ) { + TQStringList customs = addr.customs(); + TQStringList::Iterator it( customs.begin() ); + const TQStringList::Iterator endIt( customs.end() ); + for ( ; it != endIt; ++it ) { + TQString customEntry = *it; + if ( customEntry.startsWith ( "KADDRESSBOOK-" ) ) { + customEntry.remove( "KADDRESSBOOK-X-" ); + customEntry.remove( "KADDRESSBOOK-" ); + + int pos = customEntry.find( ':' ); + TQString key = customEntry.left( pos ); + const TQString value = customEntry.mid( pos + 1 ); + + // blog and im address is handled separated + if ( key == "BlogFeed" || key == "IMAddress" ) + continue; + + const TQMap<TQString, TQString>::ConstIterator keyIt = titleMap.find( key ); + if ( keyIt != titleMap.end() ) + key = keyIt.data(); + + customData += rowFmtStr.tqarg( key ).tqarg( TQStyleSheet::escape( value ) ) ; + } + } + } + } + + TQString name( TQStyleSheet::escape( addr.realName() ) ); + TQString role( TQStyleSheet::escape( addr.role() ) ); + TQString organization( TQStyleSheet::escape( addr.organization() ) ); + + if ( fieldMask & IMFields ) { + + const TQString imAddress = addr.custom( "KADDRESSBOOK", "X-IMAddress" ); + if ( !imAddress.isEmpty() ) { + customData += rowFmtStr.tqarg( i18n( "IM Address" ) ).tqarg( TQStyleSheet::escape( imAddress ) ) ; + } + + if ( proxy ) { + if ( proxy->isPresent( addr.uid() ) && proxy->presenceNumeric( addr.uid() ) > 0 ) { + // set image source to either a TQMimeSourceFactory key or a data:/ URL + TQString imgSrc; + if ( internalLoading ) { + imgSrc = TQString::tqfromLatin1( "im_status_%1_image").tqarg( addr.uid() ); + TQMimeSourceFactory::defaultFactory()->setPixmap( imgSrc, proxy->presenceIcon( addr.uid() ) ); + } else + imgSrc = pixmapAsDataUrl( proxy->presenceIcon( addr.uid() ) ); + + // make the status a link, if required + TQString imtqStatus; + if ( linkMask & IMLinks ) + imtqStatus = TQString::tqfromLatin1( "<a href=\"im:\"><img src=\"%1\"> (%2)</a>" ); + else + imtqStatus = TQString::tqfromLatin1( "<img src=\"%1\"> (%2)" ); + + // append our status to the rest of the dynamic part of the addressee + dynamicPart += rowFmtStr + .tqarg( i18n( "Presence" ) ) + .tqarg( imtqStatus + .tqarg( imgSrc ) + .tqarg( proxy->presenceString( addr.uid() ) ) + ); + } + } + } + + // @STYLE@ - construct the string by parts, substituting in + // the styles first. There are lots of appends, but we need to + // do it this way to avoid cases where the substituted string + // contains %1 and the like. + // + TQString strAddr = TQString::tqfromLatin1( + "<div align=\"center\">" + "<table cellpadding=\"1\" cellspacing=\"0\" %1>" + "<tr>").tqarg(tableStyle); + + strAddr.append( TQString::tqfromLatin1( + "<td align=\"right\" valign=\"top\" width=\"30%\" rowspan=\"3\" %2>") + .tqarg( cellStyle ) ); + strAddr.append( TQString::tqfromLatin1( + "<img src=\"%1\" width=\"50\" vspace=\"1\">" // image + "</td>") + .tqarg( image ) ); + strAddr.append( TQString::tqfromLatin1( + "<td align=\"left\" width=\"70%\" %2>") + .tqarg( cellStyle2 ) ); + strAddr.append( TQString::tqfromLatin1( + "<font size=\"+2\"><b>%2</b></font></td>" // name + "</tr>") + .tqarg( name ) ); + strAddr.append( TQString::tqfromLatin1( + "<tr>" + "<td align=\"left\" width=\"70%\" %2>") + .tqarg( cellStyle2 ) ); + strAddr.append( TQString::tqfromLatin1( + "%3</td>" // role + "</tr>") + .tqarg( role ) ); + strAddr.append( TQString::tqfromLatin1( + "<tr>" + "<td align=\"left\" width=\"70%\" %2>") + .tqarg( cellStyle2 ) ); + strAddr.append( TQString::tqfromLatin1( + "%4</td>" // organization + "</tr>") + .tqarg( organization ) ); + strAddr.append( TQString::tqfromLatin1( + "<tr><td %2>") + .tqarg( cellStyle ) ); + strAddr.append( TQString::tqfromLatin1( + " </td><td %2> </td></tr>") + .tqarg( cellStyle2 ) ); + strAddr.append( dynamicPart ); + strAddr.append( notes ); + strAddr.append( customData ); + strAddr.append( TQString::tqfromLatin1( "</table></div>\n" ) ); + + if ( addr.resource() ) { + TQString addrBookName = addr.resource()->resourceName(); + ResourceABC *r = dynamic_cast<ResourceABC*>( addr.resource() ); + if ( r && !r->subresources().isEmpty() ) { + const TQString subRes = r->uidToResourceMap()[ addr.uid() ]; + const TQString label = r->subresourceLabel( subRes ); + if ( !label.isEmpty() ) + addrBookName = label; + } + strAddr.append( i18n( "<p><b>Address book</b>: %1</p>" ).tqarg( addrBookName ) ); + } + return strAddr; +} + +TQString AddresseeView::pixmapAsDataUrl( const TQPixmap& pixmap ) +{ + TQByteArray ba; + TQBuffer buffer( ba ); + buffer.open( IO_WriteOnly ); + pixmap.save( &buffer, "PNG" ); + TQString encoded( "data:image/png;base64," ); + encoded.append( KCodecs::base64Encode( ba ) ); + return encoded; +} + +void AddresseeView::updateView() +{ + // clear view + setText( TQString() ); + + if ( mAddressee.isEmpty() ) + return; + + if ( mImageJob ) { + mImageJob->kill(); + mImageJob = 0; + + mImageData.truncate( 0 ); + } + + int fieldMask = NoFields; + if ( mActionShowBirthday->isChecked() ) + fieldMask |= ( FieldMask )BirthdayFields; + if ( mActionShowAddresses->isChecked() ) + fieldMask |= AddressFields; + if ( mActionShowEmails->isChecked() ) + fieldMask |= EmailFields; + if ( mActionShowPhones->isChecked() ) + fieldMask |= PhoneFields; + if ( mActionShowURLs->isChecked() ) + fieldMask |= URLFields; + if ( mActionShowIMAddresses->isChecked() ) + fieldMask |= IMFields; + if ( mActionShowCustomFields->isChecked() ) + fieldMask |= CustomFields; + + TQString strAddr = vCardAsHTML( mAddressee, mKIMProxy, (LinkMask)mLinkMask, + true, (FieldMask)fieldMask ); + + strAddr = TQString::tqfromLatin1( + "<html>" + "<body text=\"%1\" bgcolor=\"%2\">" // text and background color + "%3" // dynamic part + "</body>" + "</html>" ) + .tqarg( KGlobalSettings::textColor().name() ) + .tqarg( KGlobalSettings::baseColor().name() ) + .tqarg( strAddr ); + + TQString imageURL = TQString( "contact_%1_image" ).tqarg( mAddressee.uid() ); + + KABC::Picture picture = mAddressee.photo(); + if ( picture.isIntern() && !picture.data().isNull() ) + TQMimeSourceFactory::defaultFactory()->setImage( imageURL, picture.data() ); + else { + if ( !picture.url().isEmpty() ) { + if ( mImageData.count() > 0 ) + TQMimeSourceFactory::defaultFactory()->setImage( imageURL, TQImage(mImageData) ); + else { + mImageJob = KIO::get( KURL( picture.url() ), false, false ); + connect( mImageJob, TQT_SIGNAL( data( KIO::Job*, const TQByteArray& ) ), + this, TQT_SLOT( data( KIO::Job*, const TQByteArray& ) ) ); + connect( mImageJob, TQT_SIGNAL( result( KIO::Job* ) ), + this, TQT_SLOT( result( KIO::Job* ) ) ); + } + } else { + TQMimeSourceFactory::defaultFactory()->setPixmap( imageURL, + KGlobal::iconLoader()->loadIcon( "personal", KIcon::Desktop, 128 ) ); + } + } + + // at last display it... + setText( strAddr ); +} + +KABC::Addressee AddresseeView::addressee() const +{ + return mAddressee; +} + +void AddresseeView::urlClicked( const TQString &url ) +{ + kapp->invokeBrowser( url ); +} + +void AddresseeView::emailClicked( const TQString &email ) +{ + if ( email.startsWith( "mailto:" ) ) + kapp->invokeMailer( email.mid( 7 ), TQString() ); + else + kapp->invokeMailer( email, TQString() ); +} + +void AddresseeView::phoneNumberClicked( const TQString &number ) +{ + KConfig config( "kaddressbookrc" ); + config.setGroup( "General" ); + TQString commandLine = config.readEntry( "PhoneHookApplication" ); + + if ( commandLine.isEmpty() ) { + KMessageBox::sorry( this, i18n( "There is no application set which could be executed. Please go to the settings dialog and configure one." ) ); + return; + } + + commandLine.replace( "%N", number ); + KRun::runCommand( commandLine ); +} + +void AddresseeView::smsTextClicked( const TQString &number ) +{ + KConfig config( "kaddressbookrc" ); + config.setGroup( "General" ); + TQString commandLine = config.readEntry( "SMSHookApplication" ); + + if ( commandLine.isEmpty() ) { + KMessageBox::sorry( this, i18n( "There is no application set which could be executed. Please go to the settings dialog and configure one." ) ); + return; + } + + SendSMSDialog dlg( mAddressee.realName(), this ); + + if ( dlg.exec() ) + sendSMS ( number, dlg.text() ); +} + +void AddresseeView::sendSMS( const TQString &number, const TQString &text ) +{ + KConfig config( "kaddressbookrc" ); + config.setGroup( "General" ); + TQString commandLine = config.readEntry( "SMSHookApplication" ); + + KTempFile file ; + TQTextStream* stream = file.textStream(); + *stream << text; + file.close(); + + commandLine.replace( "%N", number ); + commandLine.replace( "%F", file.name() ); + + KRun::runCommand( commandLine ); +} + +void AddresseeView::faxNumberClicked( const TQString &number ) +{ + KConfig config( "kaddressbookrc" ); + config.setGroup( "General" ); + TQString commandLine = config.readEntry( "FaxHookApplication", "tdeprintfax --phone %N" ); + + if ( commandLine.isEmpty() ) { + KMessageBox::sorry( this, i18n( "There is no application set which could be executed. Please go to the settings dialog and configure one." ) ); + return; + } + + commandLine.replace( "%N", number ); + KRun::runCommand( commandLine ); +} + +void AddresseeView::imAddressClicked() +{ + mKIMProxy->chatWithContact( mAddressee.uid() ); +} + +TQPopupMenu *AddresseeView::createPopupMenu( const TQPoint& ) +{ + TQPopupMenu *menu = new TQPopupMenu( this ); + mActionShowBirthday->plug( menu ); + mActionShowAddresses->plug( menu ); + mActionShowEmails->plug( menu ); + mActionShowPhones->plug( menu ); + mActionShowURLs->plug( menu ); + mActionShowIMAddresses->plug( menu ); + mActionShowCustomFields->plug( menu ); + + return menu; +} + +void AddresseeView::slotMailClicked( const TQString&, const TQString &email ) +{ + emailClicked( email ); +} + +void AddresseeView::slotUrlClicked( const TQString &url ) +{ + if ( url.startsWith( "phone:" ) ) + phoneNumberClicked( strippedNumber( url.mid( 8 ) ) ); + else if ( url.startsWith( "sms:" ) ) + smsTextClicked( strippedNumber( url.mid( 6 ) ) ); + else if ( url.startsWith( "fax:" ) ) + faxNumberClicked( strippedNumber( url.mid( 6 ) ) ); + else if ( url.startsWith( "addr:" ) ) + emit addressClicked( url.mid( 7 ) ); + else if ( url.startsWith( "im:" ) ) + imAddressClicked(); + else + urlClicked( url ); +} + +void AddresseeView::slotHighlighted( const TQString &link ) +{ + if ( link.startsWith( "mailto:" ) ) { + TQString email = link.mid( 7 ); + + emit emailHighlighted( email ); + emit highlightedMessage( i18n( "Send mail to '%1'" ).tqarg( email ) ); + } else if ( link.startsWith( "phone:" ) ) { + TQString number = link.mid( 8 ); + + emit phoneNumberHighlighted( strippedNumber( number ) ); + emit highlightedMessage( i18n( "Call number %1" ).tqarg( number ) ); + } else if ( link.startsWith( "fax:" ) ) { + TQString number = link.mid( 6 ); + + emit faxNumberHighlighted( strippedNumber( number ) ); + emit highlightedMessage( i18n( "Send fax to %1" ).tqarg( number ) ); + } else if ( link.startsWith( "addr:" ) ) { + emit highlightedMessage( i18n( "Show address on map" ) ); + } else if ( link.startsWith( "sms:" ) ) { + TQString number = link.mid( 6 ); + emit highlightedMessage( i18n( "Send SMS to %1" ).tqarg( number ) ); + } else if ( link.startsWith( "http:" ) || link.startsWith( "https:" ) ) { + emit urlHighlighted( link ); + emit highlightedMessage( i18n( "Open URL %1" ).tqarg( link ) ); + } else if ( link.startsWith( "im:" ) ) { + emit highlightedMessage( i18n( "Chat with %1" ).tqarg( mAddressee.realName() ) ); + } else + emit highlightedMessage( "" ); +} + +void AddresseeView::slotPresenceChanged( const TQString &uid ) +{ + kdDebug() << k_funcinfo << " uid is: " << uid << " mAddressee is: " << mAddressee.uid() << endl; + if ( uid == mAddressee.uid() ) + updateView(); +} + + +void AddresseeView::slotPresenceInfoExpired() +{ + updateView(); +} + +void AddresseeView::configChanged() +{ + save(); + updateView(); +} + +void AddresseeView::data( KIO::Job*, const TQByteArray &d ) +{ + unsigned int oldSize = mImageData.size(); + mImageData.resize( oldSize + d.size() ); + memcpy( mImageData.data() + oldSize, d.data(), d.size() ); +} + +void AddresseeView::result( KIO::Job *job ) +{ + mImageJob = 0; + + if ( job->error() ) + mImageData.truncate( 0 ); + else + updateView(); +} + +void AddresseeView::load() +{ + mConfig->setGroup( "AddresseeViewSettings" ); + mActionShowBirthday->setChecked( mConfig->readBoolEntry( "ShowBirthday", false ) ); + mActionShowAddresses->setChecked( mConfig->readBoolEntry( "ShowAddresses", true ) ); + mActionShowEmails->setChecked( mConfig->readBoolEntry( "ShowEmails", true ) ); + mActionShowPhones->setChecked( mConfig->readBoolEntry( "ShowPhones", true ) ); + mActionShowURLs->setChecked( mConfig->readBoolEntry( "ShowURLs", true ) ); + mActionShowIMAddresses->setChecked( mConfig->readBoolEntry( "ShowIMAddresses", false ) ); + mActionShowCustomFields->setChecked( mConfig->readBoolEntry( "ShowCustomFields", false ) ); +} + +void AddresseeView::save() +{ + mConfig->setGroup( "AddresseeViewSettings" ); + mConfig->writeEntry( "ShowBirthday", mActionShowBirthday->isChecked() ); + mConfig->writeEntry( "ShowAddresses", mActionShowAddresses->isChecked() ); + mConfig->writeEntry( "ShowEmails", mActionShowEmails->isChecked() ); + mConfig->writeEntry( "ShowPhones", mActionShowPhones->isChecked() ); + mConfig->writeEntry( "ShowURLs", mActionShowURLs->isChecked() ); + mConfig->writeEntry( "ShowIMAddresses", mActionShowIMAddresses->isChecked() ); + mConfig->writeEntry( "ShowCustomFields", mActionShowCustomFields->isChecked() ); + mConfig->sync(); +} + +TQString AddresseeView::strippedNumber( const TQString &number ) +{ + TQString retval; + + for ( uint i = 0; i < number.length(); ++i ) { + TQChar c = number[ i ]; + if ( c.isDigit() || (((c == '*') || (c == '#') || (c == '+')) && (i == 0)) ) + retval.append( c ); + } + + return retval; +} + +#include "addresseeview.moc" |