kde-playground/kdepim/knode/knconfigwidgets.cpp
2015-04-14 21:49:29 +00:00

1669 lines
48 KiB
C++

/*
KNode, the KDE newsreader
Copyright (c) 1999-2006 the KNode authors.
See file AUTHORS for details
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
*/
#include "knconfigwidgets.h"
#include "configuration/identity_widget.h"
#include "knaccountmanager.h"
#include "knconfigmanager.h"
#include "kndisplayedheader.h"
#include "kngroupmanager.h"
#include "knglobals.h"
#include "knnntpaccount.h"
#include "utilities.h"
#include "knfiltermanager.h"
#include "knarticlefilter.h"
#include "knscoring.h"
#include "ui_postnewscomposerwidget_base.h"
#include "ui_readnewsnavigationwidget_base.h"
#include "ui_readnewsviewerwidget_base.h"
#include "settings.h"
#include "utils/locale.h"
#include <QPainter>
#include <kcharsets.h>
#include <kio/ioslave_defaults.h>
#include <kmessagebox.h>
#include <kcolordialog.h>
#include <kfontdialog.h>
#include <kscoringeditor.h>
#include <sonnet/configwidget.h>
#include <kcombobox.h>
#include <libkpgp/kpgpui.h>
//BEGIN: NNTP account configuration widgets ----------------------------------
KNode::NntpAccountListWidget::NntpAccountListWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
setupUi( this );
// account listbox
connect( mAccountList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
connect( mAccountList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
// buttons
connect( mAddButton, SIGNAL(clicked()), SLOT(slotAddBtnClicked()) );
connect( mEditButton, SIGNAL(clicked()), SLOT(slotEditBtnClicked()) );
connect( mDeleteButton, SIGNAL(clicked()), SLOT(slotDelBtnClicked()) );
connect( mSubscribeButton, SIGNAL(clicked()), SLOT(slotSubBtnClicked()) );
load();
// the settings dialog is non-modal, so we have to react to changes
// made outside of the dialog
KNAccountManager *am = knGlobals.accountManager();
connect( am, SIGNAL(accountAdded(KNNntpAccount::Ptr)), SLOT(slotAddItem(KNNntpAccount::Ptr)) );
connect( am, SIGNAL(accountRemoved(KNNntpAccount::Ptr)), SLOT(slotRemoveItem(KNNntpAccount::Ptr)) );
connect( am, SIGNAL(accountModified(KNNntpAccount::Ptr)), SLOT(slotUpdateItem(KNNntpAccount::Ptr)) );
slotSelectionChanged(); // disable Delete & Edit initially
}
void KNode::NntpAccountListWidget::load()
{
mAccountList->clear();
KNNntpAccount::List list = knGlobals.accountManager()->accounts();
for ( KNNntpAccount::List::Iterator it = list.begin(); it != list.end(); ++it )
slotAddItem( *it );
}
void KNode::NntpAccountListWidget::slotAddItem( KNNntpAccount::Ptr a )
{
AccountListItem *item;
item = new AccountListItem( a );
item->setText( a->name() );
item->setIcon( SmallIcon( "network-server" ) );
mAccountList->addItem( item );
emit changed( true );
}
void KNode::NntpAccountListWidget::slotRemoveItem( KNNntpAccount::Ptr a )
{
AccountListItem *item;
for ( int i = 0; i < mAccountList->count(); ++i ) {
item = static_cast<AccountListItem*>( mAccountList->item( i ) );
if ( item && item->account() == a ) {
delete mAccountList->takeItem( i );
break;
}
}
slotSelectionChanged();
emit changed( true );
}
void KNode::NntpAccountListWidget::slotUpdateItem( KNNntpAccount::Ptr a )
{
AccountListItem *item;
for ( int i = 0; i < mAccountList->count(); ++i ) {
item = static_cast<AccountListItem*>( mAccountList->item( i ) );
if ( item && item->account() == a )
item->setText( a->name() );
}
slotSelectionChanged();
emit changed( true );
}
void KNode::NntpAccountListWidget::slotSelectionChanged()
{
AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
mDeleteButton->setEnabled( item );
mEditButton->setEnabled( item );
mSubscribeButton->setEnabled( item );
if ( item ) {
mServerInfo->setText( i18n("Server: %1", item->account()->server() ) );
mPortInfo->setText( i18n("Port: %1", item->account()->port() ) );
} else {
mServerInfo->setText( i18n("Server: ") );
mPortInfo->setText( i18n("Port: ") );
}
}
void KNode::NntpAccountListWidget::slotAddBtnClicked()
{
KNNntpAccount::Ptr acc = KNNntpAccount::Ptr( new KNNntpAccount() );
if(acc->editProperties(this)) {
if(knGlobals.accountManager()->newAccount(acc))
acc->writeConfig();
}
}
void KNode::NntpAccountListWidget::slotDelBtnClicked()
{
AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
if ( item )
knGlobals.accountManager()->removeAccount( item->account() );
}
void KNode::NntpAccountListWidget::slotEditBtnClicked()
{
AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
if ( item ) {
item->account()->editProperties( this );
slotUpdateItem( item->account() );
}
}
void KNode::NntpAccountListWidget::slotSubBtnClicked()
{
AccountListItem *item = static_cast<AccountListItem*>( mAccountList->currentItem() );
if( item )
knGlobals.groupManager()->showGroupDialog( item->account(), this );
}
//=======================================================================================
KNode::NntpAccountConfDialog::NntpAccountConfDialog( KNNntpAccount *a, QWidget *parent ) :
KPageDialog( parent ),
mAccount( a ),
mUseServerForName( false )
{
if ( a->id() != -1 )
setCaption( i18n("Properties of %1", a->name()) );
else
setCaption( i18n("New Account") );
setFaceType( Tabbed );
setButtons( Ok | Cancel | Help );
setDefaultButton( Ok );
// server config tab
QFrame* page = new QFrame( this );
addPage( page, i18n("Ser&ver") );
setupUi( page );
mName->setText( a->name() );
mServer->setText( a->server() );
mPort->setValue( a->port() );
#ifndef Q_WS_WIN
// don't know how to set this in KDE4, where no related methods exists
mPort->setSliderEnabled( false );
#endif
mFetchDesc->setChecked( a->fetchDescriptions() );
connect( mServer, SIGNAL(textChanged(QString)),
this, SLOT(slotServerTextEdited()) );
connect( mServer, SIGNAL(editingFinished()),
this, SLOT(slotEditingFinished()) );
mLogin->setChecked( a->needsLogon() );
mUser->setText( a->user() );
connect( knGlobals.accountManager(), SIGNAL(passwordsChanged()), SLOT(slotPasswordChanged()) );
if ( a->readyForLogin() )
mPassword->setText( a->pass() );
else
if ( a->needsLogon() )
knGlobals.accountManager()->loadPasswordsAsync();
switch ( mAccount->encryption() ) {
case KNServerInfo::None:
mEncNone->setChecked( true );
break;
case KNServerInfo::SSL:
mEncSSL->setChecked( true );
break;
case KNServerInfo::TLS:
mEncTLS->setChecked( true );
break;
}
connect( mEncNone, SIGNAL(toggled(bool)),
this, SLOT(encryptionChanged(bool)) );
connect( mEncSSL, SIGNAL(toggled(bool)),
this, SLOT(encryptionChanged(bool)) );
connect( mEncTLS, SIGNAL(toggled(bool)),
this, SLOT(encryptionChanged(bool)) );
mIntervalChecking->setChecked( a->intervalChecking() );
mInterval->setValue( a->checkInterval() );
mInterval->setSuffix(ki18np(" minute", " minutes"));
// identity tab
mIdentityWidget = new KNode::IdentityWidget( a, knGlobals.componentData(), this );
addPage( mIdentityWidget, i18n("&Identity") );
// per server cleanup configuration
mCleanupWidget = new GroupCleanupWidget( a->cleanupConfig(), this );
addPage( mCleanupWidget, i18n("&Cleanup") );
mCleanupWidget->load();
KNHelper::restoreWindowSize("accNewsPropDLG", this, sizeHint());
setHelp("anc-setting-the-news-account");
}
KNode::NntpAccountConfDialog::~NntpAccountConfDialog()
{
KNHelper::saveWindowSize("accNewsPropDLG", size());
}
void KNode::NntpAccountConfDialog::slotServerTextEdited()
{
if ( mName->text().trimmed().isEmpty() ) {
mUseServerForName = true;
}
if ( mUseServerForName ) {
mName->setText( mServer->text() );
}
}
void KNode::NntpAccountConfDialog::slotEditingFinished()
{
mUseServerForName = false;
}
void KNode::NntpAccountConfDialog::slotButtonClicked( int button )
{
if ( button == KDialog::Ok ) {
if ( mName->text().isEmpty() || mServer->text().trimmed().isEmpty() ) {
KMessageBox::sorry(this, i18n("Please enter an arbitrary name for the account and the\nhostname of the news server."));
return;
}
mAccount->setName( mName->text() );
mAccount->setServer( mServer->text().trimmed().remove(QLatin1String("news://")) );
mAccount->setPort( mPort->value() );
mAccount->setFetchDescriptions( mFetchDesc->isChecked() );
mAccount->setNeedsLogon( mLogin->isChecked() );
mAccount->setUser( mUser->text() );
mAccount->setPass( mPassword->text() );
if ( mEncNone->isChecked() )
mAccount->setEncryption( KNServerInfo::None );
if ( mEncSSL->isChecked() )
mAccount->setEncryption( KNServerInfo::SSL );
if ( mEncTLS->isChecked() )
mAccount->setEncryption( KNServerInfo::TLS );
mAccount->setIntervalChecking( mIntervalChecking->isChecked() );
mAccount->setCheckInterval( mInterval->value() );
if ( mAccount->id() != -1 ) // only save if account has a valid id
mAccount->writeConfig();
mIdentityWidget->save();
mCleanupWidget->save();
accept();
} else {
KDialog::slotButtonClicked( button );
}
}
void KNode::NntpAccountConfDialog::slotPasswordChanged()
{
if ( mPassword->text().isEmpty() )
mPassword->setText( mAccount->pass() );
}
void KNode::NntpAccountConfDialog::encryptionChanged( bool checked )
{
if ( checked ) { // All 3 buttons are connected to this slot, so only the checked one is taken into account.
if ( mEncNone->isChecked() ) {
mPort->setValue( DEFAULT_NNTP_PORT );
} else if ( mEncSSL->isChecked() || mEncTLS->isChecked() ) {
mPort->setValue( DEFAULT_NNTPS_PORT );
}
}
}
//END: NNTP account configuration widgets ------------------------------------
//===================================================================================
KNode::AppearanceWidget::ColorListItem::ColorListItem( const QString &text, const QColor &color, QListWidget *parent ) :
QListWidgetItem( text, parent )
{
setColor( color );
}
void KNode::AppearanceWidget::ColorListItem::setColor( const QColor &color )
{
mColor = color;
int height = QFontMetrics( font() ).height();
QPixmap icon( height, height );
QPainter p( &icon );
p.setPen( Qt::black );
p.drawRect( 0, 0, height - 1, height - 1 );
p.fillRect( 1, 1, height - 2, height - 2, color );
setIcon( icon );
if ( listWidget() )
listWidget()->update();
}
//===================================================================================
KNode::AppearanceWidget::FontListItem::FontListItem( const QString &text, const QFont &font, QListWidget *parent ) :
QListWidgetItem( parent ),
mText( text )
{
setFont( font );
}
void KNode::AppearanceWidget::FontListItem::setFont( const QFont &font )
{
mFont = font;
setText( QString("[%1 %2] %3").arg( mFont.family() ).arg( mFont.pointSize() ).arg( mText ) );
if ( listWidget() )
listWidget()->update();
}
//===================================================================================
KNode::AppearanceWidget::AppearanceWidget( const KComponentData &inst, QWidget *parent ) :
KCModule(inst, parent )
{
QGridLayout *topL = new QGridLayout( this );
//color-list
mColorList = new QListWidget( this );
topL->addWidget( mColorList, 1, 0, 3, 2 );
connect( mColorList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotColItemActivated(QListWidgetItem*)) );
connect( mColorList, SIGNAL(itemSelectionChanged()), SLOT(slotColSelectionChanged()) );
c_olorCB = new QCheckBox(i18n("&Use custom colors"),this);
c_olorCB->setObjectName( "kcfg_useCustomColors" );
topL->addWidget( c_olorCB, 0, 0, 1, 3 );
connect(c_olorCB, SIGNAL(toggled(bool)), this, SLOT(slotColCheckBoxToggled(bool)));
c_olChngBtn = new QPushButton( i18nc( "@action:button Run a color selection dialog", "Cha&nge..." ), this );
connect(c_olChngBtn, SIGNAL(clicked()), this, SLOT(slotColChangeBtnClicked()));
topL->addWidget( c_olChngBtn, 1, 2, 1, 1 );
//font-list
mFontList = new QListWidget( this );
topL->addWidget( mFontList, 5, 0, 3, 2 );
connect( mFontList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotFontItemActivated(QListWidgetItem*)) );
connect( mFontList, SIGNAL(itemSelectionChanged()), SLOT(slotFontSelectionChanged()) );
f_ontCB = new QCheckBox(i18n("Use custom &fonts"),this);
f_ontCB->setObjectName( "kcfg_useCustomFonts" );
topL->addWidget(f_ontCB , 4, 0, 1, 3 );
connect(f_ontCB, SIGNAL(toggled(bool)), this, SLOT(slotFontCheckBoxToggled(bool)));
f_ntChngBtn = new QPushButton( i18nc( "@action:button Run a font selection dialog", "Chang&e..."), this);
connect(f_ntChngBtn, SIGNAL(clicked()), this, SLOT(slotFontChangeBtnClicked()));
topL->addWidget( f_ntChngBtn, 5, 2, 1, 1 );
topL->setColumnStretch( 0, 1 );
addConfig( knGlobals.settings(), this );
load();
}
void KNode::AppearanceWidget::load()
{
KCModule::load();
slotColCheckBoxToggled( c_olorCB->isChecked() );
slotFontCheckBoxToggled( f_ontCB->isChecked() );
KConfigSkeletonItem::List items = knGlobals.settings()->items();
mColorList->clear();
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
if ( item )
mColorList->addItem( new ColorListItem( item->label(), item->value() ) );
}
mFontList->clear();
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
if ( item )
mFontList->addItem( new FontListItem( item->label(), item->value() ) );
}
}
void KNode::AppearanceWidget::save()
{
KConfigSkeletonItem::List items = knGlobals.settings()->items();
int row = 0;
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
if ( !item )
continue;
item->setValue( static_cast<ColorListItem*>( mColorList->item( row ) )->color() );
++row;
}
row = 0;
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
if ( !item )
continue;
item->setValue( static_cast<FontListItem*>( mFontList->item( row ) )->font() );
++row;
}
KCModule::save();
knGlobals.configManager()->appearance()->recreateLVIcons();
}
void KNode::AppearanceWidget::defaults()
{
KCModule::defaults();
KConfigSkeletonItem::List items = knGlobals.settings()->items();
int row = 0;
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemColor *item = dynamic_cast<KConfigSkeleton::ItemColor*>( *it );
if ( !item )
continue;
item->setDefault();
static_cast<ColorListItem*>( mColorList->item( row ) )->setColor( item->value() );
++row;
}
row = 0;
for ( KConfigSkeletonItem::List::Iterator it = items.begin(); it != items.end(); ++it ) {
KConfigSkeleton::ItemFont *item = dynamic_cast<KConfigSkeleton::ItemFont*>( *it );
if ( !item )
continue;
item->setDefault();
static_cast<FontListItem*>( mFontList->item( row ) )->setFont( item->value() );
++row;
}
emit changed(true);
}
void KNode::AppearanceWidget::slotColCheckBoxToggled(bool b)
{
mColorList->setEnabled( b );
c_olChngBtn->setEnabled( b && mColorList->currentItem() );
if (b) mColorList->setFocus();
}
// show color dialog for the entry
void KNode::AppearanceWidget::slotColItemActivated( QListWidgetItem *item )
{
if ( item ) {
ColorListItem *colorItem = static_cast<ColorListItem*>( item );
QColor col = colorItem->color();
int result = KColorDialog::getColor(col,this);
if (result == KColorDialog::Accepted) {
colorItem->setColor(col);
}
}
emit changed(true);
}
void KNode::AppearanceWidget::slotColChangeBtnClicked()
{
if ( mColorList->currentItem() )
slotColItemActivated( mColorList->currentItem() );
}
void KNode::AppearanceWidget::slotColSelectionChanged()
{
c_olChngBtn->setEnabled( mColorList->currentItem() );
}
void KNode::AppearanceWidget::slotFontCheckBoxToggled(bool b)
{
mFontList->setEnabled( b );
f_ntChngBtn->setEnabled( b && mFontList->currentItem() );
if (b) mFontList->setFocus();
}
// show font dialog for the entry
void KNode::AppearanceWidget::slotFontItemActivated( QListWidgetItem *item )
{
if ( item ) {
FontListItem *fontItem = static_cast<FontListItem*>( item );
QFont font = fontItem->font();
const int result = KFontDialog::getFont( font /** by-ref*/,
KFontChooser::NoDisplayFlags, this );
if (result == KFontDialog::Accepted)
fontItem->setFont(font);
}
emit changed(true);
}
void KNode::AppearanceWidget::slotFontChangeBtnClicked()
{
if ( mFontList->currentItem() )
slotFontItemActivated( mFontList->currentItem() );
}
void KNode::AppearanceWidget::slotFontSelectionChanged()
{
f_ntChngBtn->setEnabled( mFontList->currentItem() );
}
//=============================================================================================
KNode::ReadNewsGeneralWidget::ReadNewsGeneralWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
setupUi( this );
addConfig( knGlobals.settings(), this );
load();
}
void KNode::ReadNewsGeneralWidget::load()
{
KCModule::load();
switch ( knGlobals.settings()->dateFormat() ) {
case KMime::DateFormatter::CTime: mStandardDateFormat->setChecked( true ); break;
case KMime::DateFormatter::Localized: mLocalizedDateFormat->setChecked( true ); break;
case KMime::DateFormatter::Fancy: mFancyDateFormat->setChecked( true ); break;
case KMime::DateFormatter::Custom: mCustomDateFormat->setChecked( true ); break;
case KMime::DateFormatter::Iso: break; // not used
case KMime::DateFormatter::Rfc: break; // not used
}
}
void KNode::ReadNewsGeneralWidget::save()
{
if ( mStandardDateFormat->isChecked() )
knGlobals.settings()->setDateFormat( KMime::DateFormatter::CTime );
if ( mLocalizedDateFormat->isChecked() )
knGlobals.settings()->setDateFormat( KMime::DateFormatter::Localized );
if ( mFancyDateFormat->isChecked() )
knGlobals.settings()->setDateFormat( KMime::DateFormatter::Fancy );
if ( mCustomDateFormat->isChecked() )
knGlobals.settings()->setDateFormat( KMime::DateFormatter::Custom );
KCModule::save();
}
//=============================================================================================
KNode::ReadNewsNavigationWidget::ReadNewsNavigationWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
KNode::Ui::ReadNewsNavigationWidgetBase ui;
ui.setupUi( this );
addConfig( knGlobals.settings(), this );
load();
}
//=============================================================================================
KNode::ReadNewsViewerWidget::ReadNewsViewerWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
KNode::Ui::ReadNewsViewerWidgetBase ui;
ui.setupUi( this );
addConfig( knGlobals.settings(), this );
load();
}
//=============================================================================================
KNode::DisplayedHeadersWidget::DisplayedHeadersWidget( DisplayedHeaders *d, const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent ),
s_ave( false ),
d_ata( d )
{
QGridLayout *topL=new QGridLayout(this);
topL->setSpacing(5);
topL->setMargin(5);
//listbox
mHeaderList = new QListWidget( this );
connect( mHeaderList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
connect( mHeaderList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
topL->addWidget( mHeaderList, 0, 0, 7, 1);
// buttons
a_ddBtn = new QPushButton( i18nc( "@action:button Add a new message header field (open dialog)", "&Add..." ), this );
connect(a_ddBtn, SIGNAL(clicked()), this, SLOT(slotAddBtnClicked()));
topL->addWidget(a_ddBtn, 0,1);
d_elBtn = new QPushButton( i18nc( "@action:button Delete a message header field", "&Delete" ), this);
connect(d_elBtn, SIGNAL(clicked()), this, SLOT(slotDelBtnClicked()));
topL->addWidget(d_elBtn, 1,1);
e_ditBtn=new QPushButton(i18nc("modify something","&Edit..."), this);
connect(e_ditBtn, SIGNAL(clicked()), this, SLOT(slotEditBtnClicked()));
topL->addWidget(e_ditBtn, 2,1);
u_pBtn = new QPushButton( i18nc( "@action:button Move an element of a list up", "&Up" ), this );
connect(u_pBtn, SIGNAL(clicked()), this, SLOT(slotUpBtnClicked()));
topL->addWidget(u_pBtn, 4,1);
d_ownBtn = new QPushButton( i18nc( "@action:button Move an element of a list down", "Do&wn" ), this );
connect(d_ownBtn, SIGNAL(clicked()), this, SLOT(slotDownBtnClicked()));
topL->addWidget(d_ownBtn, 5,1);
topL->addItem( new QSpacerItem( 0,20), 3, 0 ); // separate up/down buttons
topL->setRowStretch(6,1); // stretch the listbox
slotSelectionChanged(); // disable buttons initially
load();
}
void KNode::DisplayedHeadersWidget::load()
{
mHeaderList->clear();
KNDisplayedHeader::List list = d_ata->headers();
for ( KNDisplayedHeader::List::Iterator it = list.begin(); it != list.end(); ++it )
mHeaderList->addItem( generateItem( (*it) ) );
}
void KNode::DisplayedHeadersWidget::save()
{
if(s_ave) {
d_ata->setDirty(true);
d_ata->save();
}
s_ave = false;
}
KNode::DisplayedHeadersWidget::HdrItem* KNode::DisplayedHeadersWidget::generateItem(KNDisplayedHeader *h)
{
QString text;
if(h->hasName()) {
text=h->translatedName();
text+=": <";
} else {
text = '<';
}
text+=h->header();
text+='>';
return new HdrItem(text,h);
}
void KNode::DisplayedHeadersWidget::slotSelectionChanged()
{
int curr = mHeaderList->currentRow();
d_elBtn->setEnabled(curr!=-1);
e_ditBtn->setEnabled(curr!=-1);
u_pBtn->setEnabled(curr>0);
d_ownBtn->setEnabled( ( curr != -1 ) && ( curr + 1 != mHeaderList->count() ) );
}
void KNode::DisplayedHeadersWidget::slotAddBtnClicked()
{
KNDisplayedHeader *h=d_ata->createNewHeader();
DisplayedHeaderConfDialog* dlg=new DisplayedHeaderConfDialog(h, this);
if(dlg->exec()) {
mHeaderList->addItem( generateItem( h ) );
h->createTags();
s_ave=true;
} else
d_ata->remove(h);
emit changed(true);
}
void KNode::DisplayedHeadersWidget::slotDelBtnClicked()
{
if ( !mHeaderList->currentItem() )
return;
if(KMessageBox::warningContinueCancel(this, i18n("Really delete this header?"),"",KGuiItem(i18n("&Delete"),"edit-delete"))==KMessageBox::Continue) {
KNDisplayedHeader *h = ( static_cast<HdrItem*>( mHeaderList->currentItem() ) )->header();
d_ata->remove(h);
delete mHeaderList->takeItem( mHeaderList->currentRow() );
s_ave=true;
}
emit changed(true);
}
void KNode::DisplayedHeadersWidget::slotEditBtnClicked()
{
if ( !mHeaderList->currentItem() )
return;
KNDisplayedHeader *h = ( static_cast<HdrItem*>( mHeaderList->currentItem() ) )->header();
DisplayedHeaderConfDialog* dlg=new DisplayedHeaderConfDialog(h, this);
if(dlg->exec()) {
int row = mHeaderList->currentRow();
delete mHeaderList->takeItem( row );
mHeaderList->insertItem( row, generateItem( h ) );
mHeaderList->setCurrentRow( row );
h->createTags();
s_ave=true;
}
emit changed(true);
}
void KNode::DisplayedHeadersWidget::slotUpBtnClicked()
{
int row = mHeaderList->currentRow();
if ( row <= 0 )
return;
KNDisplayedHeader *h = static_cast<HdrItem*>( mHeaderList->currentItem() )->header();
d_ata->up(h);
mHeaderList->insertItem( row -1, mHeaderList->takeItem( row ) );
mHeaderList->setCurrentRow( row - 1 );
s_ave=true;
emit changed(true);
}
void KNode::DisplayedHeadersWidget::slotDownBtnClicked()
{
int row = mHeaderList->currentRow();
if ( row < 0 || row >= mHeaderList->count() )
return;
KNDisplayedHeader *h = static_cast<HdrItem*>( mHeaderList->currentItem() )->header();
d_ata->down(h);
mHeaderList->insertItem( row + 1, mHeaderList->takeItem( row ) );
mHeaderList->setCurrentRow( row + 1 );
s_ave=true;
emit changed(true);
}
//=============================================================================================
KNode::DisplayedHeaderConfDialog::DisplayedHeaderConfDialog( KNDisplayedHeader *h, QWidget *parent )
: KDialog( parent ),
h_dr(h)
{
setCaption( i18n("Header Properties") );
setButtons( Ok | Cancel | Help );
QWidget* page=new QWidget( this );
setMainWidget( page );
QGridLayout *topL=new QGridLayout(page);
topL->setSpacing(5);
topL->setMargin(0);
QWidget *nameW = new QWidget(page);
QGridLayout *nameL=new QGridLayout(nameW);
nameL->setSpacing(5);
h_drC=new KComboBox(true, nameW);
h_drC->lineEdit()->setMaxLength(64);
connect(h_drC, SIGNAL(activated(int)), this, SLOT(slotActivated(int)));
QLabel *label = new QLabel( i18nc( "@label:textbox Edition of a message header name", "H&eader:" ), nameW );
label->setBuddy(h_drC);
nameL->addWidget(label,0,0);
nameL->addWidget(h_drC,0,1);
n_ameE=new KLineEdit(nameW);
n_ameE->setMaxLength(64);
label = new QLabel( i18nc( "@label:textbox Edition of the displayed name in the UI of a message header", "Displayed na&me:" ), nameW );
label->setBuddy(n_ameE);
nameL->addWidget(label,1,0);
nameL->addWidget(n_ameE,1,1);
nameL->setColumnStretch(1,1);
topL->addWidget(nameW,0,0, 1, 2 );
QGroupBox *ngb = new QGroupBox(i18n("Name"), page);
// ### hide style settings for now, the new viewer doesn't support this yet
ngb->hide();
QVBoxLayout *ngbL = new QVBoxLayout(ngb);
ngbL->setSpacing(5);
ngbL->setMargin(8);
ngbL->addSpacing(fontMetrics().lineSpacing()-4);
n_ameCB[0]=new QCheckBox(i18n("&Large"), ngb);
n_ameCB[1]=new QCheckBox(i18n("&Bold"), ngb);
n_ameCB[2]=new QCheckBox(i18n("&Italic"), ngb);
n_ameCB[3]=new QCheckBox(i18n("&Underlined"), ngb);
for( int i = 0 ; i < 4 ; ++i) {
ngbL->addWidget( n_ameCB[i] );
}
topL->addWidget(ngb,1,0);
QGroupBox *vgb=new QGroupBox(i18n("Value"), page);
// ### hide style settings for now, the new viewer doen't support this yet
vgb->hide();
QVBoxLayout *vgbL = new QVBoxLayout(vgb);
vgbL->setSpacing(5);
vgbL->setMargin(8);
vgbL->addSpacing(fontMetrics().lineSpacing()-4);
v_alueCB[0]=new QCheckBox(i18n("L&arge"), vgb);
v_alueCB[1]=new QCheckBox(i18n("Bol&d"), vgb);
v_alueCB[2]=new QCheckBox(i18n("I&talic"), vgb);
v_alueCB[3]=new QCheckBox(i18n("U&nderlined"), vgb);
for( int i = 0 ; i < 4 ; ++i) {
vgbL->addWidget( v_alueCB[i] );
}
topL->addWidget(vgb,1,1);
topL->setColumnStretch(0,1);
topL->setColumnStretch(1,1);
// preset values...
h_drC->addItems( KNDisplayedHeader::predefs() );
h_drC->lineEdit()->setText(h->header());
n_ameE->setText(h->translatedName());
for(int i=0; i<4; ++i) {
n_ameCB[i]->setChecked(h->flag(i));
v_alueCB[i]->setChecked(h->flag(i+4));
}
setFixedHeight(sizeHint().height());
KNHelper::restoreWindowSize("accReadHdrPropDLG", this, sizeHint());
connect(n_ameE, SIGNAL(textChanged(QString)), SLOT(slotNameChanged(QString)));
setHelp("anc-knode-headers");
slotNameChanged( n_ameE->text() );
connect(this,SIGNAL(okClicked()),SLOT(slotOk()));
}
KNode::DisplayedHeaderConfDialog::~DisplayedHeaderConfDialog()
{
KNHelper::saveWindowSize("accReadHdrPropDLG", size());
}
void KNode::DisplayedHeaderConfDialog::slotOk()
{
h_dr->setHeader(h_drC->currentText());
h_dr->setTranslatedName(n_ameE->text());
for(int i=0; i<4; ++i) {
if(h_dr->hasName())
h_dr->setFlag(i, n_ameCB[i]->isChecked());
else
h_dr->setFlag(i,false);
h_dr->setFlag(i+4, v_alueCB[i]->isChecked());
}
accept();
}
// the user selected one of the presets, insert the *translated* string as display name:
void KNode::DisplayedHeaderConfDialog::slotActivated(int pos)
{
n_ameE->setText(i18n(h_drC->itemText(pos).toLocal8Bit())); // I think it's save here, the combobox has only english defaults
}
// disable the name format options when the name is empty
void KNode::DisplayedHeaderConfDialog::slotNameChanged(const QString& str)
{
for(int i=0; i<4; ++i)
n_ameCB[i]->setEnabled(!str.isEmpty());
}
//=============================================================================================
KNode::ScoringWidget::ScoringWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
QGridLayout *topL = new QGridLayout(this);
topL->setSpacing(5);
topL->setMargin(5);
mKsc = new KScoringEditorWidget( knGlobals.scoringManager(), this );
topL->addWidget( mKsc, 0, 0, 1, 2 );
topL->addItem( new QSpacerItem( 0, 10), 1, 0 );
mIgnored = new KIntSpinBox( -100000, 100000, 1, 0, this );
mIgnored->setObjectName( "kcfg_ignoredThreshold" );
QLabel *l = new QLabel( i18n("Default score for &ignored threads:"), this );
l->setBuddy( mIgnored );
topL->addWidget(l, 2, 0);
topL->addWidget( mIgnored, 2, 1 );
mWatched = new KIntSpinBox( -100000, 100000, 1, 0, this );
mWatched->setObjectName( "kcfg_watchedThreshold" );
l = new QLabel( i18n("Default score for &watched threads:"), this );
l->setBuddy( mWatched );
topL->addWidget(l, 3, 0);
topL->addWidget( mWatched, 3, 1);
topL->setColumnStretch(0, 1);
addConfig( knGlobals.settings(), this );
load();
}
//=============================================================================================
KNode::FilterListWidget::FilterListWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent ),
f_ilManager( knGlobals.filterManager() )
{
QGridLayout *topL=new QGridLayout(this);
topL->setSpacing(5);
topL->setMargin(5);
// == Filters =================================================
mFilterList = new QListWidget( this );
QLabel *label = new QLabel( i18nc("@title", "&Filters:" ), this );
label->setBuddy(mFilterList);
topL->addWidget( label, 0, 0 );
connect( mFilterList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChangedFilter()) );
connect( mFilterList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
topL->addWidget( mFilterList, 1, 0, 5, 1);
a_ddBtn = new QPushButton( i18nc("@action:button Add a new filter", "&Add..." ), this );
connect(a_ddBtn, SIGNAL(clicked()), this, SLOT(slotAddBtnClicked()));
topL->addWidget(a_ddBtn,1,1);
e_ditBtn=new QPushButton(i18nc("modify something","&Edit..."), this);
connect(e_ditBtn, SIGNAL(clicked()), this, SLOT(slotEditBtnClicked()));
topL->addWidget(e_ditBtn,2,1);
c_opyBtn = new QPushButton( i18nc( "@action:button Copy a filter", "Co&py..."), this);
connect(c_opyBtn, SIGNAL(clicked()), this, SLOT(slotCopyBtnClicked()));
topL->addWidget(c_opyBtn,3,1);
d_elBtn = new QPushButton( i18nc( "@action:button Delete a filter", "&Delete"), this);
connect(d_elBtn, SIGNAL(clicked()), this, SLOT(slotDelBtnClicked()));
topL->addWidget(d_elBtn,4,1);
// == Menu ====================================================
mMenuList = new QListWidget( this );
label = new QLabel( i18nc( "@title", "&Menu:"), this );
label->setBuddy(mMenuList);
topL->addWidget( label, 6, 0 );
connect( mMenuList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChangedMenu()) );
topL->addWidget( mMenuList, 7, 0, 5, 1);
u_pBtn = new QPushButton( i18nc( "@action:button move something up in a list", "&Up"), this );
connect(u_pBtn, SIGNAL(clicked()), this, SLOT(slotUpBtnClicked()));
topL->addWidget(u_pBtn,7,1);
d_ownBtn = new QPushButton( i18nc( "@action:button move something down in a list", "Do&wn"), this );
connect(d_ownBtn, SIGNAL(clicked()), this, SLOT(slotDownBtnClicked()));
topL->addWidget(d_ownBtn,8,1);
s_epAddBtn = new QPushButton( i18nc( "@action:button", "Add\n&Separator" ), this );
connect(s_epAddBtn, SIGNAL(clicked()), this, SLOT(slotSepAddBtnClicked()));
topL->addWidget(s_epAddBtn,9,1);
s_epRemBtn = new QPushButton( i18nc( "@action:button", "&Remove\nSeparator" ), this );
connect(s_epRemBtn, SIGNAL(clicked()), this, SLOT(slotSepRemBtnClicked()));
topL->addWidget(s_epRemBtn,10,1);
topL->setRowStretch(5,1);
topL->setRowStretch(11,1);
a_ctive = SmallIcon("view-filter",16);
d_isabled = SmallIcon("view-filter",16,KIconLoader::DisabledState);
load();
slotSelectionChangedFilter();
slotSelectionChangedMenu();
}
KNode::FilterListWidget::~FilterListWidget()
{
f_ilManager->endConfig();
}
void KNode::FilterListWidget::load()
{
mFilterList->clear();
mMenuList->clear();
f_ilManager->startConfig(this);
}
void KNode::FilterListWidget::save()
{
f_ilManager->commitChanges();
}
void KNode::FilterListWidget::addItem(KNArticleFilter *f)
{
FilterListItem *item = new FilterListItem( f , f->translatedName() );
if(f->isEnabled())
item->setIcon( a_ctive );
else
item->setIcon( d_isabled );
mFilterList->addItem( item );
slotSelectionChangedFilter();
emit changed(true);
}
void KNode::FilterListWidget::removeItem(KNArticleFilter *f)
{
int i = findItem( mFilterList, f );
if ( i >= 0 )
delete mFilterList->takeItem( i );
slotSelectionChangedFilter();
emit changed(true);
}
void KNode::FilterListWidget::updateItem(KNArticleFilter *f)
{
int i = findItem( mFilterList, f );
if ( i >= 0 ) {
FilterListItem *item = static_cast<FilterListItem*>( mFilterList->item( i ) );
item->setText( f->translatedName() );
if ( f->isEnabled() ) {
item->setIcon( a_ctive );
i = findItem( mMenuList, f );
if ( i >= 0 )
mMenuList->item( i )->setText( f->translatedName() );
} else
item->setIcon( d_isabled );
}
slotSelectionChangedFilter();
emit changed(true);
}
void KNode::FilterListWidget::addMenuItem(KNArticleFilter *f)
{
if (f) {
if ( findItem( mMenuList, f) < 0 )
mMenuList->addItem( new FilterListItem( f, f->translatedName() ) );
} else // separator
mMenuList->addItem( new FilterListItem( 0, "===" ) );
slotSelectionChangedMenu();
emit changed(true);
}
void KNode::FilterListWidget::removeMenuItem(KNArticleFilter *f)
{
int i = findItem( mMenuList, f );
if ( i >= 0 )
delete mMenuList->takeItem( i );
slotSelectionChangedMenu();
emit changed(true);
}
QList<int> KNode::FilterListWidget::menuOrder()
{
KNArticleFilter *f;
QList<int> lst;
for( int i = 0; i < mMenuList->count(); ++i ) {
f = static_cast<FilterListItem*>( mMenuList->item( i ) )->filter();
if ( f )
lst << f->id();
else
lst << -1;
}
return lst;
}
int KNode::FilterListWidget::findItem( QListWidget *l, KNArticleFilter *f )
{
for ( int i = 0; i < l->count(); ++i )
if ( static_cast<FilterListItem*>( l->item( i ) )->filter() == f )
return i;
return -1;
}
void KNode::FilterListWidget::slotAddBtnClicked()
{
f_ilManager->newFilter();
}
void KNode::FilterListWidget::slotDelBtnClicked()
{
if ( mFilterList->currentItem() )
f_ilManager->deleteFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
}
void KNode::FilterListWidget::slotEditBtnClicked()
{
if ( mFilterList->currentItem() )
f_ilManager->editFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
}
void KNode::FilterListWidget::slotCopyBtnClicked()
{
if ( mFilterList->currentItem() )
f_ilManager->copyFilter( static_cast<FilterListItem*>( mFilterList->currentItem() )->filter() );
}
void KNode::FilterListWidget::slotUpBtnClicked()
{
int row = mMenuList->currentRow();
if ( row <= 0)
return;
mMenuList->insertItem( row - 1, mMenuList->takeItem( row ) );
mMenuList->setCurrentRow( row - 1 );
emit changed(true);
}
void KNode::FilterListWidget::slotDownBtnClicked()
{
int row = mMenuList->currentRow();
if ( row < 0 || row > mMenuList->count() - 1 )
return;
mMenuList->insertItem( row + 1, mMenuList->takeItem( row ) );
mMenuList->setCurrentRow( row + 1 );
emit changed(true);
}
void KNode::FilterListWidget::slotSepAddBtnClicked()
{
mMenuList->insertItem( mMenuList->currentRow(), new FilterListItem( 0, "===" ) );
slotSelectionChangedMenu();
emit changed(true);
}
void KNode::FilterListWidget::slotSepRemBtnClicked()
{
FilterListItem *item = static_cast<FilterListItem*>( mMenuList->currentItem() );
if ( item && item->filter() == 0 )
delete item;
slotSelectionChangedMenu();
emit changed(true);
}
void KNode::FilterListWidget::slotSelectionChangedFilter()
{
QListWidgetItem *item = mFilterList->currentItem();
d_elBtn->setEnabled( item );
e_ditBtn->setEnabled( item );
c_opyBtn->setEnabled( item );
}
void KNode::FilterListWidget::slotSelectionChangedMenu()
{
int current = mMenuList->currentRow();
u_pBtn->setEnabled( current > 0 );
d_ownBtn->setEnabled( current >= 0 && ( current < mMenuList->count() - 1 ) );
s_epRemBtn->setEnabled( current >= 0 && ( static_cast<FilterListItem*>( mMenuList->item( current ) )->filter() == 0 ) );
}
//=============================================================================================
KNode::PostNewsTechnicalWidget::PostNewsTechnicalWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
setupUi( this );
mCharset->addItems( KNode::Utilities::Locale::encodings() );
mEncoding->addItem( i18n("Allow 8-bit") );
mEncoding->addItem( i18n("7-bit (Quoted-Printable)") );
connect( mHeaderList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotEditBtnClicked()) );
connect( mHeaderList, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()) );
connect( mAddButton, SIGNAL(clicked()), SLOT(slotAddBtnClicked()) );
connect( mEditButton, SIGNAL(clicked()), SLOT(slotEditBtnClicked()) );
connect( mDeleteButton, SIGNAL(clicked()), SLOT(slotDelBtnClicked()) );
addConfig( knGlobals.settings(), this );
load();
slotSelectionChanged();
}
void KNode::PostNewsTechnicalWidget::load()
{
KCModule::load();
QString charsetDesc = KGlobal::charsets()->descriptionForEncoding( knGlobals.settings()->charset() );
mCharset->setCurrentIndex( mCharset->findText( charsetDesc ) );
mEncoding->setCurrentIndex( knGlobals.settings()->allow8BitBody() ? 0 : 1 );
mHeaderList->clear();
XHeader::List list = knGlobals.settings()->xHeaders();
for ( XHeader::List::Iterator it = list.begin(); it != list.end(); ++it )
mHeaderList->addItem( (*it).header() );
}
void KNode::PostNewsTechnicalWidget::save()
{
QString charset = KGlobal::charsets()->encodingForName( mCharset->currentText() );
knGlobals.settings()->setCharset( charset );
knGlobals.settings()->setAllow8BitBody( mEncoding->currentIndex() == 0 );
XHeader::List list;
for ( int i = 0; i < mHeaderList->count(); ++i )
list.append( XHeader( mHeaderList->item( i )->text() ) );
knGlobals.settings()->setXHeaders( list );
KCModule::save();
}
void KNode::PostNewsTechnicalWidget::slotSelectionChanged()
{
mDeleteButton->setEnabled( mHeaderList->currentItem() != 0 );
mEditButton->setEnabled( mHeaderList->currentItem() != 0 );
}
void KNode::PostNewsTechnicalWidget::slotAddBtnClicked()
{
XHeaderConfDialog *dlg = new XHeaderConfDialog( QString(), this );
if ( dlg->exec() )
mHeaderList->addItem( dlg->result() );
delete dlg;
slotSelectionChanged();
emit changed( true );
}
void KNode::PostNewsTechnicalWidget::slotDelBtnClicked()
{
QListWidgetItem *item = mHeaderList->currentItem();
if ( !item )
return;
delete item;
slotSelectionChanged();
emit changed( true );
}
void KNode::PostNewsTechnicalWidget::slotEditBtnClicked()
{
QListWidgetItem *item = mHeaderList->currentItem();
if ( !item )
return;
XHeaderConfDialog *dlg = new XHeaderConfDialog( item->text(), this );
if ( dlg->exec() )
item->setText( dlg->result() );
delete dlg;
slotSelectionChanged();
emit changed( true );
}
//===================================================================================================
KNode::XHeaderConfDialog::XHeaderConfDialog( const QString &h, QWidget *parent ) :
KDialog( parent )
{
setCaption( i18n("Additional Header") );
setButtons( Ok | Cancel );
KHBox* page = new KHBox( this );
setMainWidget( page );
mNameEdit = new KLineEdit( page );
new QLabel( ":", page );
mValueEdit = new KLineEdit( page );
int pos = h.indexOf( ": " );
if ( pos != -1 ) {
mNameEdit->setText( h.left( pos ) );
pos += 2;
mValueEdit->setText( h.right( h.length() - pos ) );
}
setFixedHeight(sizeHint().height());
KNHelper::restoreWindowSize("XHeaderDlg", this, sizeHint());
mNameEdit->setFocus();
}
KNode::XHeaderConfDialog::~XHeaderConfDialog()
{
KNHelper::saveWindowSize("XHeaderDlg", size());
}
QString KNode::XHeaderConfDialog::result() const
{
QString value = mValueEdit->text();
// just in case someone pastes a newline
value.replace( '\n', ' ' );
return mNameEdit->text() + ": " + value;
}
//===================================================================================================
KNode::PostNewsComposerWidget::PostNewsComposerWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
KNode::Ui::PostNewsComposerWidgetBase ui;
ui.setupUi( this );
addConfig( knGlobals.settings(), this );
load();
}
//===================================================================================================
KNode::PostNewsSpellingWidget::PostNewsSpellingWidget( const KComponentData &inst, QWidget *parent ) :
KCModule( inst, parent )
{
QVBoxLayout *topL=new QVBoxLayout(this);
topL->setSpacing(5);
c_conf = new Sonnet::ConfigWidget(KNGlobals::self()->config(), this );
topL->addWidget(c_conf);
connect(c_conf, SIGNAL(configChanged()), SLOT(changed()));
topL->addStretch(1);
}
KNode::PostNewsSpellingWidget::~PostNewsSpellingWidget()
{
}
void KNode::PostNewsSpellingWidget::save()
{
c_conf->save();
}
//==============================================================================================================
KNode::PrivacyWidget::PrivacyWidget( const KComponentData &inst,QWidget *parent ) :
KCModule(inst, parent )
{
QBoxLayout *topLayout = new QVBoxLayout(this);
topLayout->setSpacing(5);
c_onf = new Kpgp::Config( this, false );
c_onf->setObjectName( "knode pgp config" );
topLayout->addWidget(c_onf);
connect(c_onf, SIGNAL(changed()), SLOT(changed()));
topLayout->addStretch(1);
load();
}
KNode::PrivacyWidget::~PrivacyWidget()
{
}
void KNode::PrivacyWidget::save()
{
c_onf->applySettings();
}
//==============================================================================================================
//BEGIN: Cleanup configuration widgets ---------------------------------------
KNode::GroupCleanupWidget::GroupCleanupWidget( Cleanup *data, QWidget *parent )
: QWidget( parent ), mData( data )
{
QVBoxLayout *top = new QVBoxLayout( this );
if (!mData->isGlobal()) {
mDefault = new QCheckBox( i18n("&Use global cleanup configuration"), this );
connect( mDefault, SIGNAL(toggled(bool)), SLOT(slotDefaultToggled(bool)) );
top->addWidget( mDefault );
}
mExpGroup = new QGroupBox( i18n("Newsgroup Cleanup Settings"), this );
top->addWidget( mExpGroup );
QGridLayout *grid = new QGridLayout( mExpGroup );
grid->setSpacing( KDialog::spacingHint() );
grid->setMargin( KDialog::marginHint() );
grid->setRowMinimumHeight( 0, KDialog::spacingHint() );
mExpEnabled = new QCheckBox( i18n("&Expire old articles automatically"), mExpGroup );
grid->addWidget( mExpEnabled, 1, 0, 1, 2 );
connect( mExpEnabled, SIGNAL(toggled(bool)), SIGNAL(changed()) );
mExpDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
mExpDays->setSuffix(ki18np(" day", " days"));
QLabel *label = new QLabel( i18n("&Purge groups every:"), mExpGroup );
label->setBuddy( mExpDays );
grid->addWidget( label, 2, 0 );
grid->addWidget( mExpDays, 2, 1, Qt::AlignRight );
connect( mExpDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
connect( mExpEnabled, SIGNAL(toggled(bool)), label, SLOT(setEnabled(bool)) );
connect( mExpEnabled, SIGNAL(toggled(bool)), mExpDays, SLOT(setEnabled(bool)) );
mExpReadDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
mExpReadDays->setSuffix(ki18np(" day", " days"));
label = new QLabel( i18n("&Keep read articles:"), mExpGroup );
label->setBuddy( mExpReadDays );
grid->addWidget( label, 3, 0 );
grid->addWidget( mExpReadDays, 3, 1, Qt::AlignRight );
connect( mExpReadDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
mExpUnreadDays = new KIntSpinBox( 0, 99999, 1, 0, mExpGroup );
mExpUnreadDays->setSuffix(ki18np(" day", " days"));
label = new QLabel( i18n("Keep u&nread articles:"), mExpGroup );
label->setBuddy( mExpUnreadDays );
grid->addWidget( label, 4, 0 );
grid->addWidget( mExpUnreadDays, 4, 1, Qt::AlignRight );
connect( mExpUnreadDays, SIGNAL(valueChanged(int)), SIGNAL(changed()) );
mExpUnavailable = new QCheckBox( i18n("&Remove articles that are not available on the server"), mExpGroup );
grid->addWidget( mExpUnavailable, 5, 0, 1, 2 );
connect( mExpUnavailable, SIGNAL(toggled(bool)), SIGNAL(changed()) );
mPreserveThreads = new QCheckBox( i18n("Preser&ve threads"), mExpGroup );
grid->addWidget( mPreserveThreads, 6, 0, 1, 2 );
connect( mPreserveThreads, SIGNAL(toggled(bool)), SIGNAL(changed()) );
grid->setColumnStretch(1,1);
}
void KNode::GroupCleanupWidget::load()
{
if (!mData->isGlobal()) {
mDefault->setChecked( mData->useDefault() );
slotDefaultToggled( mData->useDefault() );
}
mExpEnabled->setChecked( !mData->d_oExpire ); // make sure the toggled(bool) signal is emitted at least once
mExpEnabled->setChecked( mData->d_oExpire );
mExpDays->setValue( mData->e_xpireInterval );
mExpReadDays->setValue( mData->maxAgeForRead() );
mExpUnreadDays->setValue( mData->maxAgeForUnread() );
mExpUnavailable->setChecked( mData->removeUnavailable() );
mPreserveThreads->setChecked( mData->preserveThreads() );
}
void KNode::GroupCleanupWidget::save()
{
if (!mData->isGlobal())
mData->setUseDefault( mDefault->isChecked() );
mData->d_oExpire = mExpEnabled->isChecked();
mData->e_xpireInterval = mExpDays->value();
mData->r_eadMaxAge = mExpReadDays->value();
mData->u_nreadMaxAge = mExpUnreadDays->value();
mData->r_emoveUnavailable = mExpUnavailable->isChecked();
mData->p_reserveThr = mPreserveThreads->isChecked();
}
void KNode::GroupCleanupWidget::slotDefaultToggled( bool state )
{
mExpGroup->setEnabled( !state );
}
KNode::CleanupWidget::CleanupWidget( const KComponentData &inst,QWidget *parent ) :
KCModule(inst, parent ),
d_ata( knGlobals.configManager()->cleanup() )
{
QVBoxLayout *topL=new QVBoxLayout(this);
topL->setSpacing(5);
mGroupCleanup = new GroupCleanupWidget( d_ata, this );
topL->addWidget( mGroupCleanup );
connect( mGroupCleanup, SIGNAL(changed()), SLOT(changed()) );
// === folders =========================================================
QGroupBox *foldersB = new QGroupBox( i18n("Folders"), this );
topL->addWidget(foldersB);
QGridLayout *foldersL = new QGridLayout( foldersB );
foldersL->setSpacing( KDialog::spacingHint() );
foldersL->setMargin( KDialog::marginHint() );
foldersL->setRowMinimumHeight( 0, KDialog::spacingHint() );
f_olderCB=new QCheckBox(i18n("Co&mpact folders automatically"), foldersB);
connect(f_olderCB, SIGNAL(toggled(bool)), this, SLOT(slotFolderCBtoggled(bool)));
foldersL->addWidget(f_olderCB,1,0, 1, 2 );
f_olderDays=new KIntSpinBox( 0, 99999, 1, 0, foldersB );
f_olderDays->setSuffix(ki18np(" day", " days"));
f_olderDaysL=new QLabel(i18n("P&urge folders every:"),foldersB);
f_olderDaysL->setBuddy(f_olderDays);
foldersL->addWidget(f_olderDaysL,2,0);
foldersL->addWidget(f_olderDays,2,1,Qt::AlignRight);
connect(f_olderDays, SIGNAL(valueChanged(int)), SLOT(changed()));
foldersL->setColumnStretch(1,1);
topL->addStretch(1);
load();
}
KNode::CleanupWidget::~CleanupWidget()
{
}
void KNode::CleanupWidget::load()
{
f_olderCB->setChecked(d_ata->d_oCompact);
slotFolderCBtoggled(d_ata->d_oCompact);
f_olderDays->setValue(d_ata->c_ompactInterval);
mGroupCleanup->load();
}
void KNode::CleanupWidget::save()
{
d_ata->d_oCompact=f_olderCB->isChecked();
d_ata->c_ompactInterval=f_olderDays->value();
mGroupCleanup->save();
d_ata->setDirty(true);
}
void KNode::CleanupWidget::slotFolderCBtoggled(bool b)
{
f_olderDaysL->setEnabled(b);
f_olderDays->setEnabled(b);
emit changed(true);
}
//END: Cleanup configuration widgets -----------------------------------------
//------------------------