kaddressbook Library API Documentation

look_details.cpp

00001 /* 00002 This file is part of KAddressBook. 00003 Copyright (c) 1996-2002 Mirko Boehm <mirko@kde.org> 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 00019 As a special exception, permission is given to link this program 00020 with any edition of Qt, and distribute the resulting executable, 00021 without including the source code for Qt in the source distribution. 00022 */ 00023 00024 #include <kconfig.h> 00025 #include <kdebug.h> 00026 #include <kglobalsettings.h> 00027 #include <kinstance.h> 00028 #include <klocale.h> 00029 #include <kstandarddirs.h> 00030 00031 #include <qcursor.h> 00032 #include <qdir.h> 00033 #include <qpainter.h> 00034 #include <qpopupmenu.h> 00035 00036 #include "global.h" 00037 #include "kabentrypainter.h" 00038 00039 #include "look_details.h" 00040 00041 #define GRID 5 00042 00043 const QString KABDetailedView::mBorderedBGDir = "kab3part/backgrounds/bordered/"; 00044 const QString KABDetailedView::mTiledBGDir = "kab3part/backgrounds/tiled/"; 00045 00046 KABDetailedView::KABDetailedView( QWidget *parent, const char *name ) 00047 : KABBasicLook( parent, name ), mPainter( 0 ), mBackgroundStyle( None ), 00048 mDefaultBGColor( white ), mHeadLineBGColor( darkBlue ), 00049 mHeadLineTextColor( yellow ), mGrid( 3 ), mMenuBorderedBG( 0 ), 00050 mMenuTiledBG( 0 ) 00051 { 00052 KToggleAction** actions[] = { 00053 &mActionShowAddresses, 00054 &mActionShowEmails, 00055 &mActionShowPhones, 00056 &mActionShowURLs 00057 }; 00058 00059 QString actionTexts[] = { 00060 i18n( "Show Postal Addresses" ), 00061 i18n( "Show Email Addresses" ), 00062 i18n( "Show Telephone Numbers" ), 00063 i18n( "Show Web Pages (URLs)" ) 00064 }; 00065 00066 QFont general = KGlobalSettings::generalFont(); 00067 QFont fixed = KGlobalSettings::fixedFont(); 00068 QString gfont = general.family(); 00069 QString ffont = fixed.family(); 00070 00071 int gpointsize = general.pixelSize(); 00072 if ( gpointsize == -1 ) 00073 gpointsize = general.pointSize(); 00074 00075 int fpointsize = fixed.pixelSize(); 00076 if ( fpointsize == -1 ) 00077 fpointsize = fixed.pointSize(); 00078 00079 mPainter = new KABEntryPainter; 00080 00081 mPainter->setForegroundColor( black ); 00082 mPainter->setHeaderColor( mHeadLineTextColor ); 00083 mPainter->setUseHeaderColor( mUseHeadLineBGColor ); 00084 mPainter->setBackgroundColor( mHeadLineBGColor ); 00085 00086 mPainter->setHeaderFont( QFont( gfont, gpointsize + 4, QFont::Bold, true ) ); 00087 mPainter->setHeadLineFont( QFont( gfont, gpointsize + 2, QFont::Bold, true ) ); 00088 mPainter->setBodyFont( QFont( gfont, gpointsize, QFont::Normal, false ) ); 00089 mPainter->setFixedFont( QFont( ffont, fpointsize, QFont::Normal, false ) ); 00090 mPainter->setCommentFont( QFont( gfont, gpointsize, QFont::Normal, false ) ); 00091 00092 const int numActions = sizeof( actions ) / sizeof( actions[ 0 ] ); 00093 00094 for ( int count = 0; count < numActions; ++count ) { 00095 *actions[ count ] = new KToggleAction( actionTexts[ count ] ); 00096 (*actions[ count ])->setChecked( true ); 00097 } 00098 00099 setMouseTracking( true ); 00100 00101 setBackgroundMode( NoBackground ); 00102 } 00103 00104 KABDetailedView::~KABDetailedView() 00105 { 00106 delete mPainter; 00107 mPainter = 0; 00108 } 00109 00110 bool KABDetailedView::getBackground( QString path, QPixmap& image ) 00111 { 00112 QMap<QString, QPixmap>::iterator pos; 00113 00114 pos = mBackgroundMap.find( path ); 00115 if ( pos == mBackgroundMap.end() ) { // the image has not been loaded previously 00116 if ( image.load( path ) ) { 00117 mBackgroundMap[ path ] = image; 00118 return true; 00119 } else 00120 return false; 00121 } else { // image found in cache 00122 image = pos.data(); 00123 return true; 00124 } 00125 } 00126 00127 void KABDetailedView::paintEvent( QPaintEvent* ) 00128 { 00129 const int BorderSpace = mGrid; 00130 QPixmap pm( width(), height() ); 00131 QPainter p; 00132 00133 QRect entryArea = QRect( BorderSpace, mGrid, width() - mGrid - BorderSpace, 00134 height() - 2 * mGrid ); 00135 p.begin( &pm ); 00136 00137 p.setPen( darkBlue ); 00138 p.setBrush( mDefaultBGColor ); 00139 p.drawRect( 0, 0, width(), height() ); 00140 switch ( mBackgroundStyle ) { 00141 case Tiled: 00142 p.drawTiledPixmap( 1, 1, width() - 2, height() - 2, mCurrentBackground ); 00143 break; 00144 case Bordered: 00145 p.drawTiledPixmap( 1, 1, QMIN( width() - 2, mCurrentBackground.width() ), 00146 height() - 2, mCurrentBackground ); 00147 break; 00148 case None: // no BG image defined for this entry: 00149 default: 00150 if ( mUseDefaultBGImage ) 00151 p.drawTiledPixmap( 1, 1, width() - 2, height() - 2, mDefaultBGImage ); 00152 break; 00153 }; 00154 00155 p.setViewport( entryArea ); 00156 00157 mPainter->setShowAddresses( mActionShowAddresses->isChecked() ); 00158 mPainter->setShowEmails( mActionShowEmails->isChecked() ); 00159 mPainter->setShowPhones( mActionShowPhones->isChecked() ); 00160 mPainter->setShowURLs( mActionShowURLs->isChecked() ); 00161 mPainter->printAddressee( addressee(), QRect( 0, 0, entryArea.width(), 00162 entryArea.height() ), &p ); 00163 p.end(); 00164 bitBlt( this, 0, 0, &pm ); 00165 } 00166 00167 void KABDetailedView::mouseMoveEvent( QMouseEvent *e ) 00168 { 00169 QPoint bias( mGrid, mGrid ); 00170 int rc; 00171 bool hit = false; 00172 00173 if ( ( rc = mPainter->hitsEmail( e->pos() - bias ) ) != -1 ) 00174 hit = true; 00175 else if ( ( rc = mPainter->hitsURL( e->pos() - bias ) ) != -1 ) 00176 hit = true; 00177 else if ( ( rc = mPainter->hitsPhone( e->pos() - bias ) ) != -1 ) 00178 hit = true; 00179 else if ( ( rc = mPainter->hitsTalk( e->pos() - bias ) ) != -1 ) 00180 hit = true; 00181 00182 if ( hit ) { 00183 if ( cursor().shape() != PointingHandCursor ) 00184 setCursor( PointingHandCursor ); 00185 else if( cursor().shape() != ArrowCursor ) 00186 setCursor(ArrowCursor); 00187 } 00188 } 00189 00190 void KABDetailedView::mousePressEvent( QMouseEvent *e ) 00191 { 00192 QPopupMenu menu( this ); 00193 QPopupMenu *menuBG = new QPopupMenu( &menu ); 00194 mMenuBorderedBG = new QPopupMenu( &menu ); 00195 mMenuTiledBG = new QPopupMenu( &menu ); 00196 00197 menu.insertItem( i18n( "Select Background" ), menuBG ); 00198 menuBG->insertItem( i18n( "Bordered Backgrounds" ), mMenuBorderedBG ); 00199 menuBG->insertItem( i18n( "Tiled Backgrounds" ), mMenuTiledBG ); 00200 menu.insertSeparator(); 00201 00202 QPoint point = e->pos() - QPoint( mGrid, mGrid ); 00203 int rc; 00204 QStringList dirsBorderedBG, dirsTiledBG; 00205 QDir dir; 00206 00207 switch( e->button() ) { 00208 case QMouseEvent::RightButton: 00209 if ( isReadOnly() ) 00210 menu.setItemEnabled( menu.idAt( 0 ), false ); 00211 else { 00212 // TODO: settings need to be saved in view options 00213 dirsBorderedBG = KGlobal::instance()->dirs()->findDirs( "data", mBorderedBGDir ); 00214 if ( dirsBorderedBG.count() > 0 ) { 00215 dir.setPath( dirsBorderedBG[ 0 ] ); 00216 mBorders = dir.entryList( QDir::Files ); 00217 for ( uint count = 0; count < mBorders.count(); ++count ) 00218 mMenuBorderedBG->insertItem( mBorders[ count ], count ); 00219 00220 connect( mMenuBorderedBG, SIGNAL( activated( int ) ), 00221 SLOT( slotBorderedBGSelected( int ) ) ); 00222 } else 00223 menuBG->setItemEnabled( menuBG->idAt( 0 ), false ); 00224 00225 dirsTiledBG = KGlobal::instance()->dirs()->findDirs( "data", mTiledBGDir ); 00226 if ( dirsTiledBG.count() > 0 ) { 00227 dir.setPath( dirsTiledBG[ 0 ] ); 00228 mTiles = dir.entryList( QDir::Files ); 00229 for ( uint count = 0; count < mTiles.count(); ++count ) 00230 mMenuTiledBG->insertItem( mTiles[ count ], count ); 00231 00232 connect( mMenuTiledBG, SIGNAL( activated( int ) ), 00233 SLOT( slotTiledBGSelected( int ) ) ); 00234 } else 00235 menuBG->setItemEnabled( menuBG->idAt( 1 ), false ); 00236 } 00237 00238 mActionShowAddresses->plug( &menu ); 00239 mActionShowEmails->plug( &menu ); 00240 mActionShowPhones->plug( &menu ); 00241 mActionShowURLs->plug( &menu ); 00242 00243 menu.exec( e->globalPos() ); 00244 break; 00245 00246 case QMouseEvent::LeftButton: 00247 // find whether the pointer touches an email address, URL, 00248 // talk address or telephone number: 00249 if ( ( rc = mPainter->hitsEmail( point ) ) != -1 ) { 00250 emit sendEmail( addressee().emails()[ rc ] ); 00251 break; 00252 } 00253 if ( ( rc = mPainter->hitsURL( point ) ) != -1 ) { 00254 emit browse( addressee().url().prettyURL() ); 00255 break; 00256 } 00257 if ( ( rc = mPainter->hitsPhone( point ) ) != -1 ) { 00258 // not implemented yet 00259 break; 00260 } 00261 if ( ( rc = mPainter->hitsTalk( point ) ) != -1 ) { 00262 // not implemented yet 00263 break; 00264 } 00265 break; 00266 default: 00267 break; 00268 } 00269 00270 mMenuBorderedBG = 0; 00271 mMenuTiledBG = 0; 00272 } 00273 00274 void KABDetailedView::setAddressee( const KABC::Addressee &addr ) 00275 { 00276 BackgroundStyle style = None; 00277 QString dir, file, styleSetting; 00278 KABBasicLook::setAddressee( addr ); 00279 00280 // TODO: preload path and styleSetting with possible preference values 00281 styleSetting = addressee().custom( "kab", "BackgroundStyle" ); 00282 style = (BackgroundStyle)styleSetting.toInt(); 00283 file = addressee().custom( "kab", "BackgroundImage" ); 00284 if ( !file.isEmpty() ) { 00285 switch ( style ) { 00286 case Tiled: 00287 dir = mTiledBGDir; 00288 break; 00289 case Bordered: 00290 dir = mBorderedBGDir; 00291 break; 00292 case None: 00293 default: 00294 break; 00295 } 00296 00297 QStringList dirs = KGlobal::instance()->dirs()->findDirs( "data", dir ); 00298 mBackgroundStyle = None; 00299 if ( !dirs.isEmpty() ) { 00300 uint count = 0; 00301 for ( ; count < dirs.count(); ++count ) { 00302 QDir folder; 00303 folder.setPath( dirs[ count ] ); 00304 file = folder.absPath() + "/" + file; 00305 if ( getBackground( file, mCurrentBackground ) ) { 00306 mBackgroundStyle = style; 00307 break; 00308 } 00309 } 00310 00311 if ( count == dirs.count() ) { 00312 kdDebug(5720) << "KABDetailedView::setEntry: " << file 00313 << " not locatable." << endl; 00314 } 00315 } 00316 } else { // no background here 00317 mBackgroundStyle = None; 00318 mCurrentBackground.resize( 0, 0 ); 00319 } 00320 00321 repaint( false ); 00322 } 00323 00324 void KABDetailedView::slotBorderedBGSelected( int index ) 00325 { 00326 if ( index >= 0 && (uint)index < mBorders.count() && !isReadOnly() ) { 00327 // get the selection and make it a full path 00328 QString path = mBorders[ index ]; 00329 mBackgroundStyle = Bordered; 00330 addressee().insertCustom( "kab", "BackgroundStyle", 00331 QString().setNum( mBackgroundStyle ) ); 00332 addressee().insertCustom( "kab", "BackgroundImage", path ); 00333 setAddressee( addressee() ); 00334 } 00335 } 00336 00337 void KABDetailedView::slotTiledBGSelected( int index ) 00338 { 00339 if ( index >= 0 && (uint)index < mTiles.count() && !isReadOnly() ) { 00340 QString path = mTiles[ index ]; 00341 mBackgroundStyle = Tiled; 00342 addressee().insertCustom( "kab", "BackgroundStyle", 00343 QString().setNum( mBackgroundStyle ) ); 00344 addressee().insertCustom( "kab", "BackgroundImage", path ); 00345 setAddressee( addressee() ); 00346 } 00347 } 00348 00349 void KABDetailedView::setReadOnly( bool state ) 00350 { 00351 KABBasicLook::setReadOnly( state ); 00352 repaint( false ); 00353 } 00354 00355 void KABDetailedView::restoreSettings( KConfig *config ) 00356 { 00357 QFont general = KGlobalSettings::generalFont(); 00358 QFont fixed = KGlobalSettings::fixedFont(); 00359 QString gfont = general.family(); 00360 QString ffont = fixed.family(); 00361 00362 int gpointsize = general.pixelSize(); 00363 if ( gpointsize == -1 ) 00364 gpointsize = general.pointSize(); 00365 00366 int fpointsize = fixed.pixelSize(); 00367 if ( fpointsize == -1 ) 00368 fpointsize = fixed.pointSize(); 00369 00370 config->setGroup( ConfigView ); 00371 00372 // load the default background image: 00373 QString bgImage; 00374 mUseDefaultBGImage = config->readBoolEntry( ConfigView_UseDefaultBackground, true ); 00375 mDefaultBGColor = config->readColorEntry( ConfigView_DefaultBackgroundColor, &white ); 00376 bgImage = config->readEntry( ConfigView_DefaultBackgroundImage, "konqueror/tiles/kenwimer.png" ); 00377 00378 if ( mUseDefaultBGImage ) { 00379 uint count = 0; 00380 QStringList dirs = KGlobal::instance()->dirs()->findDirs( "data", "/" ); 00381 if ( !dirs.isEmpty() ) { 00382 for ( count = 0; count < dirs.count(); ++count ) { 00383 if ( getBackground( dirs[ count ] + "/" + bgImage, mDefaultBGImage ) ) 00384 break; 00385 } 00386 } 00387 00388 if ( count == dirs.count() ) { 00389 mUseDefaultBGImage = getBackground( bgImage, mDefaultBGImage ); 00390 if ( !mUseDefaultBGImage ) 00391 kdDebug(5720) << "KABDetailedView::configure: " 00392 << "default BG image selected, but could not be loaded." 00393 << endl; 00394 } 00395 } 00396 00397 mDefaultBGColor = config->readColorEntry( ConfigView_DefaultBackgroundColor, &white ); 00398 mHeadLineBGColor = config->readColorEntry( ConfigView_HeadlineBGColor, &darkBlue ); 00399 mHeadLineTextColor = config->readColorEntry( ConfigView_HeadlineTextColor, &yellow ); 00400 mUseHeadLineBGColor = config->readBoolEntry( ConfigView_UseHeadlineBGColor, true ); 00401 00402 if ( !mPainter ) 00403 mPainter = new KABEntryPainter; 00404 00405 mPainter->setForegroundColor( black ); 00406 mPainter->setHeaderColor( mHeadLineTextColor ); 00407 mPainter->setUseHeaderColor( mUseHeadLineBGColor ); 00408 mPainter->setBackgroundColor( mHeadLineBGColor ); 00409 00410 mPainter->setHeaderFont( QFont( gfont, gpointsize + 4, QFont::Bold, true ) ); 00411 mPainter->setHeadLineFont( QFont( gfont, gpointsize + 2, QFont::Bold, true ) ); 00412 mPainter->setBodyFont( QFont( gfont, gpointsize, QFont::Normal, false ) ); 00413 mPainter->setFixedFont( QFont( ffont, fpointsize, QFont::Normal, false ) ); 00414 mPainter->setCommentFont( QFont( gfont, gpointsize, QFont::Normal, false ) ); 00415 } 00416 00417 #include "look_details.moc"
KDE Logo
This file is part of the documentation for kaddressbook Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:05 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003