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"
32 #include "utils/locale.h"
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
)
55 connect( mAccountList
, SIGNAL(itemDoubleClicked(QListWidgetItem
*)), SLOT(slotEditBtnClicked()) );
56 connect( mAccountList
, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
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()) );
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
)
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
);
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
);
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
);
134 mServerInfo
->setText( i18n("Server: %1", item
->account()->server() ) );
135 mPortInfo
->setText( i18n("Port: %1", item
->account()->port() ) );
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
))
156 void KNode::NntpAccountListWidget::slotDelBtnClicked()
158 AccountListItem
*item
= static_cast<AccountListItem
*>( mAccountList
->currentItem() );
160 knGlobals
.accountManager()->removeAccount( item
->account() );
165 void KNode::NntpAccountListWidget::slotEditBtnClicked()
167 AccountListItem
*item
= static_cast<AccountListItem
*>( mAccountList
->currentItem() );
169 item
->account()->editProperties( this );
170 slotUpdateItem( item
->account() );
175 void KNode::NntpAccountListWidget::slotSubBtnClicked()
177 AccountListItem
*item
= static_cast<AccountListItem
*>( mAccountList
->currentItem() );
179 knGlobals
.groupManager()->showGroupDialog( item
->account(), this );
183 //=======================================================================================
186 KNode::NntpAccountConfDialog::NntpAccountConfDialog( KNNntpAccount
*a
, QWidget
*parent
) :
187 KPageDialog( parent
),
189 mUseServerForName( false )
192 setCaption( i18n("Properties of %1", a
->name()) );
194 setCaption( i18n("New Account") );
195 setFaceType( Tabbed
);
196 setButtons( Ok
| Cancel
| Help
);
197 setDefaultButton( Ok
);
200 QFrame
* page
= new QFrame( this );
201 addPage( page
, i18n("Ser&ver") );
204 mName
->setText( a
->name() );
205 mServer
->setText( a
->server() );
206 mPort
->setValue( a
->port() );
208 // don't know how to set this in KDE4, where no related methods exists
209 mPort
->setSliderEnabled( false );
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() );
225 if ( a
->needsLogon() )
226 knGlobals
.accountManager()->loadPasswordsAsync();
228 switch ( mAccount
->encryption() ) {
229 case KNServerInfo::None
:
230 mEncNone
->setChecked( true );
232 case KNServerInfo::SSL
:
233 mEncSSL
->setChecked( true );
235 case KNServerInfo::TLS
:
236 mEncTLS
->setChecked( true );
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"));
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."));
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();
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
)
356 void KNode::AppearanceWidget::ColorListItem::setColor( const QColor
&color
)
359 int height
= QFontMetrics( font() ).height();
360 QPixmap
icon( height
, height
);
362 p
.setPen( Qt::black
);
363 p
.drawRect( 0, 0, height
- 1, height
- 1 );
364 p
.fillRect( 1, 1, height
- 2, height
- 2, color
);
367 listWidget()->update();
371 //===================================================================================
374 KNode::AppearanceWidget::FontListItem::FontListItem( const QString
&text
, const QFont
&font
, QListWidget
*parent
) :
375 QListWidgetItem( parent
),
382 void KNode::AppearanceWidget::FontListItem::setFont( const QFont
&font
)
385 setText( QString("[%1 %2] %3").arg( mFont
.family() ).arg( mFont
.pointSize() ).arg( mText
) );
387 listWidget()->update();
391 //===================================================================================
394 KNode::AppearanceWidget::AppearanceWidget( const KComponentData
&inst
, QWidget
*parent
) :
395 KCModule(inst
, parent
)
397 QGridLayout
*topL
= new QGridLayout( this );
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 );
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 );
436 void KNode::AppearanceWidget::load()
440 slotColCheckBoxToggled( c_olorCB
->isChecked() );
441 slotFontCheckBoxToggled( f_ontCB
->isChecked() );
443 KConfigSkeletonItem::List items
= knGlobals
.settings()->items();
445 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
446 KConfigSkeleton::ItemColor
*item
= dynamic_cast<KConfigSkeleton::ItemColor
*>( *it
);
448 mColorList
->addItem( new ColorListItem( item
->label(), item
->value() ) );
452 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
453 KConfigSkeleton::ItemFont
*item
= dynamic_cast<KConfigSkeleton::ItemFont
*>( *it
);
455 mFontList
->addItem( new FontListItem( item
->label(), item
->value() ) );
460 void KNode::AppearanceWidget::save()
462 KConfigSkeletonItem::List items
= knGlobals
.settings()->items();
464 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
465 KConfigSkeleton::ItemColor
*item
= dynamic_cast<KConfigSkeleton::ItemColor
*>( *it
);
468 item
->setValue( static_cast<ColorListItem
*>( mColorList
->item( row
) )->color() );
473 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
474 KConfigSkeleton::ItemFont
*item
= dynamic_cast<KConfigSkeleton::ItemFont
*>( *it
);
477 item
->setValue( static_cast<FontListItem
*>( mFontList
->item( row
) )->font() );
483 knGlobals
.configManager()->appearance()->recreateLVIcons();
487 void KNode::AppearanceWidget::defaults()
489 KCModule::defaults();
491 KConfigSkeletonItem::List items
= knGlobals
.settings()->items();
493 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
494 KConfigSkeleton::ItemColor
*item
= dynamic_cast<KConfigSkeleton::ItemColor
*>( *it
);
498 static_cast<ColorListItem
*>( mColorList
->item( row
) )->setColor( item
->value() );
503 for ( KConfigSkeletonItem::List::Iterator it
= items
.begin(); it
!= items
.end(); ++it
) {
504 KConfigSkeleton::ItemFont
*item
= dynamic_cast<KConfigSkeleton::ItemFont
*>( *it
);
508 static_cast<FontListItem
*>( mFontList
->item( row
) )->setFont( item
->value() );
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
)
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
);
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
)
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
);
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
)
597 addConfig( knGlobals
.settings(), this );
602 void KNode::ReadNewsGeneralWidget::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
);
629 //=============================================================================================
632 KNode::ReadNewsNavigationWidget::ReadNewsNavigationWidget( const KComponentData
&inst
, QWidget
*parent
) :
633 KCModule( inst
, parent
)
635 KNode::Ui::ReadNewsNavigationWidgetBase ui
;
637 addConfig( knGlobals
.settings(), this );
642 //=============================================================================================
645 KNode::ReadNewsViewerWidget::ReadNewsViewerWidget( const KComponentData
&inst
, QWidget
*parent
) :
646 KCModule( inst
, parent
)
648 KNode::Ui::ReadNewsViewerWidgetBase ui
;
650 addConfig( knGlobals
.settings(), this );
655 //=============================================================================================
658 KNode::DisplayedHeadersWidget::DisplayedHeadersWidget( DisplayedHeaders
*d
, const KComponentData
&inst
, QWidget
*parent
) :
659 KCModule( inst
, parent
),
663 QGridLayout
*topL
=new QGridLayout(this);
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);
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
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()
715 d_ata
->setDirty(true);
723 KNode::DisplayedHeadersWidget::HdrItem
* KNode::DisplayedHeadersWidget::generateItem(KNDisplayedHeader
*h
)
727 text
=h
->translatedName();
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);
756 mHeaderList
->addItem( generateItem( h
) );
766 void KNode::DisplayedHeadersWidget::slotDelBtnClicked()
768 if ( !mHeaderList
->currentItem() )
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();
774 delete mHeaderList
->takeItem( mHeaderList
->currentRow() );
782 void KNode::DisplayedHeadersWidget::slotEditBtnClicked()
784 if ( !mHeaderList
->currentItem() )
786 KNDisplayedHeader
*h
= ( static_cast<HdrItem
*>( mHeaderList
->currentItem() ) )->header();
788 DisplayedHeaderConfDialog
* dlg
=new DisplayedHeaderConfDialog(h
, this);
790 int row
= mHeaderList
->currentRow();
791 delete mHeaderList
->takeItem( row
);
792 mHeaderList
->insertItem( row
, generateItem( h
) );
793 mHeaderList
->setCurrentRow( row
);
802 void KNode::DisplayedHeadersWidget::slotUpBtnClicked()
804 int row
= mHeaderList
->currentRow();
808 KNDisplayedHeader
*h
= static_cast<HdrItem
*>( mHeaderList
->currentItem() )->header();
811 mHeaderList
->insertItem( row
-1, mHeaderList
->takeItem( row
) );
812 mHeaderList
->setCurrentRow( row
- 1 );
819 void KNode::DisplayedHeadersWidget::slotDownBtnClicked()
821 int row
= mHeaderList
->currentRow();
822 if ( row
< 0 || row
>= mHeaderList
->count() )
825 KNDisplayedHeader
*h
= static_cast<HdrItem
*>( mHeaderList
->currentItem() )->header();
828 mHeaderList
->insertItem( row
+ 1, mHeaderList
->takeItem( row
) );
829 mHeaderList
->setCurrentRow( row
+ 1 );
835 //=============================================================================================
838 KNode::DisplayedHeaderConfDialog::DisplayedHeaderConfDialog( KNDisplayedHeader
*h
, QWidget
*parent
)
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
);
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
877 QVBoxLayout
*ngbL
= new QVBoxLayout(ngb
);
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
893 QVBoxLayout
*vgbL
= new QVBoxLayout(vgb
);
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);
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
) {
941 h_dr
->setFlag(i
, n_ameCB
[i
]->isChecked());
943 h_dr
->setFlag(i
,false);
944 h_dr
->setFlag(i
+4, v_alueCB
[i
]->isChecked());
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);
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 );
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);
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
);
1071 slotSelectionChangedFilter();
1072 slotSelectionChangedMenu();
1076 KNode::FilterListWidget::~FilterListWidget()
1078 f_ilManager
->endConfig();
1082 void KNode::FilterListWidget::load()
1084 mFilterList
->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() );
1099 item
->setIcon( a_ctive
);
1101 item
->setIcon( d_isabled
);
1102 mFilterList
->addItem( item
);
1103 slotSelectionChangedFilter();
1108 void KNode::FilterListWidget::removeItem(KNArticleFilter
*f
)
1110 int i
= findItem( mFilterList
, f
);
1112 delete mFilterList
->takeItem( i
);
1113 slotSelectionChangedFilter();
1118 void KNode::FilterListWidget::updateItem(KNArticleFilter
*f
)
1120 int i
= findItem( mFilterList
, f
);
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
);
1129 mMenuList
->item( i
)->setText( f
->translatedName() );
1131 item
->setIcon( d_isabled
);
1133 slotSelectionChangedFilter();
1138 void KNode::FilterListWidget::addMenuItem(KNArticleFilter
*f
)
1141 if ( findItem( mMenuList
, f
) < 0 )
1142 mMenuList
->addItem( new FilterListItem( f
, f
->translatedName() ) );
1144 mMenuList
->addItem( new FilterListItem( 0, "===" ) );
1145 slotSelectionChangedMenu();
1150 void KNode::FilterListWidget::removeMenuItem(KNArticleFilter
*f
)
1152 int i
= findItem( mMenuList
, f
);
1154 delete mMenuList
->takeItem( i
);
1155 slotSelectionChangedMenu();
1160 QList
<int> KNode::FilterListWidget::menuOrder()
1165 for( int i
= 0; i
< mMenuList
->count(); ++i
) {
1166 f
= static_cast<FilterListItem
*>( mMenuList
->item( i
) )->filter();
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
)
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();
1217 mMenuList
->insertItem( row
- 1, mMenuList
->takeItem( row
) );
1218 mMenuList
->setCurrentRow( row
- 1 );
1223 void KNode::FilterListWidget::slotDownBtnClicked()
1225 int row
= mMenuList
->currentRow();
1226 if ( row
< 0 || row
> mMenuList
->count() - 1 )
1228 mMenuList
->insertItem( row
+ 1, mMenuList
->takeItem( row
) );
1229 mMenuList
->setCurrentRow( row
+ 1 );
1234 void KNode::FilterListWidget::slotSepAddBtnClicked()
1236 mMenuList
->insertItem( mMenuList
->currentRow(), new FilterListItem( 0, "===" ) );
1237 slotSelectionChangedMenu();
1242 void KNode::FilterListWidget::slotSepRemBtnClicked()
1244 FilterListItem
*item
= static_cast<FilterListItem
*>( mMenuList
->currentItem() );
1245 if ( item
&& item
->filter() == 0 )
1247 slotSelectionChangedMenu();
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
)
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 );
1294 slotSelectionChanged();
1298 void KNode::PostNewsTechnicalWidget::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 );
1320 for ( int i
= 0; i
< mHeaderList
->count(); ++i
)
1321 list
.append( XHeader( mHeaderList
->item( i
)->text() ) );
1322 knGlobals
.settings()->setXHeaders( list
);
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 );
1339 mHeaderList
->addItem( dlg
->result() );
1343 slotSelectionChanged();
1344 emit
changed( true );
1348 void KNode::PostNewsTechnicalWidget::slotDelBtnClicked()
1350 QListWidgetItem
*item
= mHeaderList
->currentItem();
1354 slotSelectionChanged();
1355 emit
changed( true );
1359 void KNode::PostNewsTechnicalWidget::slotEditBtnClicked()
1361 QListWidgetItem
*item
= mHeaderList
->currentItem();
1365 XHeaderConfDialog
*dlg
= new XHeaderConfDialog( item
->text(), this );
1367 item
->setText( dlg
->result() );
1371 slotSelectionChanged();
1372 emit
changed( true );
1376 //===================================================================================================
1379 KNode::XHeaderConfDialog::XHeaderConfDialog( const QString
&h
, QWidget
*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( ": " );
1394 mNameEdit
->setText( h
.left( pos
) );
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
;
1429 addConfig( knGlobals
.settings(), this );
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()
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);
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);
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
);
1666 //END: Cleanup configuration widgets -----------------------------------------
1668 //------------------------
1669 #include "knconfigwidgets.moc"