split message into several paras and fix file extension markup
[kdepim.git] / knode / knconfigwidgets.cpp
blobdca8182896ba0d71df2a929b6d51cd3e32655025
1 /*
2 KNode, the KDE newsreader
3 Copyright (c) 1999-2006 the KNode authors.
4 See file AUTHORS for details
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 You should have received a copy of the GNU General Public License
11 along with this program; if not, write to the Free Software Foundation,
12 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
15 #include "knconfigwidgets.h"
17 #include "configuration/identity_widget.h"
18 #include "knaccountmanager.h"
19 #include "knconfigmanager.h"
20 #include "kndisplayedheader.h"
21 #include "kngroupmanager.h"
22 #include "knglobals.h"
23 #include "knnntpaccount.h"
24 #include "utilities.h"
25 #include "knfiltermanager.h"
26 #include "knarticlefilter.h"
27 #include "knscoring.h"
28 #include "ui_postnewscomposerwidget_base.h"
29 #include "ui_readnewsnavigationwidget_base.h"
30 #include "ui_readnewsviewerwidget_base.h"
31 #include "settings.h"
32 #include "utils/locale.h"
34 #include <QPainter>
35 #include <kcharsets.h>
36 #include <kio/ioslave_defaults.h>
37 #include <kmessagebox.h>
38 #include <kcolordialog.h>
39 #include <kfontdialog.h>
40 #include <kscoringeditor.h>
41 #include <sonnet/configwidget.h>
42 #include <kcombobox.h>
43 #include <libkpgp/kpgpui.h>
47 //BEGIN: NNTP account configuration widgets ----------------------------------
49 KNode::NntpAccountListWidget::NntpAccountListWidget( const KComponentData &inst, QWidget *parent ) :
50 KCModule( inst, parent )
52 setupUi( this );
54 // account listbox
55 connect( mAccountList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
56 connect( mAccountList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
58 // buttons
59 connect( mAddButton, SIGNAL(clicked()), SLOT(slotAddBtnClicked()) );
60 connect( mEditButton, SIGNAL(clicked()), SLOT(slotEditBtnClicked()) );
61 connect( mDeleteButton, SIGNAL(clicked()), SLOT(slotDelBtnClicked()) );
62 connect( mSubscribeButton, SIGNAL(clicked()), SLOT(slotSubBtnClicked()) );
64 load();
66 // the settings dialog is non-modal, so we have to react to changes
67 // made outside of the dialog
68 KNAccountManager *am = knGlobals.accountManager();
69 connect( am, SIGNAL(accountAdded(KNNntpAccount::Ptr)), SLOT(slotAddItem(KNNntpAccount::Ptr)) );
70 connect( am, SIGNAL(accountRemoved(KNNntpAccount::Ptr)), SLOT(slotRemoveItem(KNNntpAccount::Ptr)) );
71 connect( am, SIGNAL(accountModified(KNNntpAccount::Ptr)), SLOT(slotUpdateItem(KNNntpAccount::Ptr)) );
73 slotSelectionChanged(); // disable Delete & Edit initially
77 void KNode::NntpAccountListWidget::load()
79 mAccountList->clear();
80 KNNntpAccount::List list = knGlobals.accountManager()->accounts();
81 for ( KNNntpAccount::List::Iterator it = list.begin(); it != list.end(); ++it )
82 slotAddItem( *it );
86 void KNode::NntpAccountListWidget::slotAddItem( KNNntpAccount::Ptr a )
88 AccountListItem *item;
89 item = new AccountListItem( a );
90 item->setText( a->name() );
91 item->setIcon( SmallIcon( "network-server" ) );
92 mAccountList->addItem( item );
93 emit changed( true );
97 void KNode::NntpAccountListWidget::slotRemoveItem( KNNntpAccount::Ptr a )
99 AccountListItem *item;
100 for ( int i = 0; i < mAccountList->count(); ++i ) {
101 item = static_cast<AccountListItem*>( mAccountList->item( i ) );
102 if ( item && item->account() == a ) {
103 delete mAccountList->takeItem( i );
104 break;
107 slotSelectionChanged();
108 emit changed( true );
112 void KNode::NntpAccountListWidget::slotUpdateItem( KNNntpAccount::Ptr a )
114 AccountListItem *item;
115 for ( int i = 0; i < mAccountList->count(); ++i ) {
116 item = static_cast<AccountListItem*>( mAccountList->item( i ) );
117 if ( item && item->account() == a )
118 item->setText( a->name() );
120 slotSelectionChanged();
121 emit changed( true );
126 void KNode::NntpAccountListWidget::slotSelectionChanged()
128 AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
129 mDeleteButton->setEnabled( item );
130 mEditButton->setEnabled( item );
131 mSubscribeButton->setEnabled( item );
133 if ( item ) {
134 mServerInfo->setText( i18n("Server: %1", item->account()->server() ) );
135 mPortInfo->setText( i18n("Port: %1", item->account()->port() ) );
136 } else {
137 mServerInfo->setText( i18n("Server: ") );
138 mPortInfo->setText( i18n("Port: ") );
144 void KNode::NntpAccountListWidget::slotAddBtnClicked()
146 KNNntpAccount::Ptr acc = KNNntpAccount::Ptr( new KNNntpAccount() );
148 if(acc->editProperties(this)) {
149 if(knGlobals.accountManager()->newAccount(acc))
150 acc->writeConfig();
156 void KNode::NntpAccountListWidget::slotDelBtnClicked()
158 AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
159 if ( item )
160 knGlobals.accountManager()->removeAccount( item->account() );
165 void KNode::NntpAccountListWidget::slotEditBtnClicked()
167 AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
168 if ( item ) {
169 item->account()->editProperties( this );
170 slotUpdateItem( item->account() );
175 void KNode::NntpAccountListWidget::slotSubBtnClicked()
177 AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
178 if( item )
179 knGlobals.groupManager()->showGroupDialog( item->account(), this );
183 //=======================================================================================
186 KNode::NntpAccountConfDialog::NntpAccountConfDialog( KNNntpAccount *a, QWidget *parent ) :
187 KPageDialog( parent ),
188 mAccount( a ),
189 mUseServerForName( false )
191 if ( a->id() != -1 )
192 setCaption( i18n("Properties of %1", a->name()) );
193 else
194 setCaption( i18n("New Account") );
195 setFaceType( Tabbed );
196 setButtons( Ok | Cancel | Help );
197 setDefaultButton( Ok );
199 // server config tab
200 QFrame* page = new QFrame( this );
201 addPage( page, i18n("Ser&ver") );
202 setupUi( page );
204 mName->setText( a->name() );
205 mServer->setText( a->server() );
206 mPort->setValue( a->port() );
207 #ifndef Q_WS_WIN
208 // don't know how to set this in KDE4, where no related methods exists
209 mPort->setSliderEnabled( false );
210 #endif
211 mFetchDesc->setChecked( a->fetchDescriptions() );
213 connect( mServer, SIGNAL(textChanged(QString)),
214 this, SLOT(slotServerTextEdited()) );
215 connect( mServer, SIGNAL(editingFinished()),
216 this, SLOT(slotEditingFinished()) );
218 mLogin->setChecked( a->needsLogon() );
219 mUser->setText( a->user() );
221 connect( knGlobals.accountManager(), SIGNAL(passwordsChanged()), SLOT(slotPasswordChanged()) );
222 if ( a->readyForLogin() )
223 mPassword->setText( a->pass() );
224 else
225 if ( a->needsLogon() )
226 knGlobals.accountManager()->loadPasswordsAsync();
228 switch ( mAccount->encryption() ) {
229 case KNServerInfo::None:
230 mEncNone->setChecked( true );
231 break;
232 case KNServerInfo::SSL:
233 mEncSSL->setChecked( true );
234 break;
235 case KNServerInfo::TLS:
236 mEncTLS->setChecked( true );
237 break;
239 connect( mEncNone, SIGNAL(toggled(bool)),
240 this, SLOT(encryptionChanged(bool)) );
241 connect( mEncSSL, SIGNAL(toggled(bool)),
242 this, SLOT(encryptionChanged(bool)) );
243 connect( mEncTLS, SIGNAL(toggled(bool)),
244 this, SLOT(encryptionChanged(bool)) );
247 mIntervalChecking->setChecked( a->intervalChecking() );
248 mInterval->setValue( a->checkInterval() );
249 mInterval->setSuffix(ki18np(" minute", " minutes"));
251 // identity tab
252 mIdentityWidget = new KNode::IdentityWidget( a, knGlobals.componentData(), this );
253 addPage( mIdentityWidget, i18n("&Identity") );
255 // per server cleanup configuration
256 mCleanupWidget = new GroupCleanupWidget( a->cleanupConfig(), this );
257 addPage( mCleanupWidget, i18n("&Cleanup") );
258 mCleanupWidget->load();
260 KNHelper::restoreWindowSize("accNewsPropDLG", this, sizeHint());
262 setHelp("anc-setting-the-news-account");
266 KNode::NntpAccountConfDialog::~NntpAccountConfDialog()
268 KNHelper::saveWindowSize("accNewsPropDLG", size());
271 void KNode::NntpAccountConfDialog::slotServerTextEdited()
273 if ( mName->text().trimmed().isEmpty() ) {
274 mUseServerForName = true;
277 if ( mUseServerForName ) {
278 mName->setText( mServer->text() );
282 void KNode::NntpAccountConfDialog::slotEditingFinished()
284 mUseServerForName = false;
287 void KNode::NntpAccountConfDialog::slotButtonClicked( int button )
289 if ( button == KDialog::Ok ) {
290 if ( mName->text().isEmpty() || mServer->text().trimmed().isEmpty() ) {
291 KMessageBox::sorry(this, i18n("Please enter an arbitrary name for the account and the\nhostname of the news server."));
292 return;
295 mAccount->setName( mName->text() );
296 mAccount->setServer( mServer->text().trimmed().remove(QLatin1String("news://")) );
297 mAccount->setPort( mPort->value() );
298 mAccount->setFetchDescriptions( mFetchDesc->isChecked() );
299 mAccount->setNeedsLogon( mLogin->isChecked() );
300 mAccount->setUser( mUser->text() );
301 mAccount->setPass( mPassword->text() );
303 if ( mEncNone->isChecked() )
304 mAccount->setEncryption( KNServerInfo::None );
305 if ( mEncSSL->isChecked() )
306 mAccount->setEncryption( KNServerInfo::SSL );
307 if ( mEncTLS->isChecked() )
308 mAccount->setEncryption( KNServerInfo::TLS );
310 mAccount->setIntervalChecking( mIntervalChecking->isChecked() );
311 mAccount->setCheckInterval( mInterval->value() );
313 if ( mAccount->id() != -1 ) // only save if account has a valid id
314 mAccount->writeConfig();
316 mIdentityWidget->save();
317 mCleanupWidget->save();
319 accept();
320 } else {
321 KDialog::slotButtonClicked( button );
326 void KNode::NntpAccountConfDialog::slotPasswordChanged()
328 if ( mPassword->text().isEmpty() )
329 mPassword->setText( mAccount->pass() );
333 void KNode::NntpAccountConfDialog::encryptionChanged( bool checked )
335 if ( checked ) { // All 3 buttons are connected to this slot, so only the checked one is taken into account.
336 if ( mEncNone->isChecked() ) {
337 mPort->setValue( DEFAULT_NNTP_PORT );
338 } else if ( mEncSSL->isChecked() || mEncTLS->isChecked() ) {
339 mPort->setValue( DEFAULT_NNTPS_PORT );
345 //END: NNTP account configuration widgets ------------------------------------
347 //===================================================================================
349 KNode::AppearanceWidget::ColorListItem::ColorListItem( const QString &text, const QColor &color, QListWidget *parent ) :
350 QListWidgetItem( text, parent )
352 setColor( color );
356 void KNode::AppearanceWidget::ColorListItem::setColor( const QColor &color )
358 mColor = color;
359 int height = QFontMetrics( font() ).height();
360 QPixmap icon( height, height );
361 QPainter p( &icon );
362 p.setPen( Qt::black );
363 p.drawRect( 0, 0, height - 1, height - 1 );
364 p.fillRect( 1, 1, height - 2, height - 2, color );
365 setIcon( icon );
366 if ( listWidget() )
367 listWidget()->update();
371 //===================================================================================
374 KNode::AppearanceWidget::FontListItem::FontListItem( const QString &text, const QFont &font, QListWidget *parent ) :
375 QListWidgetItem( parent ),
376 mText( text )
378 setFont( font );
382 void KNode::AppearanceWidget::FontListItem::setFont( const QFont &font )
384 mFont = font;
385 setText( QString("[%1 %2] %3").arg( mFont.family() ).arg( mFont.pointSize() ).arg( mText ) );
386 if ( listWidget() )
387 listWidget()->update();
391 //===================================================================================
394 KNode::AppearanceWidget::AppearanceWidget( const KComponentData &inst, QWidget *parent ) :
395 KCModule(inst, parent )
397 QGridLayout *topL = new QGridLayout( this );
399 //color-list
400 mColorList = new QListWidget( this );
401 topL->addWidget( mColorList, 1, 0, 3, 2 );
402 connect( mColorList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotColItemActivated(QListWidgetItem*)) );
403 connect( mColorList, SIGNAL(itemSelectionChanged()), SLOT(slotColSelectionChanged()) );
405 c_olorCB = new QCheckBox(i18n("&Use custom colors"),this);
406 c_olorCB->setObjectName( "kcfg_useCustomColors" );
407 topL->addWidget( c_olorCB, 0, 0, 1, 3 );
408 connect(c_olorCB, SIGNAL(toggled(bool)), this, SLOT(slotColCheckBoxToggled(bool)));
410 c_olChngBtn = new QPushButton( i18nc( "@action:button Run a color selection dialog", "Cha&nge..." ), this );
411 connect(c_olChngBtn, SIGNAL(clicked()), this, SLOT(slotColChangeBtnClicked()));
412 topL->addWidget( c_olChngBtn, 1, 2, 1, 1 );
414 //font-list
415 mFontList = new QListWidget( this );
416 topL->addWidget( mFontList, 5, 0, 3, 2 );
417 connect( mFontList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotFontItemActivated(QListWidgetItem*)) );
418 connect( mFontList, SIGNAL(itemSelectionChanged()), SLOT(slotFontSelectionChanged()) );
420 f_ontCB = new QCheckBox(i18n("Use custom &fonts"),this);
421 f_ontCB->setObjectName( "kcfg_useCustomFonts" );
422 topL->addWidget(f_ontCB , 4, 0, 1, 3 );
423 connect(f_ontCB, SIGNAL(toggled(bool)), this, SLOT(slotFontCheckBoxToggled(bool)));
425 f_ntChngBtn = new QPushButton( i18nc( "@action:button Run a font selection dialog", "Chang&e..."), this);
426 connect(f_ntChngBtn, SIGNAL(clicked()), this, SLOT(slotFontChangeBtnClicked()));
427 topL->addWidget( f_ntChngBtn, 5, 2, 1, 1 );
429 topL->setColumnStretch( 0, 1 );
431 addConfig( knGlobals.settings(), this );
432 load();
436 void KNode::AppearanceWidget::load()
438 KCModule::load();
440 slotColCheckBoxToggled( c_olorCB->isChecked() );
441 slotFontCheckBoxToggled( f_ontCB->isChecked() );
443 KConfigSkeletonItem::List items = knGlobals.settings()->items();
444 mColorList->clear();
445 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
446 KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
447 if ( item )
448 mColorList->addItem( new ColorListItem( item->label(), item->value() ) );
451 mFontList->clear();
452 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
453 KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
454 if ( item )
455 mFontList->addItem( new FontListItem( item->label(), item->value() ) );
460 void KNode::AppearanceWidget::save()
462 KConfigSkeletonItem::List items = knGlobals.settings()->items();
463 int row = 0;
464 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
465 KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
466 if ( !item )
467 continue;
468 item->setValue( static_cast<ColorListItem*>( mColorList->item( row ) )->color() );
469 ++row;
472 row = 0;
473 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
474 KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
475 if ( !item )
476 continue;
477 item->setValue( static_cast<FontListItem*>( mFontList->item( row ) )->font() );
478 ++row;
481 KCModule::save();
483 knGlobals.configManager()->appearance()->recreateLVIcons();
487 void KNode::AppearanceWidget::defaults()
489 KCModule::defaults();
491 KConfigSkeletonItem::List items = knGlobals.settings()->items();
492 int row = 0;
493 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
494 KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
495 if ( !item )
496 continue;
497 item->setDefault();
498 static_cast<ColorListItem*>( mColorList->item( row ) )->setColor( item->value() );
499 ++row;
502 row = 0;
503 for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
504 KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
505 if ( !item )
506 continue;
507 item->setDefault();
508 static_cast<FontListItem*>( mFontList->item( row ) )->setFont( item->value() );
509 ++row;
512 emit changed(true);
516 void KNode::AppearanceWidget::slotColCheckBoxToggled(bool b)
518 mColorList->setEnabled( b );
519 c_olChngBtn->setEnabled( b && mColorList->currentItem() );
520 if (b) mColorList->setFocus();
524 // show color dialog for the entry
525 void KNode::AppearanceWidget::slotColItemActivated( QListWidgetItem *item )
527 if ( item ) {
528 ColorListItem *colorItem = static_cast<ColorListItem*>( item );
529 QColor col = colorItem->color();
530 int result = KColorDialog::getColor(col,this);
532 if (result == KColorDialog::Accepted) {
533 colorItem->setColor(col);
536 emit changed(true);
540 void KNode::AppearanceWidget::slotColChangeBtnClicked()
542 if ( mColorList->currentItem() )
543 slotColItemActivated( mColorList->currentItem() );
547 void KNode::AppearanceWidget::slotColSelectionChanged()
549 c_olChngBtn->setEnabled( mColorList->currentItem() );
553 void KNode::AppearanceWidget::slotFontCheckBoxToggled(bool b)
555 mFontList->setEnabled( b );
556 f_ntChngBtn->setEnabled( b && mFontList->currentItem() );
557 if (b) mFontList->setFocus();
561 // show font dialog for the entry
562 void KNode::AppearanceWidget::slotFontItemActivated( QListWidgetItem *item )
564 if ( item ) {
565 FontListItem *fontItem = static_cast<FontListItem*>( item );
566 QFont font = fontItem->font();
567 const int result = KFontDialog::getFont( font /** by-ref*/,
568 KFontChooser::NoDisplayFlags, this );
570 if (result == KFontDialog::Accepted)
571 fontItem->setFont(font);
573 emit changed(true);
577 void KNode::AppearanceWidget::slotFontChangeBtnClicked()
579 if ( mFontList->currentItem() )
580 slotFontItemActivated( mFontList->currentItem() );
584 void KNode::AppearanceWidget::slotFontSelectionChanged()
586 f_ntChngBtn->setEnabled( mFontList->currentItem() );
590 //=============================================================================================
593 KNode::ReadNewsGeneralWidget::ReadNewsGeneralWidget( const KComponentData &inst, QWidget *parent ) :
594 KCModule( inst, parent )
596 setupUi( this );
597 addConfig( knGlobals.settings(), this );
598 load();
602 void KNode::ReadNewsGeneralWidget::load()
604 KCModule::load();
605 switch ( knGlobals.settings()->dateFormat() ) {
606 case KMime::DateFormatter::CTime: mStandardDateFormat->setChecked( true ); break;
607 case KMime::DateFormatter::Localized: mLocalizedDateFormat->setChecked( true ); break;
608 case KMime::DateFormatter::Fancy: mFancyDateFormat->setChecked( true ); break;
609 case KMime::DateFormatter::Custom: mCustomDateFormat->setChecked( true ); break;
610 case KMime::DateFormatter::Iso: break; // not used
611 case KMime::DateFormatter::Rfc: break; // not used
616 void KNode::ReadNewsGeneralWidget::save()
618 if ( mStandardDateFormat->isChecked() )
619 knGlobals.settings()->setDateFormat( KMime::DateFormatter::CTime );
620 if ( mLocalizedDateFormat->isChecked() )
621 knGlobals.settings()->setDateFormat( KMime::DateFormatter::Localized );
622 if ( mFancyDateFormat->isChecked() )
623 knGlobals.settings()->setDateFormat( KMime::DateFormatter::Fancy );
624 if ( mCustomDateFormat->isChecked() )
625 knGlobals.settings()->setDateFormat( KMime::DateFormatter::Custom );
626 KCModule::save();
629 //=============================================================================================
632 KNode::ReadNewsNavigationWidget::ReadNewsNavigationWidget( const KComponentData &inst, QWidget *parent ) :
633 KCModule( inst, parent )
635 KNode::Ui::ReadNewsNavigationWidgetBase ui;
636 ui.setupUi( this );
637 addConfig( knGlobals.settings(), this );
638 load();
642 //=============================================================================================
645 KNode::ReadNewsViewerWidget::ReadNewsViewerWidget( const KComponentData &inst, QWidget *parent ) :
646 KCModule( inst, parent )
648 KNode::Ui::ReadNewsViewerWidgetBase ui;
649 ui.setupUi( this );
650 addConfig( knGlobals.settings(), this );
651 load();
655 //=============================================================================================
658 KNode::DisplayedHeadersWidget::DisplayedHeadersWidget( DisplayedHeaders *d, const KComponentData &inst, QWidget *parent ) :
659 KCModule( inst, parent ),
660 s_ave( false ),
661 d_ata( d )
663 QGridLayout *topL=new QGridLayout(this);
664 topL->setSpacing(5);
665 topL->setMargin(5);
667 //listbox
668 mHeaderList = new QListWidget( this );
669 connect( mHeaderList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
670 connect( mHeaderList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
671 topL->addWidget( mHeaderList, 0, 0, 7, 1);
673 // buttons
674 a_ddBtn = new QPushButton( i18nc( "@action:button Add a new message header field (open dialog)", "&Add..." ), this );
675 connect(a_ddBtn, SIGNAL(clicked()), this, SLOT(slotAddBtnClicked()));
676 topL->addWidget(a_ddBtn, 0,1);
678 d_elBtn = new QPushButton( i18nc( "@action:button Delete a message header field", "&Delete" ), this);
679 connect(d_elBtn, SIGNAL(clicked()), this, SLOT(slotDelBtnClicked()));
680 topL->addWidget(d_elBtn, 1,1);
682 e_ditBtn=new QPushButton(i18nc("modify something","&Edit..."), this);
683 connect(e_ditBtn, SIGNAL(clicked()), this, SLOT(slotEditBtnClicked()));
684 topL->addWidget(e_ditBtn, 2,1);
686 u_pBtn = new QPushButton( i18nc( "@action:button Move an element of a list up", "&Up" ), this );
687 connect(u_pBtn, SIGNAL(clicked()), this, SLOT(slotUpBtnClicked()));
688 topL->addWidget(u_pBtn, 4,1);
690 d_ownBtn = new QPushButton( i18nc( "@action:button Move an element of a list down", "Do&wn" ), this );
691 connect(d_ownBtn, SIGNAL(clicked()), this, SLOT(slotDownBtnClicked()));
692 topL->addWidget(d_ownBtn, 5,1);
694 topL->addItem( new QSpacerItem( 0,20), 3, 0 ); // separate up/down buttons
695 topL->setRowStretch(6,1); // stretch the listbox
697 slotSelectionChanged(); // disable buttons initially
699 load();
704 void KNode::DisplayedHeadersWidget::load()
706 mHeaderList->clear();
707 KNDisplayedHeader::List list = d_ata->headers();
708 for ( KNDisplayedHeader::List::Iterator it = list.begin(); it != list.end(); ++it )
709 mHeaderList->addItem( generateItem( (*it) ) );
712 void KNode::DisplayedHeadersWidget::save()
714 if(s_ave) {
715 d_ata->setDirty(true);
716 d_ata->save();
718 s_ave = false;
723 KNode::DisplayedHeadersWidget::HdrItem* KNode::DisplayedHeadersWidget::generateItem(KNDisplayedHeader *h)
725 QString text;
726 if(h->hasName()) {
727 text=h->translatedName();
728 text+=": <";
729 } else {
730 text = '<';
732 text+=h->header();
733 text+='>';
734 return new HdrItem(text,h);
739 void KNode::DisplayedHeadersWidget::slotSelectionChanged()
741 int curr = mHeaderList->currentRow();
742 d_elBtn->setEnabled(curr!=-1);
743 e_ditBtn->setEnabled(curr!=-1);
744 u_pBtn->setEnabled(curr>0);
745 d_ownBtn->setEnabled( ( curr != -1 ) && ( curr + 1 != mHeaderList->count() ) );
750 void KNode::DisplayedHeadersWidget::slotAddBtnClicked()
752 KNDisplayedHeader *h=d_ata->createNewHeader();
754 DisplayedHeaderConfDialog* dlg=new DisplayedHeaderConfDialog(h, this);
755 if(dlg->exec()) {
756 mHeaderList->addItem( generateItem( h ) );
757 h->createTags();
758 s_ave=true;
759 } else
760 d_ata->remove(h);
761 emit changed(true);
766 void KNode::DisplayedHeadersWidget::slotDelBtnClicked()
768 if ( !mHeaderList->currentItem() )
769 return;
771 if(KMessageBox::warningContinueCancel(this, i18n("Really delete this header?"),"",KGuiItem(i18n("&Delete"),"edit-delete"))==KMessageBox::Continue) {
772 KNDisplayedHeader *h = ( static_cast<HdrItem*>( mHeaderList->currentItem() ) )->header();
773 d_ata->remove(h);
774 delete mHeaderList->takeItem( mHeaderList->currentRow() );
775 s_ave=true;
777 emit changed(true);
782 void KNode::DisplayedHeadersWidget::slotEditBtnClicked()
784 if ( !mHeaderList->currentItem() )
785 return;
786 KNDisplayedHeader *h = ( static_cast<HdrItem*>( mHeaderList->currentItem() ) )->header();
788 DisplayedHeaderConfDialog* dlg=new DisplayedHeaderConfDialog(h, this);
789 if(dlg->exec()) {
790 int row = mHeaderList->currentRow();
791 delete mHeaderList->takeItem( row );
792 mHeaderList->insertItem( row, generateItem( h ) );
793 mHeaderList->setCurrentRow( row );
794 h->createTags();
795 s_ave=true;
797 emit changed(true);
802 void KNode::DisplayedHeadersWidget::slotUpBtnClicked()
804 int row = mHeaderList->currentRow();
805 if ( row <= 0 )
806 return;
808 KNDisplayedHeader *h = static_cast<HdrItem*>( mHeaderList->currentItem() )->header();
810 d_ata->up(h);
811 mHeaderList->insertItem( row -1, mHeaderList->takeItem( row ) );
812 mHeaderList->setCurrentRow( row - 1 );
813 s_ave=true;
814 emit changed(true);
819 void KNode::DisplayedHeadersWidget::slotDownBtnClicked()
821 int row = mHeaderList->currentRow();
822 if ( row < 0 || row >= mHeaderList->count() )
823 return;
825 KNDisplayedHeader *h = static_cast<HdrItem*>( mHeaderList->currentItem() )->header();
827 d_ata->down(h);
828 mHeaderList->insertItem( row + 1, mHeaderList->takeItem( row ) );
829 mHeaderList->setCurrentRow( row + 1 );
830 s_ave=true;
831 emit changed(true);
835 //=============================================================================================
838 KNode::DisplayedHeaderConfDialog::DisplayedHeaderConfDialog( KNDisplayedHeader *h, QWidget *parent )
839 : KDialog( parent ),
840 h_dr(h)
842 setCaption( i18n("Header Properties") );
843 setButtons( Ok | Cancel | Help );
845 QWidget* page=new QWidget( this );
846 setMainWidget( page );
847 QGridLayout *topL=new QGridLayout(page);
848 topL->setSpacing(5);
849 topL->setMargin(0);
851 QWidget *nameW = new QWidget(page);
852 QGridLayout *nameL=new QGridLayout(nameW);
853 nameL->setSpacing(5);
855 h_drC=new KComboBox(true, nameW);
856 h_drC->lineEdit()->setMaxLength(64);
857 connect(h_drC, SIGNAL(activated(int)), this, SLOT(slotActivated(int)));
858 QLabel *label = new QLabel( i18nc( "@label:textbox Edition of a message header name", "H&eader:" ), nameW );
859 label->setBuddy(h_drC);
860 nameL->addWidget(label,0,0);
861 nameL->addWidget(h_drC,0,1);
863 n_ameE=new KLineEdit(nameW);
865 n_ameE->setMaxLength(64);
866 label = new QLabel( i18nc( "@label:textbox Edition of the displayed name in the UI of a message header", "Displayed na&me:" ), nameW );
867 label->setBuddy(n_ameE);
868 nameL->addWidget(label,1,0);
869 nameL->addWidget(n_ameE,1,1);
870 nameL->setColumnStretch(1,1);
872 topL->addWidget(nameW,0,0, 1, 2 );
874 QGroupBox *ngb = new QGroupBox(i18n("Name"), page);
875 // ### hide style settings for now, the new viewer doesn't support this yet
876 ngb->hide();
877 QVBoxLayout *ngbL = new QVBoxLayout(ngb);
878 ngbL->setSpacing(5);
879 ngbL->setMargin(8);
880 ngbL->addSpacing(fontMetrics().lineSpacing()-4);
881 n_ameCB[0]=new QCheckBox(i18n("&Large"), ngb);
882 n_ameCB[1]=new QCheckBox(i18n("&Bold"), ngb);
883 n_ameCB[2]=new QCheckBox(i18n("&Italic"), ngb);
884 n_ameCB[3]=new QCheckBox(i18n("&Underlined"), ngb);
885 for( int i = 0 ; i < 4 ; ++i) {
886 ngbL->addWidget( n_ameCB[i] );
888 topL->addWidget(ngb,1,0);
890 QGroupBox *vgb=new QGroupBox(i18n("Value"), page);
891 // ### hide style settings for now, the new viewer doen't support this yet
892 vgb->hide();
893 QVBoxLayout *vgbL = new QVBoxLayout(vgb);
894 vgbL->setSpacing(5);
895 vgbL->setMargin(8);
896 vgbL->addSpacing(fontMetrics().lineSpacing()-4);
897 v_alueCB[0]=new QCheckBox(i18n("L&arge"), vgb);
898 v_alueCB[1]=new QCheckBox(i18n("Bol&d"), vgb);
899 v_alueCB[2]=new QCheckBox(i18n("I&talic"), vgb);
900 v_alueCB[3]=new QCheckBox(i18n("U&nderlined"), vgb);
901 for( int i = 0 ; i < 4 ; ++i) {
902 vgbL->addWidget( v_alueCB[i] );
904 topL->addWidget(vgb,1,1);
906 topL->setColumnStretch(0,1);
907 topL->setColumnStretch(1,1);
909 // preset values...
910 h_drC->addItems( KNDisplayedHeader::predefs() );
911 h_drC->lineEdit()->setText(h->header());
912 n_ameE->setText(h->translatedName());
913 for(int i=0; i<4; ++i) {
914 n_ameCB[i]->setChecked(h->flag(i));
915 v_alueCB[i]->setChecked(h->flag(i+4));
918 setFixedHeight(sizeHint().height());
919 KNHelper::restoreWindowSize("accReadHdrPropDLG", this, sizeHint());
921 connect(n_ameE, SIGNAL(textChanged(QString)), SLOT(slotNameChanged(QString)));
923 setHelp("anc-knode-headers");
924 slotNameChanged( n_ameE->text() );
925 connect(this,SIGNAL(okClicked()),SLOT(slotOk()));
929 KNode::DisplayedHeaderConfDialog::~DisplayedHeaderConfDialog()
931 KNHelper::saveWindowSize("accReadHdrPropDLG", size());
935 void KNode::DisplayedHeaderConfDialog::slotOk()
937 h_dr->setHeader(h_drC->currentText());
938 h_dr->setTranslatedName(n_ameE->text());
939 for(int i=0; i<4; ++i) {
940 if(h_dr->hasName())
941 h_dr->setFlag(i, n_ameCB[i]->isChecked());
942 else
943 h_dr->setFlag(i,false);
944 h_dr->setFlag(i+4, v_alueCB[i]->isChecked());
946 accept();
950 // the user selected one of the presets, insert the *translated* string as display name:
951 void KNode::DisplayedHeaderConfDialog::slotActivated(int pos)
953 n_ameE->setText(i18n(h_drC->itemText(pos).toLocal8Bit())); // I think it's save here, the combobox has only english defaults
957 // disable the name format options when the name is empty
958 void KNode::DisplayedHeaderConfDialog::slotNameChanged(const QString& str)
960 for(int i=0; i<4; ++i)
961 n_ameCB[i]->setEnabled(!str.isEmpty());
964 //=============================================================================================
967 KNode::ScoringWidget::ScoringWidget( const KComponentData &inst, QWidget *parent ) :
968 KCModule( inst, parent )
970 QGridLayout *topL = new QGridLayout(this);
971 topL->setSpacing(5);
972 topL->setMargin(5);
973 mKsc = new KScoringEditorWidget( knGlobals.scoringManager(), this );
974 topL->addWidget( mKsc, 0, 0, 1, 2 );
976 topL->addItem( new QSpacerItem( 0, 10), 1, 0 );
978 mIgnored = new KIntSpinBox( -100000, 100000, 1, 0, this );
979 mIgnored->setObjectName( "kcfg_ignoredThreshold" );
980 QLabel *l = new QLabel( i18n("Default score for &ignored threads:"), this );
981 l->setBuddy( mIgnored );
982 topL->addWidget(l, 2, 0);
983 topL->addWidget( mIgnored, 2, 1 );
985 mWatched = new KIntSpinBox( -100000, 100000, 1, 0, this );
986 mWatched->setObjectName( "kcfg_watchedThreshold" );
987 l = new QLabel( i18n("Default score for &watched threads:"), this );
988 l->setBuddy( mWatched );
989 topL->addWidget(l, 3, 0);
990 topL->addWidget( mWatched, 3, 1);
992 topL->setColumnStretch(0, 1);
994 addConfig( knGlobals.settings(), this );
995 load();
999 //=============================================================================================
1002 KNode::FilterListWidget::FilterListWidget( const KComponentData &inst, QWidget *parent ) :
1003 KCModule( inst, parent ),
1004 f_ilManager( knGlobals.filterManager() )
1006 QGridLayout *topL=new QGridLayout(this);
1007 topL->setSpacing(5);
1008 topL->setMargin(5);
1010 // == Filters =================================================
1012 mFilterList = new QListWidget( this );
1013 QLabel *label = new QLabel( i18nc("@title", "&Filters:" ), this );
1014 label->setBuddy(mFilterList);
1015 topL->addWidget( label, 0, 0 );
1017 connect( mFilterList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChangedFilter()) );
1018 connect( mFilterList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
1019 topL->addWidget( mFilterList, 1, 0, 5, 1);
1021 a_ddBtn = new QPushButton( i18nc("@action:button Add a new filter", "&Add..." ), this );
1022 connect(a_ddBtn, SIGNAL(clicked()), this, SLOT(slotAddBtnClicked()));
1023 topL->addWidget(a_ddBtn,1,1);
1025 e_ditBtn=new QPushButton(i18nc("modify something","&Edit..."), this);
1026 connect(e_ditBtn, SIGNAL(clicked()), this, SLOT(slotEditBtnClicked()));
1027 topL->addWidget(e_ditBtn,2,1);
1029 c_opyBtn = new QPushButton( i18nc( "@action:button Copy a filter", "Co&py..."), this);
1030 connect(c_opyBtn, SIGNAL(clicked()), this, SLOT(slotCopyBtnClicked()));
1031 topL->addWidget(c_opyBtn,3,1);
1033 d_elBtn = new QPushButton( i18nc( "@action:button Delete a filter", "&Delete"), this);
1034 connect(d_elBtn, SIGNAL(clicked()), this, SLOT(slotDelBtnClicked()));
1035 topL->addWidget(d_elBtn,4,1);
1037 // == Menu ====================================================
1039 mMenuList = new QListWidget( this );
1040 label = new QLabel( i18nc( "@title", "&Menu:"), this );
1041 label->setBuddy(mMenuList);
1042 topL->addWidget( label, 6, 0 );
1044 connect( mMenuList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChangedMenu()) );
1045 topL->addWidget( mMenuList, 7, 0, 5, 1);
1047 u_pBtn = new QPushButton( i18nc( "@action:button move something up in a list", "&Up"), this );
1048 connect(u_pBtn, SIGNAL(clicked()), this, SLOT(slotUpBtnClicked()));
1049 topL->addWidget(u_pBtn,7,1);
1051 d_ownBtn = new QPushButton( i18nc( "@action:button move something down in a list", "Do&wn"), this );
1052 connect(d_ownBtn, SIGNAL(clicked()), this, SLOT(slotDownBtnClicked()));
1053 topL->addWidget(d_ownBtn,8,1);
1055 s_epAddBtn = new QPushButton( i18nc( "@action:button", "Add\n&Separator" ), this );
1056 connect(s_epAddBtn, SIGNAL(clicked()), this, SLOT(slotSepAddBtnClicked()));
1057 topL->addWidget(s_epAddBtn,9,1);
1059 s_epRemBtn = new QPushButton( i18nc( "@action:button", "&Remove\nSeparator" ), this );
1060 connect(s_epRemBtn, SIGNAL(clicked()), this, SLOT(slotSepRemBtnClicked()));
1061 topL->addWidget(s_epRemBtn,10,1);
1063 topL->setRowStretch(5,1);
1064 topL->setRowStretch(11,1);
1066 a_ctive = SmallIcon("view-filter",16);
1067 d_isabled = SmallIcon("view-filter",16,KIconLoader::DisabledState);
1069 load();
1071 slotSelectionChangedFilter();
1072 slotSelectionChangedMenu();
1076 KNode::FilterListWidget::~FilterListWidget()
1078 f_ilManager->endConfig();
1082 void KNode::FilterListWidget::load()
1084 mFilterList->clear();
1085 mMenuList->clear();
1086 f_ilManager->startConfig(this);
1089 void KNode::FilterListWidget::save()
1091 f_ilManager->commitChanges();
1095 void KNode::FilterListWidget::addItem(KNArticleFilter *f)
1097 FilterListItem *item = new FilterListItem( f , f->translatedName() );
1098 if(f->isEnabled())
1099 item->setIcon( a_ctive );
1100 else
1101 item->setIcon( d_isabled );
1102 mFilterList->addItem( item );
1103 slotSelectionChangedFilter();
1104 emit changed(true);
1108 void KNode::FilterListWidget::removeItem(KNArticleFilter *f)
1110 int i = findItem( mFilterList, f );
1111 if ( i >= 0 )
1112 delete mFilterList->takeItem( i );
1113 slotSelectionChangedFilter();
1114 emit changed(true);
1118 void KNode::FilterListWidget::updateItem(KNArticleFilter *f)
1120 int i = findItem( mFilterList, f );
1122 if ( i >= 0 ) {
1123 FilterListItem *item = static_cast<FilterListItem*>( mFilterList->item( i ) );
1124 item->setText( f->translatedName() );
1125 if ( f->isEnabled() ) {
1126 item->setIcon( a_ctive );
1127 i = findItem( mMenuList, f );
1128 if ( i >= 0 )
1129 mMenuList->item( i )->setText( f->translatedName() );
1130 } else
1131 item->setIcon( d_isabled );
1133 slotSelectionChangedFilter();
1134 emit changed(true);
1138 void KNode::FilterListWidget::addMenuItem(KNArticleFilter *f)
1140 if (f) {
1141 if ( findItem( mMenuList, f) < 0 )
1142 mMenuList->addItem( new FilterListItem( f, f->translatedName() ) );
1143 } else // separator
1144 mMenuList->addItem( new FilterListItem( 0, "===" ) );
1145 slotSelectionChangedMenu();
1146 emit changed(true);
1150 void KNode::FilterListWidget::removeMenuItem(KNArticleFilter *f)
1152 int i = findItem( mMenuList, f );
1153 if ( i >= 0 )
1154 delete mMenuList->takeItem( i );
1155 slotSelectionChangedMenu();
1156 emit changed(true);
1160 QList<int> KNode::FilterListWidget::menuOrder()
1162 KNArticleFilter *f;
1163 QList<int> lst;
1165 for( int i = 0; i < mMenuList->count(); ++i ) {
1166 f = static_cast<FilterListItem*>( mMenuList->item( i ) )->filter();
1167 if ( f )
1168 lst << f->id();
1169 else
1170 lst << -1;
1172 return lst;
1176 int KNode::FilterListWidget::findItem( QListWidget *l, KNArticleFilter *f )
1178 for ( int i = 0; i < l->count(); ++i )
1179 if ( static_cast<FilterListItem*>( l->item( i ) )->filter() == f )
1180 return i;
1181 return -1;
1185 void KNode::FilterListWidget::slotAddBtnClicked()
1187 f_ilManager->newFilter();
1191 void KNode::FilterListWidget::slotDelBtnClicked()
1193 if ( mFilterList->currentItem() )
1194 f_ilManager->deleteFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
1198 void KNode::FilterListWidget::slotEditBtnClicked()
1200 if ( mFilterList->currentItem() )
1201 f_ilManager->editFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
1205 void KNode::FilterListWidget::slotCopyBtnClicked()
1207 if ( mFilterList->currentItem() )
1208 f_ilManager->copyFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
1212 void KNode::FilterListWidget::slotUpBtnClicked()
1214 int row = mMenuList->currentRow();
1215 if ( row <= 0)
1216 return;
1217 mMenuList->insertItem( row - 1, mMenuList->takeItem( row ) );
1218 mMenuList->setCurrentRow( row - 1 );
1219 emit changed(true);
1223 void KNode::FilterListWidget::slotDownBtnClicked()
1225 int row = mMenuList->currentRow();
1226 if ( row < 0 || row > mMenuList->count() - 1 )
1227 return;
1228 mMenuList->insertItem( row + 1, mMenuList->takeItem( row ) );
1229 mMenuList->setCurrentRow( row + 1 );
1230 emit changed(true);
1234 void KNode::FilterListWidget::slotSepAddBtnClicked()
1236 mMenuList->insertItem( mMenuList->currentRow(), new FilterListItem( 0, "===" ) );
1237 slotSelectionChangedMenu();
1238 emit changed(true);
1242 void KNode::FilterListWidget::slotSepRemBtnClicked()
1244 FilterListItem *item = static_cast<FilterListItem*>( mMenuList->currentItem() );
1245 if ( item && item->filter() == 0 )
1246 delete item;
1247 slotSelectionChangedMenu();
1248 emit changed(true);
1252 void KNode::FilterListWidget::slotSelectionChangedFilter()
1254 QListWidgetItem *item = mFilterList->currentItem();
1256 d_elBtn->setEnabled( item );
1257 e_ditBtn->setEnabled( item );
1258 c_opyBtn->setEnabled( item );
1262 void KNode::FilterListWidget::slotSelectionChangedMenu()
1264 int current = mMenuList->currentRow();
1266 u_pBtn->setEnabled( current > 0 );
1267 d_ownBtn->setEnabled( current >= 0 && ( current < mMenuList->count() - 1 ) );
1268 s_epRemBtn->setEnabled( current >= 0 && ( static_cast<FilterListItem*>( mMenuList->item( current ) )->filter() == 0 ) );
1272 //=============================================================================================
1275 KNode::PostNewsTechnicalWidget::PostNewsTechnicalWidget( const KComponentData &inst, QWidget *parent ) :
1276 KCModule( inst, parent )
1278 setupUi( this );
1280 mCharset->addItems( KNode::Utilities::Locale::encodings() );
1281 mEncoding->addItem( i18n("Allow 8-bit") );
1282 mEncoding->addItem( i18n("7-bit (Quoted-Printable)") );
1284 connect( mHeaderList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
1285 connect( mHeaderList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
1287 connect( mAddButton, SIGNAL(clicked()), SLOT(slotAddBtnClicked()) );
1288 connect( mEditButton, SIGNAL(clicked()), SLOT(slotEditBtnClicked()) );
1289 connect( mDeleteButton, SIGNAL(clicked()), SLOT(slotDelBtnClicked()) );
1291 addConfig( knGlobals.settings(), this );
1292 load();
1294 slotSelectionChanged();
1298 void KNode::PostNewsTechnicalWidget::load()
1300 KCModule::load();
1302 QString charsetDesc = KGlobal::charsets()->descriptionForEncoding( knGlobals.settings()->charset() );
1303 mCharset->setCurrentIndex( mCharset->findText( charsetDesc ) );
1304 mEncoding->setCurrentIndex( knGlobals.settings()->allow8BitBody() ? 0 : 1 );
1306 mHeaderList->clear();
1307 XHeader::List list = knGlobals.settings()->xHeaders();
1308 for ( XHeader::List::Iterator it = list.begin(); it != list.end(); ++it )
1309 mHeaderList->addItem( (*it).header() );
1313 void KNode::PostNewsTechnicalWidget::save()
1315 QString charset = KGlobal::charsets()->encodingForName( mCharset->currentText() );
1316 knGlobals.settings()->setCharset( charset );
1317 knGlobals.settings()->setAllow8BitBody( mEncoding->currentIndex() == 0 );
1319 XHeader::List list;
1320 for ( int i = 0; i < mHeaderList->count(); ++i )
1321 list.append( XHeader( mHeaderList->item( i )->text() ) );
1322 knGlobals.settings()->setXHeaders( list );
1324 KCModule::save();
1328 void KNode::PostNewsTechnicalWidget::slotSelectionChanged()
1330 mDeleteButton->setEnabled( mHeaderList->currentItem() != 0 );
1331 mEditButton->setEnabled( mHeaderList->currentItem() != 0 );
1335 void KNode::PostNewsTechnicalWidget::slotAddBtnClicked()
1337 XHeaderConfDialog *dlg = new XHeaderConfDialog( QString(), this );
1338 if ( dlg->exec() )
1339 mHeaderList->addItem( dlg->result() );
1341 delete dlg;
1343 slotSelectionChanged();
1344 emit changed( true );
1348 void KNode::PostNewsTechnicalWidget::slotDelBtnClicked()
1350 QListWidgetItem *item = mHeaderList->currentItem();
1351 if ( !item )
1352 return;
1353 delete item;
1354 slotSelectionChanged();
1355 emit changed( true );
1359 void KNode::PostNewsTechnicalWidget::slotEditBtnClicked()
1361 QListWidgetItem *item = mHeaderList->currentItem();
1362 if ( !item )
1363 return;
1365 XHeaderConfDialog *dlg = new XHeaderConfDialog( item->text(), this );
1366 if ( dlg->exec() )
1367 item->setText( dlg->result() );
1369 delete dlg;
1371 slotSelectionChanged();
1372 emit changed( true );
1376 //===================================================================================================
1379 KNode::XHeaderConfDialog::XHeaderConfDialog( const QString &h, QWidget *parent ) :
1380 KDialog( parent )
1382 setCaption( i18n("Additional Header") );
1383 setButtons( Ok | Cancel );
1385 KHBox* page = new KHBox( this );
1386 setMainWidget( page );
1388 mNameEdit = new KLineEdit( page );
1389 new QLabel( ":", page );
1390 mValueEdit = new KLineEdit( page );
1392 int pos = h.indexOf( ": " );
1393 if ( pos != -1 ) {
1394 mNameEdit->setText( h.left( pos ) );
1395 pos += 2;
1396 mValueEdit->setText( h.right( h.length() - pos ) );
1399 setFixedHeight(sizeHint().height());
1400 KNHelper::restoreWindowSize("XHeaderDlg", this, sizeHint());
1402 mNameEdit->setFocus();
1406 KNode::XHeaderConfDialog::~XHeaderConfDialog()
1408 KNHelper::saveWindowSize("XHeaderDlg", size());
1412 QString KNode::XHeaderConfDialog::result() const
1414 QString value = mValueEdit->text();
1415 // just in case someone pastes a newline
1416 value.replace( '\n', ' ' );
1417 return mNameEdit->text() + ": " + value;
1421 //===================================================================================================
1424 KNode::PostNewsComposerWidget::PostNewsComposerWidget( const KComponentData &inst, QWidget *parent ) :
1425 KCModule( inst, parent )
1427 KNode::Ui::PostNewsComposerWidgetBase ui;
1428 ui.setupUi( this );
1429 addConfig( knGlobals.settings(), this );
1430 load();
1434 //===================================================================================================
1437 KNode::PostNewsSpellingWidget::PostNewsSpellingWidget( const KComponentData &inst, QWidget *parent ) :
1438 KCModule( inst, parent )
1440 QVBoxLayout *topL=new QVBoxLayout(this);
1441 topL->setSpacing(5);
1443 c_conf = new Sonnet::ConfigWidget(KNGlobals::self()->config(), this );
1444 topL->addWidget(c_conf);
1445 connect(c_conf, SIGNAL(configChanged()), SLOT(changed()));
1447 topL->addStretch(1);
1451 KNode::PostNewsSpellingWidget::~PostNewsSpellingWidget()
1456 void KNode::PostNewsSpellingWidget::save()
1458 c_conf->save();
1462 //==============================================================================================================
1464 KNode::PrivacyWidget::PrivacyWidget( const KComponentData &inst,QWidget *parent ) :
1465 KCModule(inst, parent )
1467 QBoxLayout *topLayout = new QVBoxLayout(this);
1468 topLayout->setSpacing(5);
1469 c_onf = new Kpgp::Config( this, false );
1470 c_onf->setObjectName( "knode pgp config" );
1471 topLayout->addWidget(c_onf);
1472 connect(c_onf, SIGNAL(changed()), SLOT(changed()));
1474 topLayout->addStretch(1);
1476 load();
1480 KNode::PrivacyWidget::~PrivacyWidget()
1485 void KNode::PrivacyWidget::save()
1487 c_onf->applySettings();
1491 //==============================================================================================================
1494 //BEGIN: Cleanup configuration widgets ---------------------------------------
1497 KNode::GroupCleanupWidget::GroupCleanupWidget( Cleanup *data, QWidget *parent )
1498 : QWidget( parent ), mData( data )
1500 QVBoxLayout *top = new QVBoxLayout( this );
1502 if (!mData->isGlobal()) {
1503 mDefault = new QCheckBox( i18n("&Use global cleanup configuration"), this );
1504 connect( mDefault, SIGNAL(toggled(bool)), SLOT(slotDefaultToggled(bool)) );
1505 top->addWidget( mDefault );
1508 mExpGroup = new QGroupBox( i18n("Newsgroup Cleanup Settings"), this );
1509 top->addWidget( mExpGroup );
1510 QGridLayout *grid = new QGridLayout( mExpGroup );
1511 grid->setSpacing( KDialog::spacingHint() );
1512 grid->setMargin( KDialog::marginHint() );
1514 grid->setRowMinimumHeight( 0, KDialog::spacingHint() );
1516 mExpEnabled = new QCheckBox( i18n("&Expire old articles automatically"), mExpGroup );
1517 grid->addWidget( mExpEnabled, 1, 0, 1, 2 );
1518 connect( mExpEnabled, SIGNAL(toggled(bool)), SIGNAL(changed()) );
1520 mExpDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
1521 mExpDays->setSuffix(ki18np(" day", " days"));
1522 QLabel *label = new QLabel( i18n("&Purge groups every:"), mExpGroup );
1523 label->setBuddy( mExpDays );
1524 grid->addWidget( label, 2, 0 );
1525 grid->addWidget( mExpDays, 2, 1, Qt::AlignRight );
1526 connect( mExpDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
1527 connect( mExpEnabled, SIGNAL(toggled(bool)), label, SLOT(setEnabled(bool)) );
1528 connect( mExpEnabled, SIGNAL(toggled(bool)), mExpDays, SLOT(setEnabled(bool)) );
1530 mExpReadDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
1531 mExpReadDays->setSuffix(ki18np(" day", " days"));
1532 label = new QLabel( i18n("&Keep read articles:"), mExpGroup );
1533 label->setBuddy( mExpReadDays );
1534 grid->addWidget( label, 3, 0 );
1535 grid->addWidget( mExpReadDays, 3, 1, Qt::AlignRight );
1536 connect( mExpReadDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
1538 mExpUnreadDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
1539 mExpUnreadDays->setSuffix(ki18np(" day", " days"));
1540 label = new QLabel( i18n("Keep u&nread articles:"), mExpGroup );
1541 label->setBuddy( mExpUnreadDays );
1542 grid->addWidget( label, 4, 0 );
1543 grid->addWidget( mExpUnreadDays, 4, 1, Qt::AlignRight );
1544 connect( mExpUnreadDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
1546 mExpUnavailable = new QCheckBox( i18n("&Remove articles that are not available on the server"), mExpGroup );
1547 grid->addWidget( mExpUnavailable, 5, 0, 1, 2 );
1548 connect( mExpUnavailable, SIGNAL(toggled(bool)), SIGNAL(changed()) );
1550 mPreserveThreads = new QCheckBox( i18n("Preser&ve threads"), mExpGroup );
1551 grid->addWidget( mPreserveThreads, 6, 0, 1, 2 );
1552 connect( mPreserveThreads, SIGNAL(toggled(bool)), SIGNAL(changed()) );
1554 grid->setColumnStretch(1,1);
1558 void KNode::GroupCleanupWidget::load()
1560 if (!mData->isGlobal()) {
1561 mDefault->setChecked( mData->useDefault() );
1562 slotDefaultToggled( mData->useDefault() );
1564 mExpEnabled->setChecked( !mData->d_oExpire ); // make sure the toggled(bool) signal is emitted at least once
1565 mExpEnabled->setChecked( mData->d_oExpire );
1566 mExpDays->setValue( mData->e_xpireInterval );
1567 mExpReadDays->setValue( mData->maxAgeForRead() );
1568 mExpUnreadDays->setValue( mData->maxAgeForUnread() );
1569 mExpUnavailable->setChecked( mData->removeUnavailable() );
1570 mPreserveThreads->setChecked( mData->preserveThreads() );
1574 void KNode::GroupCleanupWidget::save()
1576 if (!mData->isGlobal())
1577 mData->setUseDefault( mDefault->isChecked() );
1578 mData->d_oExpire = mExpEnabled->isChecked();
1579 mData->e_xpireInterval = mExpDays->value();
1580 mData->r_eadMaxAge = mExpReadDays->value();
1581 mData->u_nreadMaxAge = mExpUnreadDays->value();
1582 mData->r_emoveUnavailable = mExpUnavailable->isChecked();
1583 mData->p_reserveThr = mPreserveThreads->isChecked();
1587 void KNode::GroupCleanupWidget::slotDefaultToggled( bool state )
1589 mExpGroup->setEnabled( !state );
1593 KNode::CleanupWidget::CleanupWidget( const KComponentData &inst,QWidget *parent ) :
1594 KCModule(inst, parent ),
1595 d_ata( knGlobals.configManager()->cleanup() )
1597 QVBoxLayout *topL=new QVBoxLayout(this);
1598 topL->setSpacing(5);
1600 mGroupCleanup = new GroupCleanupWidget( d_ata, this );
1601 topL->addWidget( mGroupCleanup );
1602 connect( mGroupCleanup, SIGNAL(changed()), SLOT(changed()) );
1604 // === folders =========================================================
1606 QGroupBox *foldersB = new QGroupBox( i18n("Folders"), this );
1607 topL->addWidget(foldersB);
1608 QGridLayout *foldersL = new QGridLayout( foldersB );
1609 foldersL->setSpacing( KDialog::spacingHint() );
1610 foldersL->setMargin( KDialog::marginHint() );
1612 foldersL->setRowMinimumHeight( 0, KDialog::spacingHint() );
1614 f_olderCB=new QCheckBox(i18n("Co&mpact folders automatically"), foldersB);
1615 connect(f_olderCB, SIGNAL(toggled(bool)), this, SLOT(slotFolderCBtoggled(bool)));
1616 foldersL->addWidget(f_olderCB,1,0, 1, 2 );
1618 f_olderDays=new KIntSpinBox( 0, 99999, 1, 0, foldersB );
1619 f_olderDays->setSuffix(ki18np(" day", " days"));
1620 f_olderDaysL=new QLabel(i18n("P&urge folders every:"),foldersB);
1621 f_olderDaysL->setBuddy(f_olderDays);
1622 foldersL->addWidget(f_olderDaysL,2,0);
1623 foldersL->addWidget(f_olderDays,2,1,Qt::AlignRight);
1624 connect(f_olderDays, SIGNAL(valueChanged(int)), SLOT(changed()));
1626 foldersL->setColumnStretch(1,1);
1628 topL->addStretch(1);
1630 load();
1634 KNode::CleanupWidget::~CleanupWidget()
1639 void KNode::CleanupWidget::load()
1641 f_olderCB->setChecked(d_ata->d_oCompact);
1642 slotFolderCBtoggled(d_ata->d_oCompact);
1643 f_olderDays->setValue(d_ata->c_ompactInterval);
1644 mGroupCleanup->load();
1648 void KNode::CleanupWidget::save()
1650 d_ata->d_oCompact=f_olderCB->isChecked();
1651 d_ata->c_ompactInterval=f_olderDays->value();
1653 mGroupCleanup->save();
1655 d_ata->setDirty(true);
1659 void KNode::CleanupWidget::slotFolderCBtoggled(bool b)
1661 f_olderDaysL->setEnabled(b);
1662 f_olderDays->setEnabled(b);
1663 emit changed(true);
1666 //END: Cleanup configuration widgets -----------------------------------------
1668 //------------------------
1669 #include "knconfigwidgets.moc"