libkdepim Library API Documentation

addresseeview.cpp

00001 /*
00002     This file is part of libkdepim.
00003 
00004     Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License as published by the Free Software Foundation; either
00009     version 2 of the License, or (at your option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     Library General Public License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to
00018     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019     Boston, MA 02111-1307, USA.
00020 */
00021 
00022 #include <qbuffer.h>
00023 #include <qimage.h>
00024 #include <qpopupmenu.h>
00025 #include <qurl.h>
00026 
00027 #include <kabc/address.h>
00028 #include <kabc/addressee.h>
00029 #include <kabc/phonenumber.h>
00030 #include <kactionclasses.h>
00031 #include <kapplication.h>
00032 #include <kconfig.h>
00033 #include <kglobal.h>
00034 #include <kglobalsettings.h>
00035 #include <kiconloader.h>
00036 #include <kio/job.h>
00037 #include <klocale.h>
00038 #include <kmdcodec.h>
00039 #include <kmessagebox.h>
00040 #include <krun.h>
00041 #include <kstringhandler.h>
00042 #include <ktempfile.h>
00043 
00044 #include <kdebug.h>
00045 
00046 #include "addresseeview.h"
00047 
00048 using namespace KPIM;
00049 
00050 AddresseeView::AddresseeView( QWidget *parent, const char *name,
00051                               KConfig *config )
00052   : KTextBrowser( parent, name ), mDefaultConfig( false ), mImageJob( 0 ),
00053     mLinkMask( AddressLinks | EmailLinks | PhoneLinks | URLLinks | IMLinks )
00054 {
00055   setWrapPolicy( QTextEdit::AtWordBoundary );
00056   setLinkUnderline( false );
00057   setVScrollBarMode( QScrollView::AlwaysOff );
00058   setHScrollBarMode( QScrollView::AlwaysOff );
00059 
00060   QStyleSheet *sheet = styleSheet();
00061   QStyleSheetItem *link = sheet->item( "a" );
00062   link->setColor( KGlobalSettings::linkColor() );
00063 
00064   connect( this, SIGNAL( mailClick( const QString&, const QString& ) ),
00065            this, SLOT( slotMailClicked( const QString&, const QString& ) ) );
00066   connect( this, SIGNAL( urlClick( const QString& ) ),
00067            this, SLOT( slotUrlClicked( const QString& ) ) );
00068   connect( this, SIGNAL( highlighted( const QString& ) ),
00069            this, SLOT( slotHighlighted( const QString& ) ) );
00070 
00071   setNotifyClick( true );
00072 
00073   mActionShowBirthday = new KToggleAction( i18n( "Show Birthday" ) );
00074   mActionShowAddresses = new KToggleAction( i18n( "Show Postal Addresses" ) );
00075   mActionShowEmails = new KToggleAction( i18n( "Show Email Addresses" ) );
00076   mActionShowPhones = new KToggleAction( i18n( "Show Telephone Numbers" ) );
00077   mActionShowURLs = new KToggleAction( i18n( "Show Web Pages (URLs)" ) );
00078 #if KDE_IS_VERSION(3,2,90)
00079   mActionShowBirthday->setCheckedState(i18n("Hide Birthday"));
00080   mActionShowAddresses->setCheckedState(i18n("Hide Postal Addresses"));
00081   mActionShowEmails->setCheckedState(i18n("Hide Email Addresses"));
00082   mActionShowPhones->setCheckedState(i18n("Hide Telephone Numbers"));
00083   mActionShowURLs->setCheckedState(i18n("Hide Web Pages (URLs)"));
00084 #endif
00085 
00086   connect( mActionShowBirthday, SIGNAL( toggled( bool ) ), SLOT( configChanged() ) );
00087   connect( mActionShowAddresses, SIGNAL( toggled( bool ) ), SLOT( configChanged() ) );
00088   connect( mActionShowEmails, SIGNAL( toggled( bool ) ), SLOT( configChanged() ) );
00089   connect( mActionShowPhones, SIGNAL( toggled( bool ) ), SLOT( configChanged() ) );
00090   connect( mActionShowURLs, SIGNAL( toggled( bool ) ), SLOT( configChanged() ) );
00091 
00092   if ( !config ) {
00093     mConfig = new KConfig( "kaddressbookrc" );
00094     mDefaultConfig = true;
00095   } else
00096     mConfig = config;
00097 
00098   load();
00099 
00100   // set up IMProxy to display contacts' IM presence and make connections to keep the display live
00101   mKIMProxy = ::KIMProxy::instance( kapp->dcopClient() );
00102   connect( mKIMProxy, SIGNAL( sigContactPresenceChanged( const QString & ) ), this, SLOT( slotPresenceChanged( const QString & ) ) );
00103   connect( mKIMProxy, SIGNAL( sigPresenceInfoExpired() ), this, SLOT( slotPresenceInfoExpired() ) );
00104 }
00105 
00106 AddresseeView::~AddresseeView()
00107 {
00108   if ( mDefaultConfig )
00109     delete mConfig;
00110   mConfig = 0;
00111 
00112   delete mActionShowBirthday;
00113   delete mActionShowAddresses;
00114   delete mActionShowEmails;
00115   delete mActionShowPhones;
00116   delete mActionShowURLs;
00117 
00118   mKIMProxy = 0;
00119 }
00120 
00121 void AddresseeView::setAddressee( const KABC::Addressee& addr )
00122 {
00123   mAddressee = addr;
00124 
00125   if ( mImageJob ) {
00126     mImageJob->kill();
00127     mImageJob = 0;
00128   }
00129 
00130   mImageData.truncate( 0 );
00131 
00132   updateView();
00133 }
00134 
00135 void AddresseeView::enableLinks( int linkMask )
00136 {
00137   mLinkMask = linkMask;
00138 }
00139 
00140 QString AddresseeView::vCardAsHTML( const KABC::Addressee& addr, ::KIMProxy *proxy, int linkMask,
00141                                     bool internalLoading,
00142                                     bool showBirthday, bool showAddresses,
00143                                     bool showEmails, bool showPhones, bool showURLs,
00144                                     bool showIMAddresses )
00145 {
00146   QString image = QString( "contact_%1_image" ).arg( addr.uid() );
00147 
00148   // Style strings from Gentix; this is just an initial version.
00149   //
00150   // These will be substituted into various HTML strings with .arg().
00151   // Search for @STYLE@ to find where. Note how we use %1 as a
00152   // placeholder where we fill in something else (in this case,
00153   // the global background color).
00154   //
00155   QString backgroundColor = KGlobalSettings::alternateBackgroundColor().name();
00156   QString cellStyle = QString::fromLatin1(
00157         "style=\""
00158         "padding-right: 2px; "
00159         "border-right: #000 dashed 1px; "
00160         "background: %1;\"").arg(backgroundColor);
00161   QString backgroundColor2 = KGlobalSettings::baseColor().name();
00162   QString cellStyle2 = QString::fromLatin1(
00163         "style=\""
00164         "padding-left: 2px; "
00165         "background: %1;\"").arg(backgroundColor2);
00166   QString tableStyle = QString::fromLatin1(
00167         "style=\""
00168         "border: solid 1px; "
00169         "margin: 0em;\"");
00170 
00171   // We'll be building a table to display the vCard in.
00172   // Each row of the table will be built using this string for its HTML.
00173   //
00174   QString rowFmtStr = QString::fromLatin1(
00175         "<tr>"
00176         "<td align=\"right\" valign=\"top\" width=\"30%\" "); // Tag unclosed
00177   rowFmtStr.append( cellStyle );
00178   rowFmtStr.append( QString::fromLatin1(
00179     ">" // Close tag
00180         "<b>%1</b>"
00181         "</td>"
00182         "<td align=\"left\" valign=\"top\" width=\"70%\" ") ); // Tag unclosed
00183   rowFmtStr.append( cellStyle2 );
00184   rowFmtStr.append( QString::fromLatin1(
00185     ">" // Close tag
00186         "%2"
00187         "</td>"
00188         "</tr>\n"
00189         ) );
00190 
00191   // Build the table's rows here
00192   QString dynamicPart;
00193 
00194 
00195   if ( !internalLoading ) {
00196     KABC::Picture pic = addr.photo();
00197     if ( pic.isIntern() && !pic.data().isNull() ) {
00198       image = pixmapAsDataUrl( pic.data() );
00199     } else if ( !pic.url().isEmpty() ) {
00200       image = (pic.url().startsWith( "http://" ) || pic.url().startsWith( "https://" ) ? pic.url() : "http://" + pic.url());
00201     } else {
00202       image = "file:" + KGlobal::iconLoader()->iconPath( "personal", KIcon::Desktop );
00203     }
00204   }
00205 
00206   if ( showBirthday ) {
00207     QDate date = addr.birthday().date();
00208 
00209     if ( date.isValid() )
00210       dynamicPart += rowFmtStr
00211         .arg( KABC::Addressee::birthdayLabel() )
00212         .arg( KGlobal::locale()->formatDate( date, true ) );
00213   }
00214 
00215   if ( showPhones ) {
00216     KABC::PhoneNumber::List phones = addr.phoneNumbers();
00217     KABC::PhoneNumber::List::ConstIterator phoneIt;
00218     for ( phoneIt = phones.begin(); phoneIt != phones.end(); ++phoneIt ) {
00219       QString number = (*phoneIt).number();
00220 
00221       QString url;
00222       if ( (*phoneIt).type() & KABC::PhoneNumber::Fax )
00223         url = QString::fromLatin1( "fax:" ) + number;
00224       else
00225         url = QString::fromLatin1( "phone:" ) + number;
00226 
00227       if ( linkMask & PhoneLinks ) {
00228         dynamicPart += rowFmtStr
00229           .arg( KABC::PhoneNumber::typeLabel( (*phoneIt).type() ).replace( " ", "&nbsp;" ) )
00230           .arg( QString::fromLatin1( "<a href=\"%1\">%2</a>" ).arg(url).arg(number) );
00231       } else {
00232         dynamicPart += rowFmtStr
00233           .arg( KABC::PhoneNumber::typeLabel( (*phoneIt).type() ).replace( " ", "&nbsp;" ) )
00234           .arg( number );
00235       }
00236     }
00237   }
00238 
00239   if ( showEmails ) {
00240     QStringList emails = addr.emails();
00241     QStringList::ConstIterator emailIt;
00242     QString type = i18n( "Email" );
00243     for ( emailIt = emails.begin(); emailIt != emails.end(); ++emailIt ) {
00244       QString fullEmail = addr.fullEmail( *emailIt );
00245       QUrl::encode( fullEmail );
00246 
00247       if ( linkMask & EmailLinks ) {
00248         dynamicPart += rowFmtStr.arg( type )
00249           .arg( QString::fromLatin1( "<a href=\"mailto:%1\">%2</a>" )
00250           .arg( fullEmail, *emailIt ) );
00251       } else {
00252         dynamicPart += rowFmtStr.arg( type ).arg( *emailIt );
00253       }
00254 
00255       type = i18n( "Other" );
00256     }
00257   }
00258 
00259   if ( showURLs ) {
00260     if ( !addr.url().url().isEmpty() ) {
00261       if ( linkMask & URLLinks ) {
00262         QString url = (addr.url().url().startsWith( "http://" ) || addr.url().url().startsWith( "https://" ) ? addr.url().url() :
00263                        "http://" + addr.url().url());
00264         dynamicPart += rowFmtStr
00265           .arg( i18n( "Homepage" ) )
00266           .arg( KStringHandler::tagURLs( url ) );
00267       } else {
00268         dynamicPart += rowFmtStr
00269           .arg( i18n( "Homepage" ) )
00270           .arg( addr.url().url() );
00271       }
00272     }
00273   }
00274 
00275   if ( showAddresses ) {
00276     KABC::Address::List addresses = addr.addresses();
00277     KABC::Address::List::ConstIterator addrIt;
00278     for ( addrIt = addresses.begin(); addrIt != addresses.end(); ++addrIt ) {
00279       if ( (*addrIt).label().isEmpty() ) {
00280         QString formattedAddress;
00281 
00282 #if KDE_IS_VERSION(3,1,90)
00283         formattedAddress = (*addrIt).formattedAddress().stripWhiteSpace();
00284 #else
00285         if ( !(*addrIt).street().isEmpty() )
00286           formattedAddress += (*addrIt).street() + "\n";
00287 
00288         if ( !(*addrIt).postOfficeBox().isEmpty() )
00289           formattedAddress += (*addrIt).postOfficeBox() + "\n";
00290 
00291         formattedAddress += (*addrIt).locality() + QString::fromLatin1(" ") + (*addrIt).region();
00292 
00293         if ( !(*addrIt).postalCode().isEmpty() )
00294           formattedAddress += QString::fromLatin1(", ") + (*addrIt).postalCode();
00295 
00296         formattedAddress += "\n";
00297 
00298         if ( !(*addrIt).country().isEmpty() )
00299           formattedAddress += (*addrIt).country() + "\n";
00300 
00301         formattedAddress += (*addrIt).extended();
00302 #endif
00303 
00304         formattedAddress = formattedAddress.replace( '\n', "<br>" );
00305 
00306         QString link = "<a href=\"addr:" + (*addrIt).id() + "\">" +
00307                        formattedAddress + "</a>";
00308 
00309         if ( linkMask & AddressLinks ) {
00310           dynamicPart += rowFmtStr
00311             .arg( KABC::Address::typeLabel( (*addrIt).type() ) )
00312             .arg( link );
00313         } else {
00314           dynamicPart += rowFmtStr
00315             .arg( KABC::Address::typeLabel( (*addrIt).type() ) )
00316             .arg( formattedAddress );
00317         }
00318       } else {
00319         QString link = "<a href=\"addr:" + (*addrIt).id() + "\">" +
00320                        (*addrIt).label().replace( '\n', "<br>" ) + "</a>";
00321 
00322         if ( linkMask & AddressLinks ) {
00323           dynamicPart += rowFmtStr
00324             .arg( KABC::Address::typeLabel( (*addrIt).type() ) )
00325             .arg( link );
00326         } else {
00327           dynamicPart += rowFmtStr
00328             .arg( KABC::Address::typeLabel( (*addrIt).type() ) )
00329             .arg( (*addrIt).label().replace( '\n', "<br>" ) );
00330         }
00331       }
00332     }
00333   }
00334 
00335   QString notes;
00336   if ( !addr.note().isEmpty() ) {
00337     // @STYLE@ - substitute the cell style in first, and append
00338     // the data afterwards (keeps us safe from possible % signs
00339     // in either one).
00340     notes = rowFmtStr.arg( i18n( "Notes" ) ).arg( addr.note().replace( '\n', "<br>" ) ) ;
00341   }
00342 
00343   QString name( addr.realName() );
00344   QString role( addr.role() );
00345   QString organization( addr.organization() );
00346 
00347   if ( proxy && showIMAddresses )
00348   {
00349     if ( proxy->isPresent( addr.uid() ) )
00350     {
00351       // set image source to either a QMimeSourceFactory key or a data:/ URL
00352       QString imgSrc;
00353       if ( internalLoading )
00354       {
00355         imgSrc = QString::fromLatin1( "im_status_%1_image").arg( addr.uid() );
00356         QMimeSourceFactory::defaultFactory()->setPixmap( imgSrc, proxy->presenceIcon( addr.uid() ) );
00357       }
00358       else
00359         imgSrc = pixmapAsDataUrl( proxy->presenceIcon( addr.uid() ) );
00360 
00361       // make the status a link, if required
00362       QString imStatus;
00363       if ( linkMask & IMLinks )
00364         imStatus = QString::fromLatin1( "<a href=\"im:\"><img src=\"%1\"> (%2)</a>" );
00365       else
00366         imStatus = QString::fromLatin1( "<img src=\"%1\"> (%2)" );
00367 
00368       // append our status to the rest of the dynamic part of the addressee
00369       dynamicPart += rowFmtStr
00370               .arg( i18n( "Presence" ) )
00371               .arg( imStatus
00372                         .arg( imgSrc )
00373                         .arg( proxy->presenceString( addr.uid() ) )
00374                   );
00375     }
00376   }
00377 
00378   // @STYLE@ - construct the string by parts, substituting in
00379   // the styles first. There are lots of appends, but we need to
00380   // do it this way to avoid cases where the substituted string
00381   // contains %1 and the like.
00382   //
00383   QString strAddr = QString::fromLatin1(
00384     "<div align=\"center\">"
00385     "<table cellpadding=\"1\" cellspacing=\"0\" %1>"
00386     "<tr>").arg(tableStyle);
00387 
00388   strAddr.append( QString::fromLatin1(
00389     "<td align=\"right\" valign=\"top\" width=\"30%\" rowspan=\"3\" %2>")
00390     .arg( cellStyle ) );
00391   strAddr.append( QString::fromLatin1(
00392     "<img src=\"%1\" width=\"50\" vspace=\"1\">" // image
00393     "</td>")
00394     .arg( image ) );
00395   strAddr.append( QString::fromLatin1(
00396     "<td align=\"left\" width=\"70%\" %2>")
00397     .arg( cellStyle2 ) );
00398   strAddr.append( QString::fromLatin1(
00399     "<font size=\"+2\"><b>%2</b></font></td>"  // name
00400     "</tr>")
00401     .arg( name ) );
00402   strAddr.append( QString::fromLatin1(
00403     "<tr>"
00404     "<td align=\"left\" width=\"70%\" %2>")
00405     .arg( cellStyle2 ) );
00406   strAddr.append( QString::fromLatin1(
00407     "%3</td>"  // role
00408     "</tr>")
00409     .arg( role ) );
00410   strAddr.append( QString::fromLatin1(
00411     "<tr>"
00412     "<td align=\"left\" width=\"70%\" %2>")
00413     .arg( cellStyle2 ) );
00414   strAddr.append( QString::fromLatin1(
00415     "%4</td>"  // organization
00416     "</tr>")
00417     .arg( organization ) );
00418   strAddr.append( QString::fromLatin1(
00419     "<tr><td %2>")
00420     .arg( cellStyle ) );
00421   strAddr.append( QString::fromLatin1(
00422     "&nbsp;</td><td %2>&nbsp;</td></tr>")
00423     .arg( cellStyle2 ) );
00424   strAddr.append(dynamicPart);
00425   strAddr.append(notes);
00426   strAddr.append( QString::fromLatin1("</table></div>\n") );
00427 
00428   return strAddr;
00429 }
00430 
00431 QString AddresseeView::pixmapAsDataUrl( const QPixmap& pixmap )
00432 {
00433   QByteArray ba;
00434   QBuffer buffer( ba );
00435   buffer.open( IO_WriteOnly );
00436   pixmap.save( &buffer, "PNG" );
00437   QString encoded( "data:image/png;base64," );
00438   encoded.append( KCodecs::base64Encode( ba ) );
00439   return encoded;
00440 }
00441 
00442 void AddresseeView::updateView()
00443 {
00444   // clear view
00445   setText( QString::null );
00446 
00447   if ( mAddressee.isEmpty() )
00448     return;
00449 
00450   if ( mImageJob ) {
00451     mImageJob->kill();
00452     mImageJob = 0;
00453 
00454     mImageData.truncate( 0 );
00455   }
00456 
00457   QString strAddr = vCardAsHTML( mAddressee, mKIMProxy, mLinkMask, true,
00458                                  mActionShowBirthday->isChecked(),
00459                                  mActionShowAddresses->isChecked(),
00460                                  mActionShowEmails->isChecked(),
00461                                  mActionShowPhones->isChecked(),
00462                                  mActionShowURLs->isChecked() );
00463 
00464   strAddr = QString::fromLatin1(
00465     "<html>"
00466     "<body text=\"%1\" bgcolor=\"%2\">" // text and background color
00467     "%3" // dynamic part
00468     "</body>"
00469     "</html>" )
00470      .arg( KGlobalSettings::textColor().name() )
00471      .arg( KGlobalSettings::baseColor().name() )
00472      .arg( strAddr );
00473 
00474   QString imageURL = QString( "contact_%1_image" ).arg( mAddressee.uid() );
00475 
00476   KABC::Picture picture = mAddressee.photo();
00477   if ( picture.isIntern() && !picture.data().isNull() )
00478     QMimeSourceFactory::defaultFactory()->setImage( imageURL, picture.data() );
00479   else {
00480     if ( !picture.url().isEmpty() ) {
00481       if ( mImageData.count() > 0 )
00482         QMimeSourceFactory::defaultFactory()->setImage( imageURL, mImageData );
00483       else {
00484         mImageJob = KIO::get( KURL( picture.url() ), false, false );
00485         connect( mImageJob, SIGNAL( data( KIO::Job*, const QByteArray& ) ),
00486                  this, SLOT( data( KIO::Job*, const QByteArray& ) ) );
00487         connect( mImageJob, SIGNAL( result( KIO::Job* ) ),
00488                  this, SLOT( result( KIO::Job* ) ) );
00489       }
00490     } else {
00491       QMimeSourceFactory::defaultFactory()->setPixmap( imageURL,
00492         KGlobal::iconLoader()->loadIcon( "personal", KIcon::Desktop, 128 ) );
00493     }
00494   }
00495 
00496   // at last display it...
00497   setText( strAddr );
00498 }
00499 
00500 KABC::Addressee AddresseeView::addressee() const
00501 {
00502   return mAddressee;
00503 }
00504 
00505 void AddresseeView::urlClicked( const QString &url )
00506 {
00507   kapp->invokeBrowser( url );
00508 }
00509 
00510 void AddresseeView::emailClicked( const QString &email )
00511 {
00512   kapp->invokeMailer( email, QString::null );
00513 }
00514 
00515 void AddresseeView::phoneNumberClicked( const QString &number )
00516 {
00517   KConfig config( "kaddressbookrc" );
00518   config.setGroup( "General" );
00519   QString commandLine = config.readEntry( "PhoneHookApplication" );
00520 
00521   if ( commandLine.isEmpty() ) {
00522     KMessageBox::sorry( this, i18n( "There is no application set which could be executed. Please go to the settings dialog and configure one." ) );
00523     return;
00524   }
00525 
00526   commandLine.replace( "%N", number );
00527   KRun::runCommand( commandLine );
00528 }
00529 
00530 void AddresseeView::faxNumberClicked( const QString &number )
00531 {
00532   KConfig config( "kaddressbookrc" );
00533   config.setGroup( "General" );
00534   QString commandLine = config.readEntry( "FaxHookApplication", "kdeprintfax --phone %N" );
00535 
00536   if ( commandLine.isEmpty() ) {
00537     KMessageBox::sorry( this, i18n( "There is no application set which could be executed. Please go to the settings dialog and configure one." ) );
00538     return;
00539   }
00540 
00541   commandLine.replace( "%N", number );
00542   KRun::runCommand( commandLine );
00543 }
00544 
00545 void AddresseeView::imAddressClicked()
00546 {
00547   mKIMProxy->chatWithContact( mAddressee.uid() );
00548 }
00549 
00550 QPopupMenu *AddresseeView::createPopupMenu( const QPoint& )
00551 {
00552   QPopupMenu *menu = new QPopupMenu( this );
00553   mActionShowBirthday->plug( menu );
00554   mActionShowAddresses->plug( menu );
00555   mActionShowEmails->plug( menu );
00556   mActionShowPhones->plug( menu );
00557   mActionShowURLs->plug( menu );
00558 
00559   return menu;
00560 }
00561 
00562 void AddresseeView::slotMailClicked( const QString&, const QString &email )
00563 {
00564   emailClicked( email );
00565 }
00566 
00567 void AddresseeView::slotUrlClicked( const QString &url )
00568 {
00569   if ( url.startsWith( "phone:" ) )
00570     phoneNumberClicked( strippedNumber( url.mid( 8 ) ) );
00571   else if ( url.startsWith( "fax:" ) )
00572     faxNumberClicked( strippedNumber( url.mid( 6 ) ) );
00573   else if ( url.startsWith( "addr:" ) )
00574     emit addressClicked( url.mid( 7 ) );
00575   else if ( url.startsWith( "im:" ) )
00576     imAddressClicked();
00577   else
00578     urlClicked( url );
00579 }
00580 
00581 void AddresseeView::slotHighlighted( const QString &link )
00582 {
00583   if ( link.lower().startsWith( "mailto:" ) ) {
00584     QString email = link.mid( 7 );
00585 
00586     emit emailHighlighted( email );
00587     emit highlightedMessage( i18n( "Send mail to '%1'" ).arg( email ) );
00588   } else if ( link.startsWith( "phone:" ) ) {
00589     QString number = link.mid( 8 );
00590 
00591     emit phoneNumberHighlighted( strippedNumber( number ) );
00592     emit highlightedMessage( i18n( "Call number %1" ).arg( number ) );
00593   } else if ( link.startsWith( "fax:" ) ) {
00594     QString number = link.mid( 6 );
00595 
00596     emit faxNumberHighlighted( strippedNumber( number ) );
00597     emit highlightedMessage( i18n( "Send fax to %1" ).arg( number ) );
00598   } else if ( link.startsWith( "addr:" ) ) {
00599     emit highlightedMessage( i18n( "Show address on map" ) );
00600   } else if ( link.startsWith( "http:" ) || link.startsWith( "https:" ) ) {
00601     emit urlHighlighted( link );
00602     emit highlightedMessage( i18n( "Open URL %1" ).arg( link ) );
00603   } else if ( link.startsWith( "im:" ) ) {
00604     emit highlightedMessage( i18n( "Chat with %1" ).arg( mAddressee.realName() ) );
00605   } else
00606     emit highlightedMessage( "" );
00607 }
00608 
00609 void AddresseeView::slotPresenceChanged( const QString &uid )
00610 {
00611   kdDebug() << k_funcinfo << " uid is: " << uid << " mAddressee is: " << mAddressee.uid() << endl;
00612   if ( uid == mAddressee.uid() )
00613     updateView();
00614 }
00615 
00616 
00617 void AddresseeView::slotPresenceInfoExpired()
00618 {
00619   updateView();
00620 }
00621 
00622 void AddresseeView::configChanged()
00623 {
00624   save();
00625   updateView();
00626 }
00627 
00628 void AddresseeView::data( KIO::Job*, const QByteArray &d )
00629 {
00630   unsigned int oldSize = mImageData.size();
00631   mImageData.resize( oldSize + d.size() );
00632   memcpy( mImageData.data() + oldSize, d.data(), d.size() );
00633 }
00634 
00635 void AddresseeView::result( KIO::Job *job )
00636 {
00637   mImageJob = 0;
00638 
00639   if ( job->error() )
00640     mImageData.truncate( 0 );
00641   else
00642     updateView();
00643 }
00644 
00645 void AddresseeView::load()
00646 {
00647   mConfig->setGroup( "AddresseeViewSettings" );
00648   mActionShowBirthday->setChecked( mConfig->readBoolEntry( "ShowBirthday", false ) );
00649   mActionShowAddresses->setChecked( mConfig->readBoolEntry( "ShowAddresses", true ) );
00650   mActionShowEmails->setChecked( mConfig->readBoolEntry( "ShowEmails", true ) );
00651   mActionShowPhones->setChecked( mConfig->readBoolEntry( "ShowPhones", true ) );
00652   mActionShowURLs->setChecked( mConfig->readBoolEntry( "ShowURLs", true ) );
00653 }
00654 
00655 void AddresseeView::save()
00656 {
00657   mConfig->setGroup( "AddresseeViewSettings" );
00658   mConfig->writeEntry( "ShowBirthday", mActionShowBirthday->isChecked() );
00659   mConfig->writeEntry( "ShowAddresses", mActionShowAddresses->isChecked() );
00660   mConfig->writeEntry( "ShowEmails", mActionShowEmails->isChecked() );
00661   mConfig->writeEntry( "ShowPhones", mActionShowPhones->isChecked() );
00662   mConfig->writeEntry( "ShowURLs", mActionShowURLs->isChecked() );
00663   mConfig->sync();
00664 }
00665 
00666 QString AddresseeView::strippedNumber( const QString &number )
00667 {
00668   QString retval;
00669 
00670   for ( uint i = 0; i < number.length(); ++i ) {
00671     QChar c = number[ i ];
00672     if ( c.isDigit() || c == '*' || c == '#' || c == '+' && i == 0 )
00673       retval.append( c );
00674   }
00675 
00676   return retval;
00677 }
00678 
00679 #include "addresseeview.moc"
KDE Logo
This file is part of the documentation for libkdepim Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 4 14:40:44 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003