00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifdef HAVE_CONFIG_H
00017 #include <config.h>
00018 #endif
00019
00020 #include "signatureconfigurator.h"
00021
00022 #include <klocale.h>
00023 #include <kdialog.h>
00024 #include <klineedit.h>
00025 #include <kurlrequester.h>
00026 #include <kshellcompletion.h>
00027 #include <krun.h>
00028
00029 #include <qcheckbox.h>
00030 #include <qcombobox.h>
00031 #include <qdir.h>
00032 #include <qfileinfo.h>
00033 #include <qlabel.h>
00034 #include <qlayout.h>
00035 #include <qtextedit.h>
00036 #include <qwhatsthis.h>
00037 #include <qwidgetstack.h>
00038
00039 #include <assert.h>
00040
00041 using namespace KMail;
00042
00043 namespace KMail {
00044
00045 SignatureConfigurator::SignatureConfigurator( QWidget * parent, const char * name )
00046 : QWidget( parent, name )
00047 {
00048
00049 QLabel * label;
00050 QWidget * page;
00051 QHBoxLayout * hlay;
00052 QVBoxLayout * vlay;
00053 QVBoxLayout * page_vlay;
00054
00055 vlay = new QVBoxLayout( this, 0, KDialog::spacingHint(), "main layout" );
00056
00057
00058 mEnableCheck = new QCheckBox( i18n("&Enable signature"), this );
00059 QWhatsThis::add(mEnableCheck,
00060 i18n("Check this box if you want KMail to append a signature to mails "
00061 "written with this identity."));
00062 vlay->addWidget( mEnableCheck );
00063
00064
00065 hlay = new QHBoxLayout( vlay );
00066 mSourceCombo = new QComboBox( false, this );
00067 QWhatsThis::add(mSourceCombo,
00068 i18n("Click on the widgets below to obtain help on the input methods."));
00069 mSourceCombo->setEnabled( false );
00070 mSourceCombo->insertStringList( QStringList()
00071 << i18n("continuation of \"obtain signature text from\"",
00072 "Input Field Below")
00073 << i18n("continuation of \"obtain signature text from\"",
00074 "File")
00075 << i18n("continuation of \"obtain signature text from\"",
00076 "Output of Command")
00077 );
00078 label = new QLabel( mSourceCombo,
00079 i18n("Obtain signature &text from:"), this );
00080 label->setEnabled( false );
00081 hlay->addWidget( label );
00082 hlay->addWidget( mSourceCombo, 1 );
00083
00084
00085 QWidgetStack * widgetStack = new QWidgetStack( this );
00086 widgetStack->setEnabled( false );
00087 vlay->addWidget( widgetStack, 1 );
00088 connect( mSourceCombo, SIGNAL(highlighted(int)),
00089 widgetStack, SLOT(raiseWidget(int)) );
00090
00091
00092 connect( mEnableCheck, SIGNAL(toggled(bool)),
00093 mSourceCombo, SLOT(setEnabled(bool)) );
00094 connect( mEnableCheck, SIGNAL(toggled(bool)),
00095 widgetStack, SLOT(setEnabled(bool)) );
00096 connect( mEnableCheck, SIGNAL(toggled(bool)),
00097 label, SLOT(setEnabled(bool)) );
00098
00099 connect( mEnableCheck, SIGNAL(clicked()),
00100 mEnableCheck, SLOT(setFocus()) );
00101
00102 int pageno = 0;
00103
00104 mTextEdit = new QTextEdit( widgetStack );
00105 QWhatsThis::add(mTextEdit,
00106 i18n("Use this field to enter an arbitrary static signature."));
00107 widgetStack->addWidget( mTextEdit, pageno );
00108 mTextEdit->setFont( KGlobalSettings::fixedFont() );
00109 mTextEdit->setWordWrap( QTextEdit::NoWrap );
00110 mTextEdit->setTextFormat( Qt::PlainText );
00111
00112 widgetStack->raiseWidget( 0 );
00113
00114
00115 ++pageno;
00116 page = new QWidget( widgetStack );
00117 widgetStack->addWidget( page, pageno );
00118 page_vlay = new QVBoxLayout( page, 0, KDialog::spacingHint() );
00119 hlay = new QHBoxLayout( page_vlay );
00120 mFileRequester = new KURLRequester( page );
00121 QWhatsThis::add(mFileRequester,
00122 i18n("Use this requester to specify a text file that contains your "
00123 "signature. It will be read every time you create a new mail or "
00124 "append a new signature."));
00125 hlay->addWidget( new QLabel( mFileRequester,
00126 i18n("S&pecify file:"), page ) );
00127 hlay->addWidget( mFileRequester, 1 );
00128 mFileRequester->button()->setAutoDefault( false );
00129 connect( mFileRequester, SIGNAL(textChanged(const QString &)),
00130 this, SLOT(slotEnableEditButton(const QString &)) );
00131 mEditButton = new QPushButton( i18n("Edit &File"), page );
00132 QWhatsThis::add(mEditButton, i18n("Opens the specified file in a text editor."));
00133 connect( mEditButton, SIGNAL(clicked()), SLOT(slotEdit()) );
00134 mEditButton->setAutoDefault( false );
00135 mEditButton->setEnabled( false );
00136 hlay->addWidget( mEditButton );
00137 page_vlay->addStretch( 1 );
00138
00139
00140 ++pageno;
00141 page = new QWidget( widgetStack );
00142 widgetStack->addWidget( page, pageno );
00143 page_vlay = new QVBoxLayout( page, 0, KDialog::spacingHint() );
00144 hlay = new QHBoxLayout( page_vlay );
00145 mCommandEdit = new KLineEdit( page );
00146 mCommandEdit->setCompletionObject( new KShellCompletion() );
00147 mCommandEdit->setAutoDeleteCompletionObject( true );
00148 QWhatsThis::add(mCommandEdit,
00149 i18n("You can add an arbitrary command here, either with or without path "
00150 "depending on whether or not the command is in your Path. For every "
00151 "new mail, KMail will execute the command and use what it outputs (to "
00152 "standard output) as a signature. Usual commands for use with this "
00153 "mechanism are \"fortune\" or \"ksig -random\"."));
00154 hlay->addWidget( new QLabel( mCommandEdit,
00155 i18n("S&pecify command:"), page ) );
00156 hlay->addWidget( mCommandEdit, 1 );
00157 page_vlay->addStretch( 1 );
00158
00159 }
00160
00161 SignatureConfigurator::~SignatureConfigurator() {
00162
00163 }
00164
00165 bool SignatureConfigurator::isSignatureEnabled() const {
00166 return mEnableCheck->isChecked();
00167 }
00168
00169 void SignatureConfigurator::setSignatureEnabled( bool enable ) {
00170 mEnableCheck->setChecked( enable );
00171 }
00172
00173 Signature::Type SignatureConfigurator::signatureType() const {
00174 if ( !isSignatureEnabled() ) return Signature::Disabled;
00175
00176 switch ( mSourceCombo->currentItem() ) {
00177 case 0: return Signature::Inlined;
00178 case 1: return Signature::FromFile;
00179 case 2: return Signature::FromCommand;
00180 default: return Signature::Disabled;
00181 }
00182 }
00183
00184 void SignatureConfigurator::setSignatureType( Signature::Type type ) {
00185 setSignatureEnabled( type != Signature::Disabled );
00186
00187 int idx = 0;
00188 switch( type ) {
00189 case Signature::Inlined: idx = 0; break;
00190 case Signature::FromFile: idx = 1; break;
00191 case Signature::FromCommand: idx = 2; break;
00192 default: idx = 0; break;
00193 };
00194
00195 mSourceCombo->setCurrentItem( idx );
00196 }
00197
00198 QString SignatureConfigurator::inlineText() const {
00199 return mTextEdit->text();
00200 }
00201
00202 void SignatureConfigurator::setInlineText( const QString & text ) {
00203 mTextEdit->setText( text );
00204 }
00205
00206 QString SignatureConfigurator::fileURL() const {
00207 QString file = mFileRequester->url().stripWhiteSpace();
00208
00209
00210
00211 if ( !file.isEmpty() && QFileInfo( file ).isRelative() )
00212 file = QDir::home().absPath() + QDir::separator() + file;
00213
00214 return file;
00215 }
00216
00217 void SignatureConfigurator::setFileURL( const QString & url ) {
00218 mFileRequester->setURL( url );
00219 }
00220
00221 QString SignatureConfigurator::commandURL() const {
00222 return mCommandEdit->text();
00223 }
00224
00225 void SignatureConfigurator::setCommandURL( const QString & url ) {
00226 mCommandEdit->setText( url );
00227 }
00228
00229
00230 Signature SignatureConfigurator::signature() const {
00231 Signature sig;
00232 sig.setType( signatureType() );
00233 sig.setText( inlineText() );
00234 if ( signatureType() == Signature::FromCommand )
00235 sig.setUrl( commandURL(), true );
00236 if ( signatureType() == Signature::FromFile )
00237 sig.setUrl( fileURL(), false );
00238 return sig;
00239 }
00240
00241 void SignatureConfigurator::setSignature( const Signature & sig ) {
00242 setSignatureType( sig.type() );
00243 setInlineText( sig.text() );
00244 if ( sig.type() == Signature::FromFile )
00245 setFileURL( sig.url() );
00246 else
00247 setFileURL( QString::null );
00248 if ( sig.type() == Signature::FromCommand )
00249 setCommandURL( sig.url() );
00250 else
00251 setCommandURL( QString::null );
00252 }
00253
00254 void SignatureConfigurator::slotEnableEditButton( const QString & url ) {
00255 mEditButton->setDisabled( url.stripWhiteSpace().isEmpty() );
00256 }
00257
00258 void SignatureConfigurator::slotEdit() {
00259 QString url = fileURL();
00260
00261 assert( !url.isEmpty() );
00262
00263 (void)KRun::runURL( KURL( url ), QString::fromLatin1("text/plain") );
00264 }
00265
00266 }
00267
00268 #include "signatureconfigurator.moc"