summaryrefslogtreecommitdiffstats
path: root/korn/boxcontaineritem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'korn/boxcontaineritem.cpp')
-rw-r--r--korn/boxcontaineritem.cpp443
1 files changed, 443 insertions, 0 deletions
diff --git a/korn/boxcontaineritem.cpp b/korn/boxcontaineritem.cpp
new file mode 100644
index 00000000..fec7ab41
--- /dev/null
+++ b/korn/boxcontaineritem.cpp
@@ -0,0 +1,443 @@
+/*
+ * Copyright (C) 2004, Mart Kelder (mart.kde@hccnet.nl)
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "boxcontaineritem.h"
+
+#include "mailsubject.h"
+
+#include <kaboutapplication.h>
+#include <kactioncollection.h>
+#include <kapplication.h>
+#include <kbugreport.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconeffect.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpassivepopup.h>
+#include <kpopupmenu.h>
+#include <kprocess.h>
+#include <kshortcut.h>
+
+#include <qbitmap.h>
+#include <qcolor.h>
+#include <qfont.h>
+#include <qgrid.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+
+BoxContainerItem::BoxContainerItem( QObject * parent, const char * name )
+ : AccountManager( parent, name ),
+ DCOPObject(),
+ _command( new QString )
+{
+ short i;
+
+ for( i = 0; i < 2; ++i )
+ {
+ _icons[ i ] = 0;
+ _anims[ i ] = 0;
+ _fgColour[ i ] = 0;
+ _bgColour[ i ] = 0;
+ _fonts[ i ] = 0;
+ }
+
+ for( i = 0; i < 3; ++i )
+ {
+ _recheckSettings[ i ] = false;
+ _resetSettings[ i ] = false;
+ _viewSettings[ i ] = false;
+ _runSettings[ i ] = false;
+ _popupSettings[ i ] = false;
+ }
+}
+
+BoxContainerItem::~BoxContainerItem()
+{
+ delete _command;
+}
+
+void BoxContainerItem::readConfig( KConfig* config, const int index )
+{
+ //Read information about how the thing have to look like
+ config->setGroup( QString( "korn-%1" ).arg( index ) );
+ if( config->readBoolEntry( "hasnormalicon", false ) )
+ _icons[ 0 ] = new QString( config->readEntry( "normalicon", "" ) );
+ else
+ _icons[ 0 ] = 0;
+ if( config->readBoolEntry( "hasnewicon", false ) )
+ _icons[ 1 ] = new QString( config->readEntry( "newicon", "" ) );
+ else
+ _icons[ 1 ] = 0;
+
+ if( config->readBoolEntry( "hasnormalanim", false ) )
+ _anims[ 0 ] = new QString( config->readEntry( "normalanim", "" ) );
+ else
+ _anims[ 0 ] = 0;
+ if( config->readBoolEntry( "hasnewanim", false ) )
+ _anims[ 1 ] = new QString( config->readEntry( "newanim", "" ) );
+ else
+ _anims[ 1 ] = 0;
+
+ if( config->readBoolEntry( "hasnormalfgcolour", false ) )
+ _fgColour[ 0 ] = new QColor( config->readColorEntry( "normalfgcolour" ) );
+ else
+ _fgColour[ 0 ] = 0;
+ if( config->readBoolEntry( "hasnewfgcolour", false ) )
+ _fgColour[ 1 ] = new QColor( config->readColorEntry( "newfgcolour" ) );
+ else
+ _fgColour[ 1 ] = 0;
+
+ if( config->readBoolEntry( "hasnormalbgcolour", false ) )
+ _bgColour[ 0 ] = new QColor( config->readColorEntry( "normalbgcolour" ) );
+ else
+ _bgColour[ 0 ] = 0;
+ if( config->readBoolEntry( "hasnewbgcolour", false ) )
+ _bgColour[ 1 ] = new QColor( config->readColorEntry( "newbgcolour" ) );
+ else
+ _bgColour[ 1 ] = 0;
+ if( config->readBoolEntry( "hasnormalfont", false ) )
+ _fonts[ 0 ] = new QFont( config->readFontEntry( "normalfont" ) );
+ else
+ _fonts[ 0 ] = 0;
+ if( config->readBoolEntry( "hasnewfont", false ) )
+ _fonts[ 1 ] = new QFont( config->readFontEntry( "newfont" ) );
+ else
+ _fonts[ 1 ] = 0;
+
+ //Read information about the mappings.
+ _recheckSettings[ 0 ] = config->readBoolEntry( "leftrecheck", true );
+ _recheckSettings[ 1 ] = config->readBoolEntry( "middlerecheck", false );
+ _recheckSettings[ 2 ] = config->readBoolEntry( "rightrecheck", false );
+
+ _resetSettings[ 0 ] = config->readBoolEntry( "leftreset", false );
+ _resetSettings[ 1 ] = config->readBoolEntry( "middlereset", false );
+ _resetSettings[ 2 ] = config->readBoolEntry( "rightreset", false );
+
+ _viewSettings[ 0 ] = config->readBoolEntry( "leftview", false );
+ _viewSettings[ 1 ] = config->readBoolEntry( "middleview", false );
+ _viewSettings[ 2 ] = config->readBoolEntry( "rightview", false );
+
+ _runSettings[ 0 ] = config->readBoolEntry( "leftrun", false );
+ _runSettings[ 1 ] = config->readBoolEntry( "middlerun", false );
+ _runSettings[ 2 ] = config->readBoolEntry( "rightrun", false );
+
+ _popupSettings[ 0 ] = config->readBoolEntry( "leftpopup", false );
+ _popupSettings[ 1 ] = config->readBoolEntry( "middlepopup", false );
+ _popupSettings[ 2 ] = config->readBoolEntry( "rightpopup", true );
+
+ //Read the command
+ *_command = config->readEntry( "command", "" );
+
+ //Sets the object ID for the DCOP-object
+ this->setObjId( config->readEntry( "name", "" ).utf8() );
+
+ //Read the settings of the reimplemented class.
+ //It is important to read this after the box-settings, because the
+ //setCount-function is called in AccountManager::readConfig
+ AccountManager::readConfig( config, index );
+}
+
+void BoxContainerItem::runCommand( const QString& cmd )
+{
+ KProcess *process = new KProcess;
+ process->setUseShell( true );
+ *process << cmd;
+ connect( process, SIGNAL( processExited (KProcess *) ), this, SLOT( processExited( KProcess * ) ) );
+ process->start();
+}
+
+void BoxContainerItem::mouseButtonPressed( Qt::ButtonState state )
+{
+ int button;
+ if( state & Qt::LeftButton )
+ button = 0;
+ else if( state & Qt::RightButton )
+ button = 2;
+ else if( state & Qt::MidButton )
+ button = 1;
+ else
+ return; //Invalid mouse button
+
+ if( _recheckSettings[ button ] )
+ doRecheck();
+ if( _resetSettings[ button ] )
+ doReset();
+ if( _viewSettings[ button ] )
+ doView();
+ if( _runSettings[ button ] )
+ runCommand();
+ if( _popupSettings[ button ] )
+ doPopup();
+}
+
+void BoxContainerItem::fillKPopupMenu( KPopupMenu* popupMenu, KActionCollection* actions ) const
+{
+ /*popupMenu->insertItem( i18n( "&Configure" ), this, SLOT( slotConfigure() ) );
+ popupMenu->insertItem( i18n( "&Recheck" ), this, SLOT( slotRecheck() ) );
+ popupMenu->insertItem( i18n( "R&eset Counter" ), this, SLOT( slotReset() ) );
+ popupMenu->insertItem( i18n( "&View Emails" ), this, SLOT( slotView() ) );
+ popupMenu->insertItem( i18n( "R&un Command" ), this, SLOT( slotRunCommand() ) );*/
+
+ (new KAction( i18n("&Configure"), KShortcut(), this, SLOT( slotConfigure() ), actions ))->plug( popupMenu );
+ (new KAction( i18n("&Recheck"), KShortcut(), this, SLOT( slotRecheck() ), actions ))->plug( popupMenu );
+ (new KAction( i18n("R&eset Counter"), KShortcut(), this, SLOT( slotReset() ), actions ))->plug( popupMenu );
+ (new KAction( i18n("&View Emails"), KShortcut(), this, SLOT( slotView() ), actions ))->plug( popupMenu );
+ (new KAction( i18n("R&un Command"), KShortcut(), this, SLOT( slotRunCommand() ), actions ))->plug( popupMenu );
+ popupMenu->insertSeparator();
+ KStdAction::help( this, SLOT( help() ), actions )->plug( popupMenu );
+ KStdAction::reportBug( this, SLOT( reportBug() ), actions )->plug( popupMenu );
+ KStdAction::aboutApp( this, SLOT( about() ), actions )->plug( popupMenu );
+}
+
+void BoxContainerItem::showPassivePopup( QWidget* parent, QPtrList< KornMailSubject >* list, int total,
+ const QString &accountName, bool date )
+{
+ KPassivePopup *popup = new KPassivePopup( parent, "Passive popup" );
+
+ QVBox *mainvlayout = popup->standardView( i18n( "KOrn - %1/%2 (total: %3)" ).arg( objId() ).arg( accountName )
+ .arg( total ), "", QPixmap(), 0 );
+ QGrid *mainglayout = new QGrid( date ? 3 : 2 ,mainvlayout, "Grid-Layout" );
+
+ QLabel *title = new QLabel( i18n("From"), mainglayout, "from_label" );
+ QFont font = title->font();
+ font.setBold( true );
+ title->setFont( font );
+
+ title = new QLabel( i18n("Subject"), mainglayout, "subject_label" );
+ font = title->font();
+ font.setBold( true );
+ title->setFont( font );
+
+ if( date )
+ {
+ title = new QLabel( i18n("Date"), mainglayout, "date_label" );
+ font = title->font();
+ font.setBold( true );
+ title->setFont( font );
+ }
+
+ for( KornMailSubject* subject = list->first(); subject; subject = list->next() )
+ {
+ new QLabel( subject->getSender(), mainglayout, "from-value" );
+ new QLabel( subject->getSubject(), mainglayout, "subject-value" );
+ if( date )
+ {
+ QDateTime tijd;
+ tijd.setTime_t( subject->getDate() );
+ new QLabel( tijd.toString(), mainglayout, "date-value" );
+ }
+ }
+
+ popup->setAutoDelete( true ); //Now, now care for deleting these pointers.
+
+ popup->setView( mainvlayout );
+
+ popup->show(); //Display it
+}
+
+void BoxContainerItem::drawLabel( QLabel *label, const int count, const bool newMessages )
+{
+ //This would fail if bool have fome other values.
+ short index = newMessages ? 1 : 0;
+
+ bool hasAnim = _anims[ index ] && !_anims[ index ]->isEmpty();
+ bool hasIcon = _icons[ index ] && !_icons[ index ]->isEmpty();
+ bool hasBg = _bgColour[ index ] && _bgColour[ index ]->isValid();
+ bool hasFg = _fgColour[ index ] && _fgColour[ index ]->isValid();
+
+ QPixmap pixmap;
+
+ label->setText( "" );
+ //QToolTip::add( label, this->getTooltip() );
+
+ if( hasAnim )
+ { //An animation can't have a foreground-colour and can't have a icon.
+ setAnimIcon( label, *_anims[ index ] );
+
+ hasFg = false;
+ hasIcon = false;
+ }
+
+ if( hasIcon )
+ pixmap = KGlobal::iconLoader()->loadIcon( *_icons[ index ], KIcon::Desktop, KIcon::SizeSmallMedium );
+
+ if( hasIcon && hasFg )
+ {
+ if( hasBg )
+ {
+ label->setPixmap( calcComplexPixmap( pixmap, *_fgColour[ index ], _fonts[ index ], count ) );
+ label->setBackgroundMode( Qt::FixedColor );
+ label->setPaletteBackgroundColor( *_bgColour[ index ] );
+ } else
+ {
+ label->setPixmap( calcComplexPixmap( pixmap, *_fgColour[ index ], _fonts[ index ], count ) );
+ }
+ return;
+ }
+
+ if( hasBg )
+ {
+ label->setBackgroundMode( Qt::FixedColor );
+ label->setPaletteBackgroundColor( *_bgColour[ index ] );
+ } else
+ {
+ label->setBackgroundMode( Qt::X11ParentRelative );
+ }
+
+ if( hasIcon )
+ {
+ label->setPixmap( pixmap );
+ }
+
+ if( hasFg )
+ {
+ if( _fonts[ index ] )
+ label->setFont( *_fonts[ index ] );
+ label->setPaletteForegroundColor( *_fgColour[ index ] );
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ label->setText( QString::number( count ) );
+ }
+
+ if( hasFg || hasBg || hasIcon || hasAnim )
+ label->show();
+ else
+ label->hide();
+}
+
+//This function makes a pixmap which is based on icon, but has a number painted on it.
+QPixmap BoxContainerItem::calcComplexPixmap( const QPixmap &icon, const QColor& fgColour, const QFont* font, const int count )
+{
+ QPixmap result( icon );
+ QPixmap numberPixmap( icon.size() );
+ QImage iconImage( icon.convertToImage() );
+ QImage numberImage;
+ QRgb *rgbline;
+ QPainter p;
+
+ //Make a transparent number; first make a white number on a black background.
+ //This pixmap also is the base alpha-channel, the foreground colour is added later.
+ numberPixmap.fill( Qt::black );
+ p.begin( &numberPixmap, false );
+ p.setPen( Qt::white );
+ if( font )
+ p.setFont( *font );
+ p.drawText( icon.rect(), Qt::AlignCenter, QString::number( count ) );
+ p.end();
+
+ //Convert to image and add the alpha channel.
+ numberImage = numberPixmap.convertToImage();
+ if( numberImage.depth() != 32 ) //Make sure depth is 32 (and thus can have an alpha channel)
+ numberImage = numberImage.convertDepth( 32 );
+ numberImage.setAlphaBuffer( true ); //Enable alpha channel
+ for( int xx = 0; xx < numberImage.height(); ++xx )
+ {
+ rgbline = (QRgb*)numberImage.scanLine( xx );
+
+ for( int yy = 0; yy < numberImage.width(); ++yy )
+ {
+ //Set colour and alpha channel
+ rgbline[ yy ] = qRgba( fgColour.red(), fgColour.green(), fgColour.blue(), qRed( rgbline[ yy ] ) );
+ }
+ }
+
+ //Merge icon and number and convert to result.
+ KIconEffect::overlay( iconImage, numberImage );
+ result.convertFromImage( iconImage );
+
+ return result;
+}
+
+void BoxContainerItem::setAnimIcon( QLabel* label, const QString& anim )
+{
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ label->setMovie( QMovie( anim ) );
+ label->show();
+}
+
+void BoxContainerItem::recheck()
+{
+ doRecheck();
+}
+
+void BoxContainerItem::reset()
+{
+ doReset();
+}
+
+void BoxContainerItem::view()
+{
+ doView();
+}
+
+void BoxContainerItem::runCommand()//Possible_unsafe?
+{
+ if( _command->isEmpty() )
+ return; //Don't execute an empty command
+ runCommand( *_command );
+}
+
+void BoxContainerItem::help()
+{
+ kapp->invokeHelp();
+}
+
+void BoxContainerItem::reportBug()
+{
+ KBugReport bug( 0, true );
+ bug.exec(); //modal: it doesn't recheck anymore
+}
+
+void BoxContainerItem::about()
+{
+ KAboutApplication about( 0, "KOrn About", true );
+ about.exec(); //modal: it doesn't recheck anymore
+}
+
+void BoxContainerItem::popup()
+{
+ doPopup();
+}
+
+void BoxContainerItem::showConfig()
+{
+ emit showConfiguration();
+}
+
+void BoxContainerItem::startTimer()
+{
+ doStartTimer();
+}
+
+void BoxContainerItem::stopTimer()
+{
+ doStopTimer();
+}
+
+void BoxContainerItem::processExited( KProcess* proc )
+{
+ delete proc;
+}
+
+#include "boxcontaineritem.moc"