21 #include "signatureconfigurator.h"
24 #include <kactioncollection.h>
28 #include <klineedit.h>
29 #include <kurlrequester.h>
30 #include <kshellcompletion.h>
34 #include <KStandardDirs>
36 #include <kpimtextedit/textedit.h>
46 #include <QStackedWidget>
48 #include <QVBoxLayout>
49 #include <QHBoxLayout>
53 using namespace KPIMIdentities;
55 namespace KPIMIdentities {
62 class SignatureConfigurator::Private
70 QString imageLocation;
79 void SignatureConfigurator::Private::init()
86 QVBoxLayout * page_vlay;
88 vlay =
new QVBoxLayout( q );
89 vlay->setObjectName(
"main layout" );
93 q->mEnableCheck =
new QCheckBox( i18n(
"&Enable signature"), q );
94 q->mEnableCheck->setWhatsThis(
95 i18n(
"Check this box if you want KMail to append a signature to mails "
96 "written with this identity."));
97 vlay->addWidget( q->mEnableCheck );
100 hlay =
new QHBoxLayout();
101 vlay->addLayout( hlay );
102 q->mSourceCombo =
new KComboBox( q );
103 q->mSourceCombo->setEditable(
false );
104 q->mSourceCombo->setWhatsThis(
105 i18n(
"Click on the widgets below to obtain help on the input methods."));
106 q->mSourceCombo->setEnabled(
false );
107 q->mSourceCombo->addItems( QStringList()
108 << i18nc(
"continuation of \"obtain signature text from\"",
110 << i18nc(
"continuation of \"obtain signature text from\"",
112 << i18nc(
"continuation of \"obtain signature text from\"",
115 label =
new QLabel( i18n(
"Obtain signature &text from:"), q );
116 label->setBuddy( q->mSourceCombo );
117 label->setEnabled(
false );
118 hlay->addWidget( label );
119 hlay->addWidget( q->mSourceCombo, 1 );
122 QStackedWidget * widgetStack =
new QStackedWidget( q );
123 widgetStack->setEnabled(
false );
124 vlay->addWidget( widgetStack, 1 );
125 q->connect( q->mSourceCombo, SIGNAL(currentIndexChanged(
int)),
126 widgetStack, SLOT(setCurrentIndex(
int)) );
127 q->connect( q->mSourceCombo, SIGNAL(highlighted(
int)),
128 widgetStack, SLOT(setCurrentIndex(
int)) );
131 q->connect( q->mEnableCheck, SIGNAL(toggled(
bool)),
132 q->mSourceCombo, SLOT(setEnabled(
bool)) );
133 q->connect( q->mEnableCheck, SIGNAL(toggled(
bool)),
134 widgetStack, SLOT(setEnabled(
bool)) );
135 q->connect( q->mEnableCheck, SIGNAL(toggled(
bool)),
136 label, SLOT(setEnabled(
bool)) );
138 q->connect( q->mEnableCheck, SIGNAL(clicked()),
139 q->mEnableCheck, SLOT(setFocus()) );
143 page =
new QWidget( widgetStack );
144 widgetStack->insertWidget( pageno, page );
145 page_vlay =
new QVBoxLayout( page );
147 #ifndef QT_NO_TOOLBAR
148 q->mEditToolBar =
new KToolBar( q );
149 q->mEditToolBar->setToolButtonStyle( Qt::ToolButtonIconOnly );
150 page_vlay->addWidget( q->mEditToolBar, 0 );
152 q->mFormatToolBar =
new KToolBar( q );
153 q->mFormatToolBar->setToolButtonStyle( Qt::ToolButtonIconOnly );
154 page_vlay->addWidget( q->mFormatToolBar, 1 );
157 q->mTextEdit =
new KPIMTextEdit::TextEdit( q );
158 static_cast<KPIMTextEdit::TextEdit*
>( q->mTextEdit )->enableImageActions();
159 page_vlay->addWidget( q->mTextEdit, 2 );
160 q->mTextEdit->setWhatsThis( i18n(
"Use this field to enter an arbitrary static signature."));
162 q->mTextEdit->setRichTextSupport( KRichTextWidget::FullTextFormattingSupport |
163 KRichTextWidget::FullListSupport |
164 KRichTextWidget::SupportAlignment |
165 KRichTextWidget::SupportRuleLine |
166 KRichTextWidget::SupportHyperlinks |
167 KRichTextWidget::SupportFormatPainting );
170 KActionCollection *actionCollection =
new KActionCollection( q );
171 q->mTextEdit->createActions( actionCollection );
172 #ifndef QT_NO_TOOLBAR
173 q->mEditToolBar->addAction( actionCollection->action(
"format_text_bold" ) );
174 q->mEditToolBar->addAction( actionCollection->action(
"format_text_italic" ) );
175 q->mEditToolBar->addAction( actionCollection->action(
"format_text_underline" ) );
176 q->mEditToolBar->addAction( actionCollection->action(
"format_text_strikeout" ) );
177 q->mEditToolBar->addAction( actionCollection->action(
"format_text_foreground_color" ) );
178 q->mEditToolBar->addAction( actionCollection->action(
"format_text_background_color" ) );
179 q->mEditToolBar->addAction( actionCollection->action(
"format_font_family" ) );
180 q->mEditToolBar->addAction( actionCollection->action(
"format_font_size" ) );
182 q->mFormatToolBar->addAction( actionCollection->action(
"format_list_style" ) );
183 q->mFormatToolBar->addAction( actionCollection->action(
"format_list_indent_more" ) );
184 q->mFormatToolBar->addAction( actionCollection->action(
"format_list_indent_less" ) );
185 q->mFormatToolBar->addAction( actionCollection->action(
"format_list_indent_less" ) );
186 q->mFormatToolBar->addSeparator();
188 q->mFormatToolBar->addAction( actionCollection->action(
"format_align_left" ) );
189 q->mFormatToolBar->addAction( actionCollection->action(
"format_align_center" ) );
190 q->mFormatToolBar->addAction( actionCollection->action(
"format_align_right" ) );
191 q->mFormatToolBar->addAction( actionCollection->action(
"format_align_justify" ) );
192 q->mFormatToolBar->addSeparator();
194 q->mFormatToolBar->addAction( actionCollection->action(
"insert_horizontal_rule" ) );
195 q->mFormatToolBar->addAction( actionCollection->action(
"manage_link" ) );
196 q->mFormatToolBar->addAction( actionCollection->action(
"format_painter" ) );
198 q->mFormatToolBar->addSeparator();
199 q->mFormatToolBar->addAction( actionCollection->action(
"add_image" ) );
202 hlay =
new QHBoxLayout();
203 page_vlay->addLayout( hlay );
204 q->mHtmlCheck =
new QCheckBox( i18n(
"&Use HTML"), page );
205 q->connect( q->mHtmlCheck, SIGNAL(clicked()),
206 q, SLOT(slotSetHtml()) );
207 hlay->addWidget( q->mHtmlCheck );
210 widgetStack->setCurrentIndex( 0 );
214 page =
new QWidget( widgetStack );
215 widgetStack->insertWidget( pageno, page );
216 page_vlay =
new QVBoxLayout( page );
217 page_vlay->setMargin( 0 );
218 hlay =
new QHBoxLayout();
219 page_vlay->addLayout( hlay );
220 q->mFileRequester =
new KUrlRequester( page );
221 q->mFileRequester->setWhatsThis(
222 i18n(
"Use this requester to specify a text file that contains your "
223 "signature. It will be read every time you create a new mail or "
224 "append a new signature."));
225 label =
new QLabel( i18n(
"S&pecify file:"), page );
226 label->setBuddy( q->mFileRequester );
227 hlay->addWidget( label );
228 hlay->addWidget( q->mFileRequester, 1 );
229 q->mFileRequester->button()->setAutoDefault(
false );
230 q->connect( q->mFileRequester, SIGNAL(textChanged(QString)),
231 q, SLOT(slotEnableEditButton(QString)) );
232 q->mEditButton =
new QPushButton( i18n(
"Edit &File"), page );
233 q->mEditButton->setWhatsThis( i18n(
"Opens the specified file in a text editor."));
234 q->connect( q->mEditButton, SIGNAL(clicked()),
235 q, SLOT(slotEdit()) );
236 q->mEditButton->setAutoDefault(
false );
237 q->mEditButton->setEnabled(
false );
238 hlay->addWidget( q->mEditButton );
239 page_vlay->addStretch( 1 );
243 page =
new QWidget( widgetStack );
244 widgetStack->insertWidget( pageno,page );
245 page_vlay =
new QVBoxLayout( page );
246 page_vlay->setMargin( 0 );
247 hlay =
new QHBoxLayout();
248 page_vlay->addLayout( hlay );
249 q->mCommandEdit =
new KLineEdit( page );
250 q->mCommandEdit->setCompletionObject(
new KShellCompletion() );
251 q->mCommandEdit->setAutoDeleteCompletionObject(
true );
252 q->mCommandEdit->setWhatsThis(
253 i18n(
"You can add an arbitrary command here, either with or without path "
254 "depending on whether or not the command is in your Path. For every "
255 "new mail, KMail will execute the command and use what it outputs (to "
256 "standard output) as a signature. Usual commands for use with this "
257 "mechanism are \"fortune\" or \"ksig -random\"."));
258 label =
new QLabel( i18n(
"S&pecify command:"), page );
259 label->setBuddy( q->mCommandEdit );
260 hlay->addWidget( label );
261 hlay->addWidget( q->mCommandEdit, 1 );
262 page_vlay->addStretch( 1 );
266 : QWidget( parent ), d( new Private( this ) )
278 return mEnableCheck->isChecked();
283 mEnableCheck->setChecked( enable );
288 switch ( mSourceCombo->currentIndex() ) {
289 case 0:
return Signature::Inlined;
290 case 1:
return Signature::FromFile;
291 case 2:
return Signature::FromCommand;
292 default:
return Signature::Disabled;
300 case Signature::Inlined: idx = 0;
break;
301 case Signature::FromFile: idx = 1;
break;
302 case Signature::FromCommand: idx = 2;
break;
303 default: idx = 0;
break;
306 mSourceCombo->setCurrentIndex( idx );
311 mTextEdit->setTextOrHtml( text );
316 QString file = mFileRequester->url().path();
320 if ( !file.isEmpty() && QFileInfo( file ).isRelative() )
321 file = QDir::home().absolutePath() + QDir::separator() + file;
328 mFileRequester->setUrl( url );
333 return mCommandEdit->text();
338 mCommandEdit->setText( url );
347 case Signature::Inlined:
349 sig.
setText( d->inlinedHtml ? asCleanedHTML() : mTextEdit->textOrHtml() );
350 if ( d->inlinedHtml ) {
351 if ( !d->imageLocation.isEmpty() )
353 KPIMTextEdit::ImageWithNameList images =
static_cast< KPIMTextEdit::TextEdit*
>( mTextEdit )->imagesWithName();
354 foreach(
const KPIMTextEdit::ImageWithNamePtr &image, images ) {
355 sig.
addImage( image->image, image->name );
359 case Signature::FromCommand:
362 case Signature::FromFile:
365 case Signature::Disabled:
370 sig.setType( sigType );
380 mHtmlCheck->setCheckState( Qt::Checked );
382 mHtmlCheck->setCheckState( Qt::Unchecked );
387 KPIMTextEdit::TextEdit *
const pimEdit =
static_cast<KPIMTextEdit::TextEdit*
>( mTextEdit );
390 if ( sig.
type() == Signature::FromFile )
395 if ( sig.
type() == Signature::FromCommand )
401 void SignatureConfigurator::slotEnableEditButton(
const QString & url )
403 mEditButton->setDisabled( url.trimmed().isEmpty() );
406 void SignatureConfigurator::slotEdit()
410 assert( !url.isEmpty() );
412 (void)KRun::runUrl( KUrl( url ), QString::fromLatin1(
"text/plain"), this );
415 QString SignatureConfigurator::asCleanedHTML()
const
417 QString text = mTextEdit->toHtml();
420 QTextDocument textDocument;
421 QString html = textDocument.toHtml();
424 foreach(
const QString& line, html.split(
'\n' ) ){
425 text.remove( line +
'\n' );
431 void SignatureConfigurator::slotSetHtml()
433 if ( mHtmlCheck->checkState() == Qt::Unchecked ) {
434 mHtmlCheck->setText( i18n(
"&Use HTML") );
435 #ifndef QT_NO_TOOLBAR
436 mEditToolBar->setVisible(
false );
437 mEditToolBar->setEnabled(
false );
438 mFormatToolBar->setVisible(
false );
439 mFormatToolBar->setEnabled(
false );
441 mTextEdit->switchToPlainText();
442 d->inlinedHtml =
false;
445 mHtmlCheck->setText( i18n(
"&Use HTML (disabling removes formatting)") );
446 d->inlinedHtml =
true;
447 #ifndef QT_NO_TOOLBAR
448 mEditToolBar->setVisible(
true );
449 mEditToolBar->setEnabled(
true );
450 mFormatToolBar->setVisible(
true );
451 mFormatToolBar->setEnabled(
true );
453 mTextEdit->enableRichTextMode();
459 d->imageLocation = path;
464 const QString dir = QString(
"emailidentities/%1/" ).arg(
465 QString::number( identity.
uoid() ) );
471 #include "signatureconfigurator.moc"