diff options
Diffstat (limited to 'kmail/signatureconfigurator.cpp')
-rw-r--r-- | kmail/signatureconfigurator.cpp | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/kmail/signatureconfigurator.cpp b/kmail/signatureconfigurator.cpp new file mode 100644 index 000000000..68bfd1949 --- /dev/null +++ b/kmail/signatureconfigurator.cpp @@ -0,0 +1,268 @@ +/* -*- c++ -*- + signatureconfigurator.cpp + + KMail, the KDE mail client. + Copyright (c) 2002 the KMail authors. + See file AUTHORS for details + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License, + version 2.0, as published by the Free Software Foundation. + 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, US +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "signatureconfigurator.h" + +#include <klocale.h> +#include <kdialog.h> +#include <klineedit.h> +#include <kurlrequester.h> +#include <kshellcompletion.h> +#include <krun.h> + +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qdir.h> +#include <qfileinfo.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qtextedit.h> +#include <qwhatsthis.h> +#include <qwidgetstack.h> + +#include <assert.h> + +using namespace KMail; + +namespace KMail { + + SignatureConfigurator::SignatureConfigurator( QWidget * parent, const char * name ) + : QWidget( parent, name ) + { + // tmp. vars: + QLabel * label; + QWidget * page; + QHBoxLayout * hlay; + QVBoxLayout * vlay; + QVBoxLayout * page_vlay; + + vlay = new QVBoxLayout( this, 0, KDialog::spacingHint(), "main layout" ); + + // "enable signatue" checkbox: + mEnableCheck = new QCheckBox( i18n("&Enable signature"), this ); + QWhatsThis::add(mEnableCheck, + i18n("Check this box if you want KMail to append a signature to mails " + "written with this identity.")); + vlay->addWidget( mEnableCheck ); + + // "obtain signature text 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 signature text from\"", + "Input Field Below") + << i18n("continuation of \"obtain signature text from\"", + "File") + << i18n("continuation of \"obtain signature text from\"", + "Output of Command") + ); + label = new QLabel( mSourceCombo, + i18n("Obtain signature &text 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)) ); + // connects for the enabling of the widgets depending on + // signatureEnabled: + 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: input field for direct entering: + mTextEdit = new QTextEdit( widgetStack ); + QWhatsThis::add(mTextEdit, + i18n("Use this field to enter an arbitrary static signature.")); + widgetStack->addWidget( mTextEdit, pageno ); + mTextEdit->setFont( KGlobalSettings::fixedFont() ); + mTextEdit->setWordWrap( QTextEdit::NoWrap ); + mTextEdit->setTextFormat( Qt::PlainText ); + + widgetStack->raiseWidget( 0 ); // since mSourceCombo->currentItem() == 0 + + // page 1: "signature file" requester, label, "edit file" button: + ++pageno; + 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 + mFileRequester = new KURLRequester( page ); + QWhatsThis::add(mFileRequester, + i18n("Use this requester to specify a text file that contains your " + "signature. It will be read every time you create a new mail or " + "append a new signature.")); + hlay->addWidget( new QLabel( mFileRequester, + i18n("S&pecify file:"), page ) ); + hlay->addWidget( mFileRequester, 1 ); + mFileRequester->button()->setAutoDefault( false ); + connect( mFileRequester, SIGNAL(textChanged(const QString &)), + this, SLOT(slotEnableEditButton(const QString &)) ); + mEditButton = new QPushButton( i18n("Edit &File"), page ); + QWhatsThis::add(mEditButton, i18n("Opens the specified file in a text editor.")); + connect( mEditButton, SIGNAL(clicked()), SLOT(slotEdit()) ); + mEditButton->setAutoDefault( false ); + mEditButton->setEnabled( false ); // initially nothing to edit + hlay->addWidget( mEditButton ); + page_vlay->addStretch( 1 ); // spacer + + // page 2: "signature command" requester and label: + ++pageno; + page = new QWidget( widgetStack ); + widgetStack->addWidget( page, pageno ); + page_vlay = new QVBoxLayout( page, 0, KDialog::spacingHint() ); + hlay = new QHBoxLayout( page_vlay ); // inherits spacing + mCommandEdit = new KLineEdit( page ); + mCommandEdit->setCompletionObject( new KShellCompletion() ); + mCommandEdit->setAutoDeleteCompletionObject( true ); + QWhatsThis::add(mCommandEdit, + i18n("You can add an arbitrary command here, either with or without path " + "depending on whether or not the command is in your Path. For every " + "new mail, KMail will execute the command and use what it outputs (to " + "standard output) as a signature. Usual commands for use with this " + "mechanism are \"fortune\" or \"ksig -random\".")); + hlay->addWidget( new QLabel( mCommandEdit, + i18n("S&pecify command:"), page ) ); + hlay->addWidget( mCommandEdit, 1 ); + page_vlay->addStretch( 1 ); // spacer + + } + + SignatureConfigurator::~SignatureConfigurator() { + + } + + bool SignatureConfigurator::isSignatureEnabled() const { + return mEnableCheck->isChecked(); + } + + void SignatureConfigurator::setSignatureEnabled( bool enable ) { + mEnableCheck->setChecked( enable ); + } + + Signature::Type SignatureConfigurator::signatureType() const { + if ( !isSignatureEnabled() ) return Signature::Disabled; + + switch ( mSourceCombo->currentItem() ) { + case 0: return Signature::Inlined; + case 1: return Signature::FromFile; + case 2: return Signature::FromCommand; + default: return Signature::Disabled; + } + } + + void SignatureConfigurator::setSignatureType( Signature::Type type ) { + setSignatureEnabled( type != Signature::Disabled ); + + int idx = 0; + switch( type ) { + case Signature::Inlined: idx = 0; break; + case Signature::FromFile: idx = 1; break; + case Signature::FromCommand: idx = 2; break; + default: idx = 0; break; + }; + + mSourceCombo->setCurrentItem( idx ); + } + + QString SignatureConfigurator::inlineText() const { + return mTextEdit->text(); + } + + void SignatureConfigurator::setInlineText( const QString & text ) { + mTextEdit->setText( text ); + } + + QString SignatureConfigurator::fileURL() const { + QString file = mFileRequester->url().stripWhiteSpace(); + + // Force the filename to be relative to ~ instead of $PWD depending + // on the rest of the code (KRun::run in Edit and KFileItem on save) + if ( !file.isEmpty() && QFileInfo( file ).isRelative() ) + file = QDir::home().absPath() + QDir::separator() + file; + + return file; + } + + void SignatureConfigurator::setFileURL( const QString & url ) { + mFileRequester->setURL( url ); + } + + QString SignatureConfigurator::commandURL() const { + return mCommandEdit->text(); + } + + void SignatureConfigurator::setCommandURL( const QString & url ) { + mCommandEdit->setText( url ); + } + + + Signature SignatureConfigurator::signature() const { + Signature sig; + sig.setType( signatureType() ); + sig.setText( inlineText() ); + if ( signatureType() == Signature::FromCommand ) + sig.setUrl( commandURL(), true ); + if ( signatureType() == Signature::FromFile ) + sig.setUrl( fileURL(), false ); + return sig; + } + + void SignatureConfigurator::setSignature( const Signature & sig ) { + setSignatureType( sig.type() ); + setInlineText( sig.text() ); + if ( sig.type() == Signature::FromFile ) + setFileURL( sig.url() ); + else + setFileURL( QString::null ); + if ( sig.type() == Signature::FromCommand ) + setCommandURL( sig.url() ); + else + setCommandURL( QString::null ); + } + + void SignatureConfigurator::slotEnableEditButton( const QString & url ) { + mEditButton->setDisabled( url.stripWhiteSpace().isEmpty() ); + } + + void SignatureConfigurator::slotEdit() { + QString url = fileURL(); + // slotEnableEditButton should prevent this assert from being hit: + assert( !url.isEmpty() ); + + (void)KRun::runURL( KURL( url ), QString::fromLatin1("text/plain") ); + } + +} // namespace KMail + +#include "signatureconfigurator.moc" |