summaryrefslogtreecommitdiffstats
path: root/kmail/xfaceconfigurator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/xfaceconfigurator.cpp')
-rw-r--r--kmail/xfaceconfigurator.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/kmail/xfaceconfigurator.cpp b/kmail/xfaceconfigurator.cpp
new file mode 100644
index 000000000..ba91efaa4
--- /dev/null
+++ b/kmail/xfaceconfigurator.cpp
@@ -0,0 +1,285 @@
+/*
+ This file is part of KMail.
+
+ Copyright (c) 2004 Jakob Schr�er <js@camaya.net>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "xfaceconfigurator.h"
+
+#include <kactivelabel.h>
+#include <kdialog.h>
+#include <kfiledialog.h>
+#include <kglobalsettings.h>
+#include <kimageio.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+using namespace KIO;
+#include <kxface.h>
+using namespace KPIM;
+#include <kabc/stdaddressbook.h>
+#include <kabc/addressee.h>
+using namespace KABC;
+
+#include <qbitmap.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+#include <qwidgetstack.h>
+
+
+// #include <assert.h>
+
+using namespace KMail;
+using namespace KPIM;
+
+namespace KMail {
+
+ XFaceConfigurator::XFaceConfigurator( QWidget * parent, const char * name )
+ : QWidget( parent, name )
+ {
+ // tmp. vars:
+ QLabel * label;
+ QLabel * label1;
+ KActiveLabel * label2;
+ QWidget * page;
+ QVBoxLayout * vlay;
+ QHBoxLayout * hlay;
+ QVBoxLayout * page_vlay;
+ QPushButton * mFromFileBtn;
+ QPushButton * mFromAddrbkBtn;
+
+ vlay = new QVBoxLayout( this, 0, KDialog::spacingHint(), "main layout" );
+ hlay = new QHBoxLayout( vlay );
+
+ // "enable X-Face" checkbox:
+ mEnableCheck = new QCheckBox( i18n("&Send picture with every message"), this );
+ QWhatsThis::add( mEnableCheck,
+ i18n( "Check this box if you want KMail to add a so-called X-Face header to messages "
+ "written with this identity. An X-Face is a small (48x48 pixels) black and "
+ "white image that some mail clients are able to display." ) );
+ hlay->addWidget( mEnableCheck, Qt::AlignLeft | Qt::AlignVCenter );
+
+ mXFaceLabel = new QLabel( this );
+ QWhatsThis::add(mXFaceLabel,
+ i18n( "This is a preview of the picture selected/entered below." ) );
+ mXFaceLabel->setFixedSize(48, 48);
+ mXFaceLabel->setFrameShape( QFrame::Box );
+ hlay->addWidget( mXFaceLabel );
+
+// label1 = new QLabel( "X-Face:", this );
+// vlay->addWidget( label1 );
+
+ // "obtain X-Face from" combo and label:
+ hlay = new QHBoxLayout( vlay ); // inherits spacing
+ mSourceCombo = new QComboBox( false, this );
+ QWhatsThis::add(mSourceCombo,
+ i18n("Click on the widgets below to obtain help on the input methods."));
+ mSourceCombo->setEnabled( false ); // since !mEnableCheck->isChecked()
+ mSourceCombo->insertStringList( QStringList()
+ << i18n( "continuation of \"obtain picture from\"",
+ "External Source" )
+ << i18n( "continuation of \"obtain picture from\"",
+ "Input Field Below" ) );
+ label = new QLabel( mSourceCombo,
+ i18n("Obtain pic&ture from:"), this );
+ label->setEnabled( false ); // since !mEnableCheck->isChecked()
+ hlay->addWidget( label );
+ hlay->addWidget( mSourceCombo, 1 );
+
+ // widget stack that is controlled by the source combo:
+ QWidgetStack * widgetStack = new QWidgetStack( this );
+ widgetStack->setEnabled( false ); // since !mEnableCheck->isChecked()
+ vlay->addWidget( widgetStack, 1 );
+ connect( mSourceCombo, SIGNAL(highlighted(int)),
+ widgetStack, SLOT(raiseWidget(int)) );
+ connect( mEnableCheck, SIGNAL(toggled(bool)),
+ mSourceCombo, SLOT(setEnabled(bool)) );
+ connect( mEnableCheck, SIGNAL(toggled(bool)),
+ widgetStack, SLOT(setEnabled(bool)) );
+ connect( mEnableCheck, SIGNAL(toggled(bool)),
+ label, SLOT(setEnabled(bool)) );
+ // The focus might be still in the widget that is disabled
+ connect( mEnableCheck, SIGNAL(clicked()),
+ mEnableCheck, SLOT(setFocus()) );
+
+ int pageno = 0;
+ // page 0: create X-Face from image file or address book entry
+ page = new QWidget( widgetStack );
+ widgetStack->addWidget( page, pageno ); // force sequential numbers (play safe)
+ page_vlay = new QVBoxLayout( page, 0, KDialog::spacingHint() );
+ hlay = new QHBoxLayout( page_vlay ); // inherits spacing
+ mFromFileBtn = new QPushButton( i18n("Select File..."), page );
+ QWhatsThis::add( mFromFileBtn,
+ i18n("Use this to select an image file to create the picture from. "
+ "The image should be of high contrast and nearly quadratic shape. "
+ "A light background helps improve the result." ) );
+ mFromFileBtn->setAutoDefault( false );
+ page_vlay->addWidget( mFromFileBtn, 1 );
+ connect( mFromFileBtn, SIGNAL(released()),
+ this, SLOT(slotSelectFile()) );
+ mFromAddrbkBtn = new QPushButton( i18n("Set From Address Book"), page );
+ QWhatsThis::add( mFromAddrbkBtn,
+ i18n( "You can use a scaled-down version of the picture "
+ "you have set in your address book entry." ) );
+ mFromAddrbkBtn->setAutoDefault( false );
+ page_vlay->addWidget( mFromAddrbkBtn, 1 );
+ connect( mFromAddrbkBtn, SIGNAL(released()),
+ this, SLOT(slotSelectFromAddressbook()) );
+ label1 = new QLabel( i18n("<qt>KMail can send a small (48x48 pixels), low-quality, "
+ "monochrome picture with every message. "
+ "For example, this could be a picture of you or a glyph. "
+ "It is shown in the recipient's mail client (if supported)." ), page );
+ label1->setAlignment( QLabel::WordBreak | QLabel::AlignVCenter );
+ page_vlay->addWidget( label1 );
+
+ widgetStack->raiseWidget( 0 ); // since mSourceCombo->currentItem() == 0
+
+ // page 1: input field for direct entering
+ ++pageno;
+ page = new QWidget( widgetStack );
+ widgetStack->addWidget( page, pageno );
+ page_vlay = new QVBoxLayout( page, 0, KDialog::spacingHint() );
+ mTextEdit = new QTextEdit( page );
+ page_vlay->addWidget( mTextEdit );
+ QWhatsThis::add( mTextEdit, i18n( "Use this field to enter an arbitrary X-Face string." ) );
+ mTextEdit->setFont( KGlobalSettings::fixedFont() );
+ mTextEdit->setWrapPolicy( QTextEdit::Anywhere );
+ mTextEdit->setTextFormat( Qt::PlainText );
+ label2 = new KActiveLabel( i18n("Examples are available at <a href=\"http://www.xs4all.nl/~ace/X-Faces/\">http://www.xs4all.nl/~ace/X-Faces/</a>."), page );
+ page_vlay->addWidget( label2 );
+
+
+ connect(mTextEdit, SIGNAL(textChanged()), this, SLOT(slotUpdateXFace()));
+ }
+
+ XFaceConfigurator::~XFaceConfigurator() {
+
+ }
+
+ bool XFaceConfigurator::isXFaceEnabled() const {
+ return mEnableCheck->isChecked();
+ }
+
+ void XFaceConfigurator::setXFaceEnabled( bool enable ) {
+ mEnableCheck->setChecked( enable );
+ }
+
+ QString XFaceConfigurator::xface() const {
+ return mTextEdit->text();
+ }
+
+ void XFaceConfigurator::setXFace( const QString & text ) {
+ mTextEdit->setText( text );
+ }
+
+ void XFaceConfigurator::setXfaceFromFile( const KURL &url )
+ {
+ QString tmpFile;
+ if( KIO::NetAccess::download( url, tmpFile, this ) )
+ {
+ KXFace xf;
+ mTextEdit->setText( xf.fromImage( QImage( tmpFile ) ) );
+ KIO::NetAccess::removeTempFile( tmpFile );
+ } else {
+ KMessageBox::error(this, KIO::NetAccess::lastErrorString() );
+ }
+ }
+
+ void XFaceConfigurator::slotSelectFile()
+ {
+ QStringList mimeTypes = KImageIO::mimeTypes (KImageIO::Reading);
+ QString filter = mimeTypes.join (" ");
+ KURL url = KFileDialog::getOpenURL( QString::null, filter, this, QString::null );
+ if ( !url.isEmpty() )
+ setXfaceFromFile( url );
+ }
+
+ void XFaceConfigurator::slotSelectFromAddressbook()
+ {
+ StdAddressBook *ab = StdAddressBook::self( true );
+ Addressee me = ab->whoAmI();
+ if ( !me.isEmpty() )
+ {
+ if ( me.photo().isIntern() )
+ {
+ QImage photo = me.photo().data();
+ if ( !photo.isNull() )
+ {
+ KXFace xf;
+ mTextEdit->setText( xf.fromImage( photo ) );
+ }
+ else
+ KMessageBox::information( this, i18n("No picture set for your address book entry."), i18n("No Picture") );
+
+ }
+ else
+ {
+ KURL url = me.photo().url();
+ if( !url.isEmpty() )
+ setXfaceFromFile( url );
+ else
+ KMessageBox::information( this, i18n("No picture set for your address book entry."), i18n("No Picture") );
+ }
+ }
+ else
+ KMessageBox::information( this, i18n("You do not have your own contact defined in the address book."), i18n("No Picture") );
+ }
+
+ void XFaceConfigurator::slotUpdateXFace()
+ {
+ QString str = mTextEdit->text();
+ if ( !str.isEmpty() )
+ {
+ if ( str.startsWith("x-face:", false) )
+ {
+ str = str.remove("x-face:", false);
+ mTextEdit->setText(str);
+ }
+ KXFace xf;
+ QPixmap p( 48, 48, true );
+ p.convertFromImage( xf.toImage(str) );
+ mXFaceLabel->setPixmap( p );
+ }
+ else
+ mXFaceLabel->setPixmap( 0L );
+ }
+
+} // namespace KMail
+
+#include "xfaceconfigurator.moc"