summaryrefslogtreecommitdiffabout
path: root/kaddressbook/details/look_details.cpp
Side-by-side diff
Diffstat (limited to 'kaddressbook/details/look_details.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/details/look_details.cpp419
1 files changed, 419 insertions, 0 deletions
diff --git a/kaddressbook/details/look_details.cpp b/kaddressbook/details/look_details.cpp
new file mode 100644
index 0000000..51ec0c0
--- a/dev/null
+++ b/kaddressbook/details/look_details.cpp
@@ -0,0 +1,419 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 1996-2002 Mirko Boehm <mirko@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobalsettings.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include <qcursor.h>
+#include <qdir.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+
+#include "global.h"
+#include "kabentrypainter.h"
+
+#include "look_details.h"
+
+#define GRID 5
+
+const QString KABDetailedView::mBorderedBGDir = "kab3part/backgrounds/bordered/";
+const QString KABDetailedView::mTiledBGDir = "kab3part/backgrounds/tiled/";
+
+KABDetailedView::KABDetailedView( QWidget *parent, const char *name )
+ : KABBasicLook( parent, name ), mPainter( 0 ), mBackgroundStyle( None ),
+ mDefaultBGColor( white ), mHeadLineBGColor( darkBlue ),
+ mHeadLineTextColor( yellow ), mGrid( 3 ), mMenuBorderedBG( 0 ),
+ mMenuTiledBG( 0 )
+{
+ KToggleAction** actions[] = {
+ &mActionShowAddresses,
+ &mActionShowEmails,
+ &mActionShowPhones,
+ &mActionShowURLs
+ };
+
+ QString actionTexts[] = {
+ i18n( "Show Postal Addresses" ),
+ i18n( "Show Email Addresses" ),
+ i18n( "Show Telephone Numbers" ),
+ i18n( "Show Web Pages (URLs)" )
+ };
+
+ QFont general = KGlobalSettings::generalFont();
+ QFont fixed = KGlobalSettings::fixedFont();
+ QString gfont = general.family();
+ QString ffont = fixed.family();
+
+ int gpointsize = general.pixelSize();
+ if ( gpointsize == -1 )
+ gpointsize = general.pointSize();
+
+ int fpointsize = fixed.pixelSize();
+ if ( fpointsize == -1 )
+ fpointsize = fixed.pointSize();
+
+ mPainter = new KABEntryPainter;
+
+ mPainter->setForegroundColor( black );
+ mPainter->setHeaderColor( mHeadLineTextColor );
+ mPainter->setUseHeaderColor( mUseHeadLineBGColor );
+ mPainter->setBackgroundColor( mHeadLineBGColor );
+
+ mPainter->setHeaderFont( QFont( gfont, gpointsize + 4, QFont::Bold, true ) );
+ mPainter->setHeadLineFont( QFont( gfont, gpointsize + 2, QFont::Bold, true ) );
+ mPainter->setBodyFont( QFont( gfont, gpointsize, QFont::Normal, false ) );
+ mPainter->setFixedFont( QFont( ffont, fpointsize, QFont::Normal, false ) );
+ mPainter->setCommentFont( QFont( gfont, gpointsize, QFont::Normal, false ) );
+
+ const int numActions = sizeof( actions ) / sizeof( actions[ 0 ] );
+
+ for ( int count = 0; count < numActions; ++count ) {
+ *actions[ count ] = new KToggleAction( actionTexts[ count ] );
+ (*actions[ count ])->setChecked( true );
+ }
+
+ setMouseTracking( true );
+
+ setBackgroundMode( NoBackground );
+}
+
+KABDetailedView::~KABDetailedView()
+{
+ delete mPainter;
+ mPainter = 0;
+}
+
+bool KABDetailedView::getBackground( QString path, QPixmap& image )
+{
+ QMap<QString, QPixmap>::iterator pos;
+
+ pos = mBackgroundMap.find( path );
+ if ( pos == mBackgroundMap.end() ) { // the image has not been loaded previously
+ if ( image.load( path ) ) {
+ mBackgroundMap[ path ] = image;
+ return true;
+ } else
+ return false;
+ } else { // image found in cache
+ image = pos.data();
+ return true;
+ }
+}
+
+void KABDetailedView::paintEvent( QPaintEvent* )
+{
+ const int BorderSpace = mGrid;
+ QPixmap pm( width(), height() );
+ QPainter p;
+
+ QRect entryArea = QRect( BorderSpace, mGrid, width() - mGrid - BorderSpace,
+ height() - 2 * mGrid );
+ p.begin( &pm );
+
+ p.setPen( darkBlue );
+ p.setBrush( mDefaultBGColor );
+ p.drawRect( 0, 0, width(), height() );
+ switch ( mBackgroundStyle ) {
+ case Tiled:
+ p.drawTiledPixmap( 1, 1, width() - 2, height() - 2, mCurrentBackground );
+ break;
+ case Bordered:
+ p.drawTiledPixmap( 1, 1, QMIN( width() - 2, mCurrentBackground.width() ),
+ height() - 2, mCurrentBackground );
+ break;
+ case None: // no BG image defined for this entry:
+ default:
+ if ( mUseDefaultBGImage )
+ p.drawTiledPixmap( 1, 1, width() - 2, height() - 2, mDefaultBGImage );
+ break;
+ };
+
+ p.setViewport( entryArea );
+
+ mPainter->setShowAddresses( mActionShowAddresses->isChecked() );
+ mPainter->setShowEmails( mActionShowEmails->isChecked() );
+ mPainter->setShowPhones( mActionShowPhones->isChecked() );
+ mPainter->setShowURLs( mActionShowURLs->isChecked() );
+ mPainter->printAddressee( addressee(), QRect( 0, 0, entryArea.width(),
+ entryArea.height() ), &p );
+ p.end();
+ bitBlt( this, 0, 0, &pm );
+}
+
+void KABDetailedView::mouseMoveEvent( QMouseEvent *e )
+{
+ QPoint bias( mGrid, mGrid );
+ int rc;
+ bool hit = false;
+
+ if ( ( rc = mPainter->hitsEmail( e->pos() - bias ) ) != -1 )
+ hit = true;
+ else if ( ( rc = mPainter->hitsURL( e->pos() - bias ) ) != -1 )
+ hit = true;
+ else if ( ( rc = mPainter->hitsPhone( e->pos() - bias ) ) != -1 )
+ hit = true;
+ else if ( ( rc = mPainter->hitsTalk( e->pos() - bias ) ) != -1 )
+ hit = true;
+
+ if ( hit ) {
+ if ( cursor().shape() != PointingHandCursor )
+ setCursor( PointingHandCursor );
+ else if( cursor().shape() != ArrowCursor )
+ setCursor(ArrowCursor);
+ }
+}
+
+void KABDetailedView::mousePressEvent( QMouseEvent *e )
+{
+ QPopupMenu menu( this );
+ QPopupMenu *menuBG = new QPopupMenu( &menu );
+ mMenuBorderedBG = new QPopupMenu( &menu );
+ mMenuTiledBG = new QPopupMenu( &menu );
+
+ menu.insertItem( i18n( "Select Background" ), menuBG );
+ menuBG->insertItem( i18n( "Bordered Backgrounds" ), mMenuBorderedBG );
+ menuBG->insertItem( i18n( "Tiled Backgrounds" ), mMenuTiledBG );
+ menu.insertSeparator();
+
+ QPoint point = e->pos() - QPoint( mGrid, mGrid );
+ int rc;
+ QStringList dirsBorderedBG, dirsTiledBG;
+ QDir dir;
+
+ switch( e->button() ) {
+ case QMouseEvent::RightButton:
+ if ( isReadOnly() )
+ menu.setItemEnabled( menu.idAt( 0 ), false );
+ else {
+ // TODO: settings need to be saved in view options
+ dirsBorderedBG = KGlobal::instance()->dirs()->findDirs( "data", mBorderedBGDir );
+ if ( dirsBorderedBG.count() > 0 ) {
+ dir.setPath( dirsBorderedBG[ 0 ] );
+ mBorders = dir.entryList( QDir::Files );
+ for ( uint count = 0; count < mBorders.count(); ++count )
+ mMenuBorderedBG->insertItem( mBorders[ count ], count );
+
+ connect( mMenuBorderedBG, SIGNAL( activated( int ) ),
+ SLOT( slotBorderedBGSelected( int ) ) );
+ } else
+ menuBG->setItemEnabled( menuBG->idAt( 0 ), false );
+
+ dirsTiledBG = KGlobal::instance()->dirs()->findDirs( "data", mTiledBGDir );
+ if ( dirsTiledBG.count() > 0 ) {
+ dir.setPath( dirsTiledBG[ 0 ] );
+ mTiles = dir.entryList( QDir::Files );
+ for ( uint count = 0; count < mTiles.count(); ++count )
+ mMenuTiledBG->insertItem( mTiles[ count ], count );
+
+ connect( mMenuTiledBG, SIGNAL( activated( int ) ),
+ SLOT( slotTiledBGSelected( int ) ) );
+ } else
+ menuBG->setItemEnabled( menuBG->idAt( 1 ), false );
+ }
+
+ mActionShowAddresses->plug( &menu );
+ mActionShowEmails->plug( &menu );
+ mActionShowPhones->plug( &menu );
+ mActionShowURLs->plug( &menu );
+
+ menu.exec( e->globalPos() );
+ break;
+
+ case QMouseEvent::LeftButton:
+ // find whether the pointer touches an email address, URL,
+ // talk address or telephone number:
+ if ( ( rc = mPainter->hitsEmail( point ) ) != -1 ) {
+ emit sendEmail( addressee().emails()[ rc ] );
+ break;
+ }
+ if ( ( rc = mPainter->hitsURL( point ) ) != -1 ) {
+ emit browse( addressee().url().prettyURL() );
+ break;
+ }
+ if ( ( rc = mPainter->hitsPhone( point ) ) != -1 ) {
+ // not implemented yet
+ break;
+ }
+ if ( ( rc = mPainter->hitsTalk( point ) ) != -1 ) {
+ // not implemented yet
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ mMenuBorderedBG = 0;
+ mMenuTiledBG = 0;
+}
+
+void KABDetailedView::setAddressee( const KABC::Addressee &addr )
+{
+ BackgroundStyle style = None;
+ QString dir, file, styleSetting;
+ KABBasicLook::setAddressee( addr );
+
+ // TODO: preload path and styleSetting with possible preference values
+ styleSetting = addressee().custom( "kab", "BackgroundStyle" );
+ style = (BackgroundStyle)styleSetting.toInt();
+ file = addressee().custom( "kab", "BackgroundImage" );
+ if ( !file.isEmpty() ) {
+ switch ( style ) {
+ case Tiled:
+ dir = mTiledBGDir;
+ break;
+ case Bordered:
+ dir = mBorderedBGDir;
+ break;
+ case None:
+ default:
+ break;
+ }
+
+ QStringList dirs = KGlobal::instance()->dirs()->findDirs( "data", dir );
+ mBackgroundStyle = None;
+ if ( !dirs.isEmpty() ) {
+ uint count = 0;
+ for ( ; count < dirs.count(); ++count ) {
+ QDir folder;
+ folder.setPath( dirs[ count ] );
+ file = folder.absPath() + "/" + file;
+ if ( getBackground( file, mCurrentBackground ) ) {
+ mBackgroundStyle = style;
+ break;
+ }
+ }
+
+ if ( count == dirs.count() ) {
+ kdDebug(5720) << "KABDetailedView::setEntry: " << file
+ << " not locatable." << endl;
+ }
+ }
+ } else { // no background here
+ mBackgroundStyle = None;
+ mCurrentBackground.resize( 0, 0 );
+ }
+
+ repaint( false );
+}
+
+void KABDetailedView::slotBorderedBGSelected( int index )
+{
+ if ( index >= 0 && (uint)index < mBorders.count() && !isReadOnly() ) {
+ // get the selection and make it a full path
+ QString path = mBorders[ index ];
+ mBackgroundStyle = Bordered;
+ addressee().insertCustom( "kab", "BackgroundStyle",
+ QString().setNum( mBackgroundStyle ) );
+ addressee().insertCustom( "kab", "BackgroundImage", path );
+ setAddressee( addressee() );
+ }
+}
+
+void KABDetailedView::slotTiledBGSelected( int index )
+{
+ if ( index >= 0 && (uint)index < mTiles.count() && !isReadOnly() ) {
+ QString path = mTiles[ index ];
+ mBackgroundStyle = Tiled;
+ addressee().insertCustom( "kab", "BackgroundStyle",
+ QString().setNum( mBackgroundStyle ) );
+ addressee().insertCustom( "kab", "BackgroundImage", path );
+ setAddressee( addressee() );
+ }
+}
+
+void KABDetailedView::setReadOnly( bool state )
+{
+ KABBasicLook::setReadOnly( state );
+ repaint( false );
+}
+
+void KABDetailedView::restoreSettings( KConfig *config )
+{
+ QFont general = KGlobalSettings::generalFont();
+ QFont fixed = KGlobalSettings::fixedFont();
+ QString gfont = general.family();
+ QString ffont = fixed.family();
+
+ int gpointsize = general.pixelSize();
+ if ( gpointsize == -1 )
+ gpointsize = general.pointSize();
+
+ int fpointsize = fixed.pixelSize();
+ if ( fpointsize == -1 )
+ fpointsize = fixed.pointSize();
+
+ config->setGroup( ConfigView );
+
+ // load the default background image:
+ QString bgImage;
+ mUseDefaultBGImage = config->readBoolEntry( ConfigView_UseDefaultBackground, true );
+ mDefaultBGColor = config->readColorEntry( ConfigView_DefaultBackgroundColor, &white );
+ bgImage = config->readEntry( ConfigView_DefaultBackgroundImage, "konqueror/tiles/kenwimer.png" );
+
+ if ( mUseDefaultBGImage ) {
+ uint count = 0;
+ QStringList dirs = KGlobal::instance()->dirs()->findDirs( "data", "/" );
+ if ( !dirs.isEmpty() ) {
+ for ( count = 0; count < dirs.count(); ++count ) {
+ if ( getBackground( dirs[ count ] + "/" + bgImage, mDefaultBGImage ) )
+ break;
+ }
+ }
+
+ if ( count == dirs.count() ) {
+ mUseDefaultBGImage = getBackground( bgImage, mDefaultBGImage );
+ if ( !mUseDefaultBGImage )
+ kdDebug(5720) << "KABDetailedView::configure: "
+ << "default BG image selected, but could not be loaded."
+ << endl;
+ }
+ }
+
+ mDefaultBGColor = config->readColorEntry( ConfigView_DefaultBackgroundColor, &white );
+ mHeadLineBGColor = config->readColorEntry( ConfigView_HeadlineBGColor, &darkBlue );
+ mHeadLineTextColor = config->readColorEntry( ConfigView_HeadlineTextColor, &yellow );
+ mUseHeadLineBGColor = config->readBoolEntry( ConfigView_UseHeadlineBGColor, true );
+
+ if ( !mPainter )
+ mPainter = new KABEntryPainter;
+
+ mPainter->setForegroundColor( black );
+ mPainter->setHeaderColor( mHeadLineTextColor );
+ mPainter->setUseHeaderColor( mUseHeadLineBGColor );
+ mPainter->setBackgroundColor( mHeadLineBGColor );
+
+ mPainter->setHeaderFont( QFont( gfont, gpointsize + 4, QFont::Bold, true ) );
+ mPainter->setHeadLineFont( QFont( gfont, gpointsize + 2, QFont::Bold, true ) );
+ mPainter->setBodyFont( QFont( gfont, gpointsize, QFont::Normal, false ) );
+ mPainter->setFixedFont( QFont( ffont, fpointsize, QFont::Normal, false ) );
+ mPainter->setCommentFont( QFont( gfont, gpointsize, QFont::Normal, false ) );
+}
+
+#ifndef KAB_EMBEDDED
+#include "look_details.moc"
+#endif //KAB_EMBEDDED