00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include <qpaintdevicemetrics.h>
00026
#include <qpainter.h>
00027
00028
#include <kdebug.h>
00029
#include <kglobal.h>
00030
#include <klocale.h>
00031
#include <knotifyclient.h>
00032
#include <kprinter.h>
00033
#include <kurl.h>
00034
00035
#include "look_basic.h"
00036
00037
#include "kabentrypainter.h"
00038
00039 KABEntryPainter::KABEntryPainter()
00040 : mShowAddresses( true ), mShowEmails( true ), mShowPhones( true ),
00041 mShowURLs( true )
00042 {
00043 }
00044
00045 KABEntryPainter::~KABEntryPainter()
00046 {
00047 mEmailRects.clear();
00048 mPhoneRects.clear();
00049 mURLRects.clear();
00050 mTalkRects.clear();
00051 }
00052
00053
void KABEntryPainter::setForegroundColor(
const QColor &color )
00054 {
00055 mForegroundColor = color;
00056 }
00057
00058
void KABEntryPainter::setBackgroundColor(
const QColor &color )
00059 {
00060 mBackgroundColor = color;
00061 }
00062
00063
void KABEntryPainter::setHeaderColor(
const QColor &color )
00064 {
00065 mHeaderColor = color;
00066 }
00067
00068
void KABEntryPainter::setHeaderFont(
const QFont &font )
00069 {
00070 mHeaderFont = font;
00071 }
00072
00073
void KABEntryPainter::setHeadLineFont(
const QFont &font )
00074 {
00075 mHeadLineFont = font;
00076 }
00077
00078
void KABEntryPainter::setBodyFont(
const QFont &font )
00079 {
00080 mBodyFont = font;
00081 }
00082
00083
void KABEntryPainter::setFixedFont(
const QFont &font )
00084 {
00085 mFixedFont = font;
00086 }
00087
00088
void KABEntryPainter::setCommentFont(
const QFont &font )
00089 {
00090 mCommentFont = font;
00091 }
00092
00093
void KABEntryPainter::setUseHeaderColor(
bool value )
00094 {
00095 mUseHeaderColor = value;
00096 }
00097
00098
void KABEntryPainter::setShowAddresses(
bool value )
00099 {
00100 mShowAddresses = value;
00101 }
00102
00103
void KABEntryPainter::setShowEmails(
bool value )
00104 {
00105 mShowEmails = value;
00106 }
00107
00108
void KABEntryPainter::setShowPhones(
bool value )
00109 {
00110 mShowPhones = value;
00111 }
00112
00113
void KABEntryPainter::setShowURLs(
bool value )
00114 {
00115 mShowURLs = value;
00116 }
00117
00118
int KABEntryPainter::hitsEmail(
QPoint p )
00119 {
00120
return hits( mEmailRects, p );
00121 }
00122
00123
int KABEntryPainter::hitsURL(
QPoint p )
00124 {
00125
return hits( mURLRects, p );
00126 }
00127
00128
int KABEntryPainter::hitsPhone(
QPoint p )
00129 {
00130
return hits( mPhoneRects, p );
00131 }
00132
00133
int KABEntryPainter::hitsTalk(
QPoint p )
00134 {
00135
return hits( mTalkRects, p );
00136 }
00137
00138
int KABEntryPainter::hits(
const QRectList& list,
QPoint p )
00139 {
00140 QRectList::const_iterator pos;
00141
int count = 0;
00142
00143
for( pos = list.begin(); pos != list.end(); ++pos ) {
00144
if ( (*pos).contains( p ) )
00145
return count;
00146
00147 ++count;
00148 }
00149
00150
return -1;
00151 }
00152
00153
bool KABEntryPainter::printAddressee(
const KABC::Addressee &addr,
00154
const QRect &window,
QPainter *painter,
00155
int top,
bool fake,
QRect *brect )
00156 {
00157
00158
const int Width = window.width();
00159
const int Height = window.height();
00160
const int Ruler1 = Width/32;
00161
const int Ruler2 = 2 * Ruler1;
00162
const int Ruler3 = 3 * Ruler1;
00163
QString text, line1, line2, line3, line4;
00164
QRect rect;
00165
00166
00167
QFontMetrics fmHeader( mHeaderFont );
00168
QFontMetrics fmHeadLine( mHeadLineFont );
00169
QFontMetrics fmBody( mBodyFont );
00170
QFontMetrics fmFixed( mFixedFont );
00171
QFontMetrics fmComment( mCommentFont );
00172
00173
int y = top;
00174 KABC::Address address;
00175
00176
00177
00178
QValueList<QStringList> parts;
00179
QValueList<QRectList*> contents;
00180
00181 mEmailRects.clear();
00182 mPhoneRects.clear();
00183 mURLRects.clear();
00184
00185
00186 painter->setWindow( window );
00187
00188
00189 painter->setFont( mHeaderFont );
00190 painter->setBrush(
QBrush( mBackgroundColor ) );
00191 painter->setPen( mBackgroundColor );
00192 text = addr.realName();
00193
00194
00195 rect = painter->boundingRect( Ruler1, y, Width, Height,
00196 Qt::AlignVCenter | Qt::AlignLeft, text );
00197 rect.setHeight( (
int)( 1.25 * rect.height() ) );
00198
00199
if ( !fake && mUseHeaderColor )
00200 painter->drawRect( 0, y, Width, rect.height() );
00201
00202 painter->setPen( mUseHeaderColor ? mHeaderColor : mForegroundColor );
00203
if ( !fake ) {
00204
00205
float ypos = y + ( (
float)rect.height() ) * 0.125;
00206 painter->drawText( Ruler1, (
int)ypos, Width, rect.height(),
00207 Qt::AlignVCenter | Qt::AlignLeft, text );
00208 }
00209
00210
00211
QDateTime dt = addr.birthday();
00212
if ( dt.isValid() ) {
00213 line1 = KGlobal::locale()->formatDate( dt.date(),
true );
00214
if ( !fake ) {
00215
00216
float ypos = y + ( (
float)rect.height() ) * 0.125;
00217 painter->drawText( 0, (
int)ypos, Width-Ruler1, rect.height(),
00218 Qt::AlignVCenter | Qt::AlignRight, line1 );
00219 }
00220 }
00221
00222 y += rect.height();
00223
00224
00225 painter->setFont( mBodyFont );
00226 y += fmBody.lineSpacing() / 2;
00227
00228 painter->setPen( mForegroundColor );
00229
if ( !addr.prefix().isEmpty() ) {
00230 line1 = addr.prefix().stripWhiteSpace();
00231
00232
if ( fake ) {
00233 rect = painter->boundingRect( Ruler1, y, Width-Ruler1, Height,
00234 Qt::AlignTop | Qt::AlignLeft, line1 );
00235 }
else {
00236 painter->drawText( Ruler1, y, Width-Ruler1, Height, Qt::AlignTop | Qt::AlignLeft,
00237 line1, -1, &rect );
00238 }
00239
00240 y += rect.height();
00241 }
00242
00243
if ( !( addr.prefix().isEmpty() ) )
00244 y += fmBody.lineSpacing() / 2;
00245
00246
00247
00248
00249
if ( !addr.emails().isEmpty() && mShowEmails ) {
00250 contents.push_back( &mEmailRects );
00251
QStringList list;
00252
00253 list.append( addr.emails().count() == 1 ? i18n(
"Email address:" )
00254 : i18n(
"Email addresses:" ) );
00255 list += addr.emails();
00256 parts.push_back( list );
00257 }
00258
00259
00260 KABC::PhoneNumber::List phoneNumbers = addr.phoneNumbers();
00261
if ( !phoneNumbers.isEmpty() && mShowPhones ) {
00262 contents.push_back( &mPhoneRects );
00263
QStringList list;
00264
QString line;
00265
00266 list.append( phoneNumbers.count() == 1 ? i18n(
"Telephone:" )
00267 : i18n(
"Telephones:" ) );
00268
00269 KABC::PhoneNumber::List::Iterator it;
00270
for ( it = phoneNumbers.begin(); it != phoneNumbers.end(); ++it ) {
00271 line = (*it).typeLabel();
00272 line +=
": " + (*it).number();
00273 list.append( line.stripWhiteSpace() );
00274 }
00275
00276 parts.push_back( list );
00277 }
00278
00279
00280
if ( !addr.url().isEmpty() && addr.url().isValid() && mShowURLs ) {
00281 contents.push_back( &mURLRects );
00282
QStringList list;
00283
00284 list.append( i18n(
"Web page:" ) );
00285 list += addr.url().prettyURL();
00286 parts.push_back( list );
00287 }
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
QRect limits[] = {
QRect( 0, y, Width / 2, Height ),
00303
QRect( Width / 2, y, Width / 2, Height ),
00304
QRect( 0, y, Width / 2, Height ),
00305
QRect( Width / 2, y, Width / 2, Height ) };
00306
int heights[ 4 ]= { 0, 0, 0, 0 };
00307
00308
QValueList<QStringList>::iterator pos = parts.begin();
00309
QValueList<QRectList*>::iterator rpos = contents.begin();
00310
00311
for ( uint counter = 0; counter < parts.count(); ++counter ) {
00312
const int Offset = counter > 1 ? QMAX( heights[ 0 ], heights[ 1 ] ) : 0;
00313
QStringList list = *pos;
00314
00315 painter->setFont( mHeadLineFont );
00316
if ( fake ) {
00317 rect = painter->boundingRect( limits[ counter ].left(),
00318 limits[ counter ].top() + heights[counter]
00319 + Offset, limits[ counter ].width(),
00320 limits[ counter ].height(),
00321 Qt::AlignTop | Qt::AlignLeft, *list.at( 0 ) );
00322 }
else {
00323 painter->drawText( limits[ counter ].left(), limits[ counter ].top() +
00324 heights[ counter ] + Offset, limits[ counter ].width(),
00325 limits[ counter ].height(), Qt::AlignTop | Qt::AlignLeft,
00326 *list.at( 0 ), -1, &rect );
00327 }
00328
00329 heights[ counter ] += rect.height();
00330
00331
00332 painter->setFont( mFixedFont );
00333
for ( uint c2 = 1; c2 < list.count(); ++c2 ) {
00334
00335
if ( fake ) {
00336 rect = painter->boundingRect ( limits[ counter ].left() + Ruler1,
00337 limits[ counter ].top() + heights[ counter ]
00338 + Offset, limits[ counter ].width() - Ruler1,
00339 limits[ counter ].height(), Qt::AlignTop | Qt::AlignLeft,
00340 *list.at( c2 ) );
00341 }
else {
00342 painter->drawText( limits[ counter ].left() + Ruler1, limits[ counter ].top()
00343 + heights[ counter ] + Offset, limits[ counter ].width()
00344 - Ruler1, limits[ counter ].height(), Qt::AlignTop | Qt::AlignLeft,
00345 *list.at( c2 ), -1, &rect );
00346 }
00347 (*rpos)->push_back( rect );
00348 heights[ counter ] += rect.height();
00349 }
00350
00351 ++pos;
00352 ++rpos;
00353 }
00354
00355 y = y + QMAX( heights[ 0 ], heights[ 1 ] ) + QMAX( heights[ 2 ], heights[ 3 ] );
00356
00357
00358
00359 KABC::Address::List addresses = addr.addresses();
00360
if ( addresses.count() > 0 && mShowAddresses ) {
00361 y += fmBody.lineSpacing() / 2;
00362 painter->setFont( mHeadLineFont );
00363
if ( fake ) {
00364 rect = painter->boundingRect( 0, y, Width, Height, Qt::AlignTop | Qt::AlignLeft,
00365 addresses.count() == 1 ? i18n(
"Address:" )
00366 : i18n(
"Addresses:" ) );
00367 }
else {
00368 painter->drawText( 0, y, Width, Height, Qt::AlignTop | Qt::AlignLeft,
00369 addresses.count() == 1 ? i18n(
"Address:" )
00370 : i18n(
"Addresses:" ), -1, &rect );
00371 }
00372
00373 y += rect.height();
00374 y += fmBody.lineSpacing() / 4;
00375 painter->setFont( mBodyFont );
00376
00377 KABC::Address::List::iterator it;
00378
for ( it = addresses.begin(); it != addresses.end(); ++it ) {
00379 address = *it;
00380
switch ( address.type() ) {
00381
case KABC::Address::Dom:
00382 line1 = i18n(
"Domestic Address" );
00383
break;
00384
case KABC::Address::Intl:
00385 line1 = i18n(
"International Address" );
00386
break;
00387
case KABC::Address::Postal:
00388 line1 = i18n(
"Postal Address" );
00389
break;
00390
case KABC::Address::Parcel:
00391 line1 = i18n(
"Parcel Address" );
00392
break;
00393
case KABC::Address::Home:
00394 line1 = i18n(
"Home Address" );
00395
break;
00396
case KABC::Address::Work:
00397 line1 = i18n(
"Work Address" );
00398
break;
00399
case KABC::Address::Pref:
00400
default:
00401 line1 = i18n(
"Preferred Address" );
00402 }
00403
00404 line1 += QString::fromLatin1(
":" );
00405 text = QString::null;
00406
00407
if ( !address.extended().isEmpty() )
00408 text = address.extended().stripWhiteSpace();
00409
00410
if ( !text.isEmpty() ) {
00411 line1 = line1 + QString::fromLatin1(
" (" ) + text +
00412 QString::fromLatin1(
")" );
00413 }
00414
00415 line1 = line1.stripWhiteSpace();
00416 line2 = address.street();
00417
if ( !address.postOfficeBox().isEmpty() )
00418 line2 += QString::fromLatin1(
" - " ) + address.postOfficeBox();
00419
00420
00421 line3 = address.locality() + ( address.region().isEmpty() ?
00422 QString::fromLatin1(
"" ) :
QString::fromLatin1(
", " ) +
00423 address.region() ) + ( address.postalCode().isEmpty()
00424 ?
QString::fromLatin1(
"" ) :
QString::fromLatin1(
" " )
00425 + address.postalCode() );
00426 line4 = address.country();
00427
00428
if ( fake ) {
00429 rect = painter->boundingRect( Ruler1, y, Width - Ruler1, Height,
00430 Qt::AlignTop | Qt::AlignLeft, line1 );
00431 }
else {
00432 painter->drawText( Ruler1, y, Width - Ruler1, Height,
00433 Qt::AlignTop | Qt::AlignLeft, line1, -1, &rect );
00434 }
00435
00436 y += rect.height();
00437
if ( !line2.isEmpty() ) {
00438
if ( fake ) {
00439 rect = painter->boundingRect( Ruler2, y, Width - Ruler2, Height,
00440 Qt::AlignTop | Qt::AlignLeft, line2 );
00441 }
else {
00442 painter->drawText( Ruler2, y, Width - Ruler2, Height,
00443 Qt::AlignTop | Qt::AlignLeft, line2, -1, &rect );
00444 }
00445 y += rect.height();
00446 }
00447
00448
if ( !line3.isEmpty() ) {
00449
if ( fake ) {
00450 rect = painter->boundingRect( Ruler2, y, Width - Ruler2, Height,
00451 Qt::AlignTop | Qt::AlignLeft, line3 );
00452 }
else {
00453 painter->drawText( Ruler2, y, Width - Ruler2, Height,
00454 Qt::AlignTop | Qt::AlignLeft, line3, -1, &rect );
00455 }
00456 y += rect.height();
00457 }
00458
00459
if ( !line4.isEmpty() ) {
00460
if ( fake ) {
00461 rect = painter->boundingRect( Ruler2, y, Width - Ruler2, Height,
00462 Qt::AlignTop | Qt::AlignLeft, line4 );
00463 }
else {
00464 painter->drawText( Ruler2, y, Width - Ruler2, Height,
00465 Qt::AlignTop | Qt::AlignLeft, line4, -1, &rect );
00466 }
00467 y += rect.height();
00468 }
00469
00470 y += fmBody.lineSpacing() / 4;
00471
if ( !address.label().isEmpty() ) {
00472
if ( fake ) {
00473 rect = painter->boundingRect( Ruler2, y, Width - Ruler2, Height,
00474 Qt::AlignTop | Qt::AlignLeft,
00475 i18n(
"(Deliver to:)" ) );
00476 }
else {
00477 painter->drawText( Ruler2, y, Width - Ruler2, Height,
00478 Qt::AlignTop | Qt::AlignLeft,
00479 i18n(
"(Deliver to:)" ), -1, &rect );
00480 }
00481
00482 y += rect.height();
00483 y += fmBody.lineSpacing() / 4;
00484
if ( fake ) {
00485 rect = painter->boundingRect( Ruler3, y, Width - Ruler3, Height,
00486 Qt::AlignTop | Qt::AlignLeft, address.label() );
00487 }
else {
00488 painter->drawText( Ruler3, y, Width - Ruler3, Height,
00489 Qt::AlignTop | Qt::AlignLeft, address.label(), -1, &rect );
00490 }
00491
00492 y += rect.height();
00493 y += fmBody.lineSpacing() / 2;
00494 }
00495 }
00496 }
00497
00498
if ( !addr.note().isEmpty() ) {
00499 painter->setFont( mCommentFont );
00500 y += fmBody.lineSpacing() / 2;
00501
if ( fake ) {
00502 rect = painter->boundingRect( 0, y, Width, Height,
00503 Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak,
00504 addr.note() );
00505 }
else {
00506 painter->drawText( 0, y, Width, Height,
00507 Qt::AlignTop | Qt::AlignLeft | Qt::WordBreak,
00508 addr.note(), -1, &rect );
00509 }
00510
00511 y += rect.height();
00512 }
00513
00514 y += fmBody.lineSpacing() / 2;
00515
00516
if ( brect != 0 )
00517 *brect =
QRect( 0, top, Width, y - top );
00518
00519
if ( y < Height )
00520
return true;
00521
else
00522
return false;
00523 }