00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <config.h>
00025
00026
00027 #include "configuredialog.h"
00028 #include "configuredialog_p.h"
00029
00030 #include "globalsettings.h"
00031 #include "replyphrases.h"
00032 #include "templatesconfiguration_kfg.h"
00033
00034
00035 #include "kmkernel.h"
00036 #include "simplestringlisteditor.h"
00037 #include "accountdialog.h"
00038 using KMail::AccountDialog;
00039 #include "colorlistbox.h"
00040 #include "kmacctseldlg.h"
00041 #include "messagesender.h"
00042 #include "kmtransport.h"
00043 #include "kmfoldermgr.h"
00044 #include <libkpimidentities/identitymanager.h>
00045 #include "identitylistview.h"
00046 using KMail::IdentityListView;
00047 using KMail::IdentityListViewItem;
00048 #include "kcursorsaver.h"
00049 #include "accountmanager.h"
00050 #include <composercryptoconfiguration.h>
00051 #include <warningconfiguration.h>
00052 #include <smimeconfiguration.h>
00053 #include "templatesconfiguration.h"
00054 #include "customtemplates.h"
00055 #include "folderrequester.h"
00056 using KMail::FolderRequester;
00057 #include "accountcombobox.h"
00058 #include "imapaccountbase.h"
00059 using KMail::ImapAccountBase;
00060 #include "folderstorage.h"
00061 #include "kmfolder.h"
00062 #include "kmmainwidget.h"
00063 #include "recentaddresses.h"
00064 using KRecentAddress::RecentAddresses;
00065 #include "completionordereditor.h"
00066 #include "ldapclient.h"
00067 #include "index.h"
00068
00069 using KMail::IdentityListView;
00070 using KMail::IdentityListViewItem;
00071 #include "identitydialog.h"
00072 using KMail::IdentityDialog;
00073
00074
00075 #include <libkpimidentities/identity.h>
00076 #include <kmime_util.h>
00077 using KMime::DateFormatter;
00078 #include <kleo/cryptoconfig.h>
00079 #include <kleo/cryptobackendfactory.h>
00080 #include <ui/backendconfigwidget.h>
00081 #include <ui/keyrequester.h>
00082 #include <ui/keyselectiondialog.h>
00083
00084
00085 #include <klocale.h>
00086 #include <kapplication.h>
00087 #include <kcharsets.h>
00088 #include <kasciistringtools.h>
00089 #include <kdebug.h>
00090 #include <knuminput.h>
00091 #include <kfontdialog.h>
00092 #include <kmessagebox.h>
00093 #include <kurlrequester.h>
00094 #include <kseparator.h>
00095 #include <kiconloader.h>
00096 #include <kstandarddirs.h>
00097 #include <kwin.h>
00098 #include <knotifydialog.h>
00099 #include <kconfig.h>
00100 #include <kactivelabel.h>
00101 #include <kcmultidialog.h>
00102
00103
00104 #include <qvalidator.h>
00105 #include <qwhatsthis.h>
00106 #include <qvgroupbox.h>
00107 #include <qvbox.h>
00108 #include <qvbuttongroup.h>
00109 #include <qhbuttongroup.h>
00110 #include <qtooltip.h>
00111 #include <qlabel.h>
00112 #include <qtextcodec.h>
00113 #include <qheader.h>
00114 #include <qpopupmenu.h>
00115 #include <qradiobutton.h>
00116 #include <qlayout.h>
00117 #include <qcheckbox.h>
00118 #include <qwidgetstack.h>
00119
00120
00121 #include <assert.h>
00122 #include <stdlib.h>
00123
00124 #ifndef _PATH_SENDMAIL
00125 #define _PATH_SENDMAIL "/usr/sbin/sendmail"
00126 #endif
00127
00128 #ifdef DIM
00129 #undef DIM
00130 #endif
00131 #define DIM(x) sizeof(x) / sizeof(*x)
00132
00133 namespace {
00134
00135 struct EnumConfigEntryItem {
00136 const char * key;
00137 const char * desc;
00138 };
00139 struct EnumConfigEntry {
00140 const char * group;
00141 const char * key;
00142 const char * desc;
00143 const EnumConfigEntryItem * items;
00144 int numItems;
00145 int defaultItem;
00146 };
00147 struct BoolConfigEntry {
00148 const char * group;
00149 const char * key;
00150 const char * desc;
00151 bool defaultValue;
00152 };
00153
00154 static const char * lockedDownWarning =
00155 I18N_NOOP("<qt><p>This setting has been fixed by your administrator.</p>"
00156 "<p>If you think this is an error, please contact him.</p></qt>");
00157
00158 void checkLockDown( QWidget * w, const KConfigBase & c, const char * key ) {
00159 if ( c.entryIsImmutable( key ) ) {
00160 w->setEnabled( false );
00161 QToolTip::add( w, i18n( lockedDownWarning ) );
00162 } else {
00163 QToolTip::remove( w );
00164 }
00165 }
00166
00167 void populateButtonGroup( QButtonGroup * g, const EnumConfigEntry & e ) {
00168 g->setTitle( i18n( e.desc ) );
00169 g->layout()->setSpacing( KDialog::spacingHint() );
00170 for ( int i = 0 ; i < e.numItems ; ++i )
00171 g->insert( new QRadioButton( i18n( e.items[i].desc ), g ), i );
00172 }
00173
00174 void populateCheckBox( QCheckBox * b, const BoolConfigEntry & e ) {
00175 b->setText( i18n( e.desc ) );
00176 }
00177
00178 void loadWidget( QCheckBox * b, const KConfigBase & c, const BoolConfigEntry & e ) {
00179 Q_ASSERT( c.group() == e.group );
00180 checkLockDown( b, c, e.key );
00181 b->setChecked( c.readBoolEntry( e.key, e.defaultValue ) );
00182 }
00183
00184 void loadWidget( QButtonGroup * g, const KConfigBase & c, const EnumConfigEntry & e ) {
00185 Q_ASSERT( c.group() == e.group );
00186 Q_ASSERT( g->count() == e.numItems );
00187 checkLockDown( g, c, e.key );
00188 const QString s = c.readEntry( e.key, e.items[e.defaultItem].key );
00189 for ( int i = 0 ; i < e.numItems ; ++i )
00190 if ( s == e.items[i].key ) {
00191 g->setButton( i );
00192 return;
00193 }
00194 g->setButton( e.defaultItem );
00195 }
00196
00197 void saveCheckBox( QCheckBox * b, KConfigBase & c, const BoolConfigEntry & e ) {
00198 Q_ASSERT( c.group() == e.group );
00199 c.writeEntry( e.key, b->isChecked() );
00200 }
00201
00202 void saveButtonGroup( QButtonGroup * g, KConfigBase & c, const EnumConfigEntry & e ) {
00203 Q_ASSERT( c.group() == e.group );
00204 Q_ASSERT( g->count() == e.numItems );
00205 c.writeEntry( e.key, e.items[ g->id( g->selected() ) ].key );
00206 }
00207
00208 template <typename T_Widget, typename T_Entry>
00209 inline void loadProfile( T_Widget * g, const KConfigBase & c, const T_Entry & e ) {
00210 if ( c.hasKey( e.key ) )
00211 loadWidget( g, c, e );
00212 }
00213 }
00214
00215
00216 ConfigureDialog::ConfigureDialog( QWidget *parent, const char *name, bool modal )
00217 : KCMultiDialog( KDialogBase::IconList, KGuiItem( i18n( "&Load Profile..." ) ),
00218 KGuiItem(), User2, i18n( "Configure" ), parent, name, modal )
00219 , mProfileDialog( 0 )
00220 {
00221 KWin::setIcons( winId(), kapp->icon(), kapp->miniIcon() );
00222 showButton( User1, true );
00223
00224 addModule ( "kmail_config_identity", false );
00225 addModule ( "kmail_config_accounts", false );
00226 addModule ( "kmail_config_appearance", false );
00227 addModule ( "kmail_config_composer", false );
00228 addModule ( "kmail_config_security", false );
00229 addModule ( "kmail_config_misc", false );
00230
00231
00232
00233
00234
00235 KConfigGroup geometry( KMKernel::config(), "Geometry" );
00236 int width = geometry.readNumEntry( "ConfigureDialogWidth" );
00237 int height = geometry.readNumEntry( "ConfigureDialogHeight" );
00238 if ( width != 0 && height != 0 ) {
00239 setMinimumSize( width, height );
00240 }
00241
00242 }
00243
00244 void ConfigureDialog::hideEvent( QHideEvent *ev ) {
00245 KConfigGroup geometry( KMKernel::config(), "Geometry" );
00246 geometry.writeEntry( "ConfigureDialogWidth", width() );
00247 geometry.writeEntry( "ConfigureDialogHeight",height() );
00248 KDialogBase::hideEvent( ev );
00249 }
00250
00251 ConfigureDialog::~ConfigureDialog() {
00252 }
00253
00254 void ConfigureDialog::slotApply() {
00255 GlobalSettings::self()->writeConfig();
00256 KCMultiDialog::slotApply();
00257 }
00258
00259 void ConfigureDialog::slotOk() {
00260 GlobalSettings::self()->writeConfig();
00261 KCMultiDialog::slotOk();
00262 }
00263
00264 void ConfigureDialog::slotUser2() {
00265 if ( mProfileDialog ) {
00266 mProfileDialog->raise();
00267 return;
00268 }
00269 mProfileDialog = new ProfileDialog( this, "mProfileDialog" );
00270 connect( mProfileDialog, SIGNAL(profileSelected(KConfig*)),
00271 this, SIGNAL(installProfile(KConfig*)) );
00272 mProfileDialog->show();
00273 }
00274
00275
00276
00277
00278
00279
00280 QString IdentityPage::helpAnchor() const {
00281 return QString::fromLatin1("configure-identity");
00282 }
00283
00284 IdentityPage::IdentityPage( QWidget * parent, const char * name )
00285 : ConfigModule( parent, name ),
00286 mIdentityDialog( 0 )
00287 {
00288 QHBoxLayout * hlay = new QHBoxLayout( this, 0, KDialog::spacingHint() );
00289
00290 mIdentityList = new IdentityListView( this );
00291 connect( mIdentityList, SIGNAL(selectionChanged()),
00292 SLOT(slotIdentitySelectionChanged()) );
00293 connect( mIdentityList, SIGNAL(itemRenamed(QListViewItem*,const QString&,int)),
00294 SLOT(slotRenameIdentity(QListViewItem*,const QString&,int)) );
00295 connect( mIdentityList, SIGNAL(doubleClicked(QListViewItem*,const QPoint&,int)),
00296 SLOT(slotModifyIdentity()) );
00297 connect( mIdentityList, SIGNAL(contextMenu(KListView*,QListViewItem*,const QPoint&)),
00298 SLOT(slotContextMenu(KListView*,QListViewItem*,const QPoint&)) );
00299
00300
00301 hlay->addWidget( mIdentityList, 1 );
00302
00303 QVBoxLayout * vlay = new QVBoxLayout( hlay );
00304
00305 QPushButton * button = new QPushButton( i18n("&Add..."), this );
00306 mModifyButton = new QPushButton( i18n("&Modify..."), this );
00307 mRenameButton = new QPushButton( i18n("&Rename"), this );
00308 mRemoveButton = new QPushButton( i18n("Remo&ve"), this );
00309 mSetAsDefaultButton = new QPushButton( i18n("Set as &Default"), this );
00310 button->setAutoDefault( false );
00311 mModifyButton->setAutoDefault( false );
00312 mModifyButton->setEnabled( false );
00313 mRenameButton->setAutoDefault( false );
00314 mRenameButton->setEnabled( false );
00315 mRemoveButton->setAutoDefault( false );
00316 mRemoveButton->setEnabled( false );
00317 mSetAsDefaultButton->setAutoDefault( false );
00318 mSetAsDefaultButton->setEnabled( false );
00319 connect( button, SIGNAL(clicked()),
00320 this, SLOT(slotNewIdentity()) );
00321 connect( mModifyButton, SIGNAL(clicked()),
00322 this, SLOT(slotModifyIdentity()) );
00323 connect( mRenameButton, SIGNAL(clicked()),
00324 this, SLOT(slotRenameIdentity()) );
00325 connect( mRemoveButton, SIGNAL(clicked()),
00326 this, SLOT(slotRemoveIdentity()) );
00327 connect( mSetAsDefaultButton, SIGNAL(clicked()),
00328 this, SLOT(slotSetAsDefault()) );
00329 vlay->addWidget( button );
00330 vlay->addWidget( mModifyButton );
00331 vlay->addWidget( mRenameButton );
00332 vlay->addWidget( mRemoveButton );
00333 vlay->addWidget( mSetAsDefaultButton );
00334 vlay->addStretch( 1 );
00335 load();
00336 }
00337
00338 void IdentityPage::load()
00339 {
00340 KPIM::IdentityManager * im = kmkernel->identityManager();
00341 mOldNumberOfIdentities = im->shadowIdentities().count();
00342
00343 mIdentityList->clear();
00344 QListViewItem * item = 0;
00345 for ( KPIM::IdentityManager::Iterator it = im->modifyBegin() ; it != im->modifyEnd() ; ++it )
00346 item = new IdentityListViewItem( mIdentityList, item, *it );
00347 mIdentityList->setSelected( mIdentityList->currentItem(), true );
00348 }
00349
00350 void IdentityPage::save() {
00351 assert( !mIdentityDialog );
00352
00353 kmkernel->identityManager()->sort();
00354 kmkernel->identityManager()->commit();
00355
00356 if( mOldNumberOfIdentities < 2 && mIdentityList->childCount() > 1 ) {
00357
00358
00359 KConfigGroup composer( KMKernel::config(), "Composer" );
00360 int showHeaders = composer.readNumEntry( "headers", HDR_STANDARD );
00361 showHeaders |= HDR_IDENTITY;
00362 composer.writeEntry( "headers", showHeaders );
00363 }
00364
00365 if( mOldNumberOfIdentities > 1 && mIdentityList->childCount() < 2 ) {
00366
00367 KConfigGroup composer( KMKernel::config(), "Composer" );
00368 int showHeaders = composer.readNumEntry( "headers", HDR_STANDARD );
00369 showHeaders &= ~HDR_IDENTITY;
00370 composer.writeEntry( "headers", showHeaders );
00371 }
00372 }
00373
00374 void IdentityPage::slotNewIdentity()
00375 {
00376 assert( !mIdentityDialog );
00377
00378 KPIM::IdentityManager * im = kmkernel->identityManager();
00379 NewIdentityDialog dialog( im->shadowIdentities(), this, "new", true );
00380
00381 if( dialog.exec() == QDialog::Accepted ) {
00382 QString identityName = dialog.identityName().stripWhiteSpace();
00383 assert( !identityName.isEmpty() );
00384
00385
00386
00387
00388 switch ( dialog.duplicateMode() ) {
00389 case NewIdentityDialog::ExistingEntry:
00390 {
00391 KPIM::Identity & dupThis = im->modifyIdentityForName( dialog.duplicateIdentity() );
00392 im->newFromExisting( dupThis, identityName );
00393 break;
00394 }
00395 case NewIdentityDialog::ControlCenter:
00396 im->newFromControlCenter( identityName );
00397 break;
00398 case NewIdentityDialog::Empty:
00399 im->newFromScratch( identityName );
00400 default: ;
00401 }
00402
00403
00404
00405
00406 KPIM::Identity & newIdent = im->modifyIdentityForName( identityName );
00407 QListViewItem * item = mIdentityList->selectedItem();
00408 if ( item )
00409 item = item->itemAbove();
00410 mIdentityList->setSelected( new IdentityListViewItem( mIdentityList,
00411 item,
00412 newIdent ), true );
00413 slotModifyIdentity();
00414 }
00415 }
00416
00417 void IdentityPage::slotModifyIdentity() {
00418 assert( !mIdentityDialog );
00419
00420 IdentityListViewItem * item =
00421 dynamic_cast<IdentityListViewItem*>( mIdentityList->selectedItem() );
00422 if ( !item ) return;
00423
00424 mIdentityDialog = new IdentityDialog( this );
00425 mIdentityDialog->setIdentity( item->identity() );
00426
00427
00428 if ( mIdentityDialog->exec() == QDialog::Accepted ) {
00429 mIdentityDialog->updateIdentity( item->identity() );
00430 item->redisplay();
00431 emit changed(true);
00432 }
00433
00434 delete mIdentityDialog;
00435 mIdentityDialog = 0;
00436 }
00437
00438 void IdentityPage::slotRemoveIdentity()
00439 {
00440 assert( !mIdentityDialog );
00441
00442 KPIM::IdentityManager * im = kmkernel->identityManager();
00443 kdFatal( im->shadowIdentities().count() < 2 )
00444 << "Attempted to remove the last identity!" << endl;
00445
00446 IdentityListViewItem * item =
00447 dynamic_cast<IdentityListViewItem*>( mIdentityList->selectedItem() );
00448 if ( !item ) return;
00449
00450 QString msg = i18n("<qt>Do you really want to remove the identity named "
00451 "<b>%1</b>?</qt>").arg( item->identity().identityName() );
00452 if( KMessageBox::warningContinueCancel( this, msg, i18n("Remove Identity"),
00453 KGuiItem(i18n("&Remove"),"editdelete") ) == KMessageBox::Continue )
00454 if ( im->removeIdentity( item->identity().identityName() ) ) {
00455 delete item;
00456 mIdentityList->setSelected( mIdentityList->currentItem(), true );
00457 refreshList();
00458 }
00459 }
00460
00461 void IdentityPage::slotRenameIdentity() {
00462 assert( !mIdentityDialog );
00463
00464 QListViewItem * item = mIdentityList->selectedItem();
00465 if ( !item ) return;
00466
00467 mIdentityList->rename( item, 0 );
00468 }
00469
00470 void IdentityPage::slotRenameIdentity( QListViewItem * i,
00471 const QString & s, int col ) {
00472 assert( col == 0 );
00473 Q_UNUSED( col );
00474
00475 IdentityListViewItem * item = dynamic_cast<IdentityListViewItem*>( i );
00476 if ( !item ) return;
00477
00478 QString newName = s.stripWhiteSpace();
00479 if ( !newName.isEmpty() &&
00480 !kmkernel->identityManager()->shadowIdentities().contains( newName ) ) {
00481 KPIM::Identity & ident = item->identity();
00482 ident.setIdentityName( newName );
00483 emit changed(true);
00484 }
00485 item->redisplay();
00486 }
00487
00488 void IdentityPage::slotContextMenu( KListView *, QListViewItem * i,
00489 const QPoint & pos ) {
00490 IdentityListViewItem * item = dynamic_cast<IdentityListViewItem*>( i );
00491
00492 QPopupMenu * menu = new QPopupMenu( this );
00493 menu->insertItem( i18n("Add..."), this, SLOT(slotNewIdentity()) );
00494 if ( item ) {
00495 menu->insertItem( i18n("Modify..."), this, SLOT(slotModifyIdentity()) );
00496 if ( mIdentityList->childCount() > 1 )
00497 menu->insertItem( i18n("Remove"), this, SLOT(slotRemoveIdentity()) );
00498 if ( !item->identity().isDefault() )
00499 menu->insertItem( i18n("Set as Default"), this, SLOT(slotSetAsDefault()) );
00500 }
00501 menu->exec( pos );
00502 delete menu;
00503 }
00504
00505
00506 void IdentityPage::slotSetAsDefault() {
00507 assert( !mIdentityDialog );
00508
00509 IdentityListViewItem * item =
00510 dynamic_cast<IdentityListViewItem*>( mIdentityList->selectedItem() );
00511 if ( !item ) return;
00512
00513 KPIM::IdentityManager * im = kmkernel->identityManager();
00514 im->setAsDefault( item->identity().identityName() );
00515 refreshList();
00516 }
00517
00518 void IdentityPage::refreshList() {
00519 for ( QListViewItemIterator it( mIdentityList ) ; it.current() ; ++it ) {
00520 IdentityListViewItem * item =
00521 dynamic_cast<IdentityListViewItem*>(it.current());
00522 if ( item )
00523 item->redisplay();
00524 }
00525 emit changed(true);
00526 }
00527
00528 void IdentityPage::slotIdentitySelectionChanged()
00529 {
00530 IdentityListViewItem *item =
00531 dynamic_cast<IdentityListViewItem*>( mIdentityList->selectedItem() );
00532
00533 mRemoveButton->setEnabled( item && mIdentityList->childCount() > 1 );
00534 mModifyButton->setEnabled( item );
00535 mRenameButton->setEnabled( item );
00536 mSetAsDefaultButton->setEnabled( item && !item->identity().isDefault() );
00537 }
00538
00539 void IdentityPage::slotUpdateTransportCombo( const QStringList & sl )
00540 {
00541 if ( mIdentityDialog ) mIdentityDialog->slotUpdateTransportCombo( sl );
00542 }
00543
00544
00545
00546
00547
00548
00549
00550
00551 QString AccountsPage::helpAnchor() const {
00552 return QString::fromLatin1("configure-accounts");
00553 }
00554
00555 AccountsPage::AccountsPage( QWidget * parent, const char * name )
00556 : ConfigModuleWithTabs( parent, name )
00557 {
00558
00559
00560
00561 mReceivingTab = new ReceivingTab();
00562 addTab( mReceivingTab, i18n( "&Receiving" ) );
00563 connect( mReceivingTab, SIGNAL(accountListChanged(const QStringList &)),
00564 this, SIGNAL(accountListChanged(const QStringList &)) );
00565
00566
00567
00568
00569 mSendingTab = new SendingTab();
00570 addTab( mSendingTab, i18n( "&Sending" ) );
00571 connect( mSendingTab, SIGNAL(transportListChanged(const QStringList&)),
00572 this, SIGNAL(transportListChanged(const QStringList&)) );
00573
00574 load();
00575 }
00576
00577 QString AccountsPage::SendingTab::helpAnchor() const {
00578 return QString::fromLatin1("configure-accounts-sending");
00579 }
00580
00581 AccountsPageSendingTab::AccountsPageSendingTab( QWidget * parent, const char * name )
00582 : ConfigModuleTab( parent, name )
00583 {
00584 mTransportInfoList.setAutoDelete( true );
00585
00586 QVBoxLayout *vlay;
00587 QVBoxLayout *btn_vlay;
00588 QHBoxLayout *hlay;
00589 QGridLayout *glay;
00590 QPushButton *button;
00591 QGroupBox *group;
00592
00593 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
00594
00595 vlay->addWidget( new QLabel( i18n("Outgoing accounts (add at least one):"), this ) );
00596
00597
00598 hlay = new QHBoxLayout();
00599 vlay->addLayout( hlay, 10 );
00600
00601
00602
00603 mTransportList = new ListView( this, "transportList", 5 );
00604 mTransportList->addColumn( i18n("Name") );
00605 mTransportList->addColumn( i18n("Type") );
00606 mTransportList->setAllColumnsShowFocus( true );
00607 mTransportList->setSorting( -1 );
00608 connect( mTransportList, SIGNAL(selectionChanged()),
00609 this, SLOT(slotTransportSelected()) );
00610 connect( mTransportList, SIGNAL(doubleClicked( QListViewItem *)),
00611 this, SLOT(slotModifySelectedTransport()) );
00612 hlay->addWidget( mTransportList, 1 );
00613
00614
00615 btn_vlay = new QVBoxLayout( hlay );
00616
00617
00618 button = new QPushButton( i18n("A&dd..."), this );
00619 button->setAutoDefault( false );
00620 connect( button, SIGNAL(clicked()),
00621 this, SLOT(slotAddTransport()) );
00622 btn_vlay->addWidget( button );
00623
00624
00625 mModifyTransportButton = new QPushButton( i18n("&Modify..."), this );
00626 mModifyTransportButton->setAutoDefault( false );
00627 mModifyTransportButton->setEnabled( false );
00628 connect( mModifyTransportButton, SIGNAL(clicked()),
00629 this, SLOT(slotModifySelectedTransport()) );
00630 btn_vlay->addWidget( mModifyTransportButton );
00631
00632
00633 mRemoveTransportButton = new QPushButton( i18n("R&emove"), this );
00634 mRemoveTransportButton->setAutoDefault( false );
00635 mRemoveTransportButton->setEnabled( false );
00636 connect( mRemoveTransportButton, SIGNAL(clicked()),
00637 this, SLOT(slotRemoveSelectedTransport()) );
00638 btn_vlay->addWidget( mRemoveTransportButton );
00639
00640 mSetDefaultTransportButton = new QPushButton( i18n("Set Default"), this );
00641 mSetDefaultTransportButton->setAutoDefault( false );
00642 mSetDefaultTransportButton->setEnabled( false );
00643 connect ( mSetDefaultTransportButton, SIGNAL(clicked()),
00644 this, SLOT(slotSetDefaultTransport()) );
00645 btn_vlay->addWidget( mSetDefaultTransportButton );
00646 btn_vlay->addStretch( 1 );
00647
00648
00649 group = new QGroupBox( 0, Qt::Vertical,
00650 i18n("Common Options"), this );
00651 vlay->addWidget(group);
00652
00653
00654 glay = new QGridLayout( group->layout(), 5, 3, KDialog::spacingHint() );
00655 glay->setColStretch( 2, 10 );
00656
00657
00658 mConfirmSendCheck = new QCheckBox( i18n("Confirm &before send"), group );
00659 glay->addMultiCellWidget( mConfirmSendCheck, 0, 0, 0, 1 );
00660 connect( mConfirmSendCheck, SIGNAL( stateChanged( int ) ),
00661 this, SLOT( slotEmitChanged( void ) ) );
00662
00663
00664 mSendOnCheckCombo = new QComboBox( false, group );
00665 mSendOnCheckCombo->insertStringList( QStringList()
00666 << i18n("Never Automatically")
00667 << i18n("On Manual Mail Checks")
00668 << i18n("On All Mail Checks") );
00669 glay->addWidget( mSendOnCheckCombo, 1, 1 );
00670 connect( mSendOnCheckCombo, SIGNAL( activated( int ) ),
00671 this, SLOT( slotEmitChanged( void ) ) );
00672
00673
00674 mSendMethodCombo = new QComboBox( false, group );
00675 mSendMethodCombo->insertStringList( QStringList()
00676 << i18n("Send Now")
00677 << i18n("Send Later") );
00678 glay->addWidget( mSendMethodCombo, 2, 1 );
00679 connect( mSendMethodCombo, SIGNAL( activated( int ) ),
00680 this, SLOT( slotEmitChanged( void ) ) );
00681
00682
00683
00684
00685 mMessagePropertyCombo = new QComboBox( false, group );
00686 mMessagePropertyCombo->insertStringList( QStringList()
00687 << i18n("Allow 8-bit")
00688 << i18n("MIME Compliant (Quoted Printable)") );
00689 glay->addWidget( mMessagePropertyCombo, 3, 1 );
00690 connect( mMessagePropertyCombo, SIGNAL( activated( int ) ),
00691 this, SLOT( slotEmitChanged( void ) ) );
00692
00693
00694 mDefaultDomainEdit = new KLineEdit( group );
00695 glay->addMultiCellWidget( mDefaultDomainEdit, 4, 4, 1, 2 );
00696 connect( mDefaultDomainEdit, SIGNAL( textChanged( const QString& ) ),
00697 this, SLOT( slotEmitChanged( void ) ) );
00698
00699
00700 QLabel *l = new QLabel( mSendOnCheckCombo,
00701 i18n("Send &messages in outbox folder:"), group );
00702 glay->addWidget( l, 1, 0 );
00703
00704 QString msg = i18n( GlobalSettings::self()->sendOnCheckItem()->whatsThis().utf8() );
00705 QWhatsThis::add( l, msg );
00706 QWhatsThis::add( mSendOnCheckCombo, msg );
00707
00708 glay->addWidget( new QLabel( mSendMethodCombo,
00709 i18n("Defa&ult send method:"), group ), 2, 0 );
00710 glay->addWidget( new QLabel( mMessagePropertyCombo,
00711 i18n("Message &property:"), group ), 3, 0 );
00712 l = new QLabel( mDefaultDomainEdit,
00713 i18n("Defaul&t domain:"), group );
00714 glay->addWidget( l, 4, 0 );
00715
00716
00717 msg = i18n( "<qt><p>The default domain is used to complete email "
00718 "addresses that only consist of the user's name."
00719 "</p></qt>" );
00720 QWhatsThis::add( l, msg );
00721 QWhatsThis::add( mDefaultDomainEdit, msg );
00722 }
00723
00724
00725 void AccountsPage::SendingTab::slotTransportSelected()
00726 {
00727 QListViewItem *cur = mTransportList->selectedItem();
00728 mModifyTransportButton->setEnabled( cur );
00729 mRemoveTransportButton->setEnabled( cur );
00730 mSetDefaultTransportButton->setEnabled( cur );
00731 }
00732
00733
00734 static inline QString uniqueName( const QStringList & list,
00735 const QString & name )
00736 {
00737 int suffix = 1;
00738 QString result = name;
00739 while ( list.find( result ) != list.end() ) {
00740 result = i18n("%1: name; %2: number appended to it to make it unique "
00741 "among a list of names", "%1 %2")
00742 .arg( name ).arg( suffix );
00743 suffix++;
00744 }
00745 return result;
00746 }
00747
00748 void AccountsPage::SendingTab::slotSetDefaultTransport()
00749 {
00750 QListViewItem *item = mTransportList->selectedItem();
00751 if ( !item ) return;
00752
00753 KMTransportInfo ti;
00754
00755 QListViewItemIterator it( mTransportList );
00756 for ( ; it.current(); ++it ) {
00757 ti.readConfig( KMTransportInfo::findTransport( it.current()->text(0) ));
00758 if ( ti.type != "sendmail" ) {
00759 it.current()->setText( 1, "smtp" );
00760 } else {
00761 it.current()->setText( 1, "sendmail" );
00762 }
00763 }
00764
00765 if ( item->text(1) != "sendmail" ) {
00766 item->setText( 1, i18n( "smtp (Default)" ));
00767 } else {
00768 item->setText( 1, i18n( "sendmail (Default)" ));
00769 }
00770
00771 GlobalSettings::self()->setDefaultTransport( item->text(0) );
00772
00773 }
00774
00775 void AccountsPage::SendingTab::slotAddTransport()
00776 {
00777 int transportType;
00778
00779 {
00780 KMTransportSelDlg selDialog( this );
00781 if ( selDialog.exec() != QDialog::Accepted ) return;
00782 transportType = selDialog.selected();
00783 }
00784
00785 KMTransportInfo *transportInfo = new KMTransportInfo();
00786 switch ( transportType ) {
00787 case 0:
00788 transportInfo->type = QString::fromLatin1("smtp");
00789 break;
00790 case 1:
00791 transportInfo->type = QString::fromLatin1("sendmail");
00792 transportInfo->name = i18n("Sendmail");
00793 transportInfo->host = _PATH_SENDMAIL;
00794 break;
00795 default:
00796 assert( 0 );
00797 }
00798
00799 KMTransportDialog dialog( i18n("Add Transport"), transportInfo, this );
00800
00801
00802
00803 QStringList transportNames;
00804 QPtrListIterator<KMTransportInfo> it( mTransportInfoList );
00805 for ( it.toFirst() ; it.current() ; ++it )
00806 transportNames << (*it)->name;
00807
00808 if( dialog.exec() != QDialog::Accepted ) {
00809 delete transportInfo;
00810 return;
00811 }
00812
00813
00814
00815 transportInfo->name = uniqueName( transportNames, transportInfo->name );
00816
00817 transportNames << transportInfo->name;
00818 mTransportInfoList.append( transportInfo );
00819
00820
00821
00822 QListViewItem *lastItem = mTransportList->firstChild();
00823 QString typeDisplayName;
00824 if ( lastItem ) {
00825 typeDisplayName = transportInfo->type;
00826 } else {
00827 typeDisplayName = i18n("%1: type of transport. Result used in "
00828 "Configure->Accounts->Sending listview, \"type\" "
00829 "column, first row, to indicate that this is the "
00830 "default transport", "%1 (Default)")
00831 .arg( transportInfo->type );
00832 GlobalSettings::self()->setDefaultTransport( transportInfo->name );
00833 }
00834 (void) new QListViewItem( mTransportList, lastItem, transportInfo->name,
00835 typeDisplayName );
00836
00837
00838 emit transportListChanged( transportNames );
00839 emit changed( true );
00840 }
00841
00842 void AccountsPage::SendingTab::slotModifySelectedTransport()
00843 {
00844 QListViewItem *item = mTransportList->selectedItem();
00845 if ( !item ) return;
00846
00847 const QString& originalTransport = item->text(0);
00848
00849 QPtrListIterator<KMTransportInfo> it( mTransportInfoList );
00850 for ( it.toFirst() ; it.current() ; ++it )
00851 if ( (*it)->name == item->text(0) ) break;
00852 if ( !it.current() ) return;
00853
00854 KMTransportDialog dialog( i18n("Modify Transport"), (*it), this );
00855
00856 if ( dialog.exec() != QDialog::Accepted ) return;
00857
00858
00859
00860 QStringList transportNames;
00861 QPtrListIterator<KMTransportInfo> jt( mTransportInfoList );
00862 int entryLocation = -1;
00863 for ( jt.toFirst() ; jt.current() ; ++jt )
00864 if ( jt != it )
00865 transportNames << (*jt)->name;
00866 else
00867 entryLocation = transportNames.count();
00868 assert( entryLocation >= 0 );
00869
00870
00871 (*it)->name = uniqueName( transportNames, (*it)->name );
00872
00873 item->setText( 0, (*it)->name );
00874
00875
00876 transportNames.insert( transportNames.at( entryLocation ), (*it)->name );
00877 const QString& newTransportName = (*it)->name;
00878
00879 QStringList changedIdents;
00880 KPIM::IdentityManager * im = kmkernel->identityManager();
00881 for ( KPIM::IdentityManager::Iterator it = im->modifyBegin(); it != im->modifyEnd(); ++it ) {
00882 if ( originalTransport == (*it).transport() ) {
00883 (*it).setTransport( newTransportName );
00884 changedIdents += (*it).identityName();
00885 }
00886 }
00887
00888 if ( !changedIdents.isEmpty() ) {
00889 QString information = i18n( "This identity has been changed to use the modified transport:",
00890 "These %n identities have been changed to use the modified transport:",
00891 changedIdents.count() );
00892 KMessageBox::informationList( this, information, changedIdents );
00893 }
00894
00895 emit transportListChanged( transportNames );
00896 emit changed( true );
00897 }
00898
00899 void AccountsPage::SendingTab::slotRemoveSelectedTransport()
00900 {
00901 QListViewItem *item = mTransportList->selectedItem();
00902 if ( !item ) return;
00903
00904 QStringList changedIdents;
00905 KPIM::IdentityManager * im = kmkernel->identityManager();
00906 for ( KPIM::IdentityManager::Iterator it = im->modifyBegin(); it != im->modifyEnd(); ++it ) {
00907 if ( item->text( 0 ) == (*it).transport() ) {
00908 (*it).setTransport( QString::null );
00909 changedIdents += (*it).identityName();
00910 }
00911 }
00912
00913
00914 const QString& currentTransport = GlobalSettings::self()->currentTransport();
00915 if ( item->text( 0 ) == currentTransport ) {
00916 GlobalSettings::self()->setCurrentTransport( QString::null );
00917 }
00918
00919 if ( !changedIdents.isEmpty() ) {
00920 QString information = i18n( "This identity has been changed to use the default transport:",
00921 "These %n identities have been changed to use the default transport:",
00922 changedIdents.count() );
00923 KMessageBox::informationList( this, information, changedIdents );
00924 }
00925
00926 QPtrListIterator<KMTransportInfo> it( mTransportInfoList );
00927 for ( it.toFirst() ; it.current() ; ++it )
00928 if ( (*it)->name == item->text(0) ) break;
00929 if ( !it.current() ) return;
00930
00931 KMTransportInfo ti;
00932
00933 QListViewItem *newCurrent = item->itemBelow();
00934 if ( !newCurrent ) newCurrent = item->itemAbove();
00935
00936 if ( newCurrent ) {
00937 mTransportList->setCurrentItem( newCurrent );
00938 mTransportList->setSelected( newCurrent, true );
00939 GlobalSettings::self()->setDefaultTransport( newCurrent->text(0) );
00940 ti.readConfig( KMTransportInfo::findTransport( newCurrent->text(0) ));
00941 if ( item->text( 0 ) == GlobalSettings::self()->defaultTransport() ) {
00942 if ( ti.type != "sendmail" ) {
00943 newCurrent->setText( 1, i18n("smtp (Default)") );
00944 } else {
00945 newCurrent->setText( 1, i18n("sendmail (Default)" ));
00946 }
00947 }
00948 } else {
00949 GlobalSettings::self()->setDefaultTransport( QString::null );
00950 }
00951
00952 delete item;
00953 mTransportInfoList.remove( it );
00954
00955 QStringList transportNames;
00956 for ( it.toFirst() ; it.current() ; ++it )
00957 transportNames << (*it)->name;
00958 emit transportListChanged( transportNames );
00959 emit changed( true );
00960 }
00961
00962 void AccountsPage::SendingTab::doLoadFromGlobalSettings() {
00963 mSendOnCheckCombo->setCurrentItem( GlobalSettings::self()->sendOnCheck() );
00964 }
00965
00966 void AccountsPage::SendingTab::doLoadOther() {
00967 KConfigGroup general( KMKernel::config(), "General");
00968 KConfigGroup composer( KMKernel::config(), "Composer");
00969
00970 int numTransports = general.readNumEntry("transports", 0);
00971
00972 QListViewItem *top = 0;
00973 mTransportInfoList.clear();
00974 mTransportList->clear();
00975 QStringList transportNames;
00976 for ( int i = 1 ; i <= numTransports ; i++ ) {
00977 KMTransportInfo *ti = new KMTransportInfo();
00978 ti->readConfig(i);
00979 mTransportInfoList.append( ti );
00980 transportNames << ti->name;
00981 top = new QListViewItem( mTransportList, top, ti->name, ti->type );
00982 }
00983 emit transportListChanged( transportNames );
00984
00985 const QString &defaultTransport = GlobalSettings::self()->defaultTransport();
00986
00987 QListViewItemIterator it( mTransportList );
00988 for ( ; it.current(); ++it ) {
00989 if ( it.current()->text(0) == defaultTransport ) {
00990 if ( it.current()->text(1) != "sendmail" ) {
00991 it.current()->setText( 1, i18n( "smtp (Default)" ));
00992 } else {
00993 it.current()->setText( 1, i18n( "sendmail (Default)" ));
00994 }
00995 } else {
00996 if ( it.current()->text(1) != "sendmail" ) {
00997 it.current()->setText( 1, "smtp" );
00998 } else {
00999 it.current()->setText( 1, "sendmail" );
01000 }
01001 }
01002 }
01003
01004 mSendMethodCombo->setCurrentItem(
01005 kmkernel->msgSender()->sendImmediate() ? 0 : 1 );
01006 mMessagePropertyCombo->setCurrentItem(
01007 kmkernel->msgSender()->sendQuotedPrintable() ? 1 : 0 );
01008
01009 mConfirmSendCheck->setChecked( composer.readBoolEntry( "confirm-before-send",
01010 false ) );
01011 QString str = general.readEntry( "Default domain" );
01012 if( str.isEmpty() )
01013 {
01014
01015
01016
01017 char buffer[256];
01018 if ( !gethostname( buffer, 255 ) )
01019
01020 buffer[255] = 0;
01021 else
01022 buffer[0] = 0;
01023 str = QString::fromLatin1( *buffer ? buffer : "localhost" );
01024 }
01025 mDefaultDomainEdit->setText( str );
01026 }
01027
01028 void AccountsPage::SendingTab::save() {
01029 KConfigGroup general( KMKernel::config(), "General" );
01030 KConfigGroup composer( KMKernel::config(), "Composer" );
01031
01032
01033 general.writeEntry( "transports", mTransportInfoList.count() );
01034 QPtrListIterator<KMTransportInfo> it( mTransportInfoList );
01035 for ( int i = 1 ; it.current() ; ++it, ++i )
01036 (*it)->writeConfig(i);
01037
01038
01039 GlobalSettings::self()->setSendOnCheck( mSendOnCheckCombo->currentItem() );
01040 kmkernel->msgSender()->setSendImmediate(
01041 mSendMethodCombo->currentItem() == 0 );
01042 kmkernel->msgSender()->setSendQuotedPrintable(
01043 mMessagePropertyCombo->currentItem() == 1 );
01044 kmkernel->msgSender()->writeConfig( false );
01045 composer.writeEntry("confirm-before-send", mConfirmSendCheck->isChecked() );
01046 general.writeEntry( "Default domain", mDefaultDomainEdit->text() );
01047 }
01048
01049 QString AccountsPage::ReceivingTab::helpAnchor() const {
01050 return QString::fromLatin1("configure-accounts-receiving");
01051 }
01052
01053 AccountsPageReceivingTab::AccountsPageReceivingTab( QWidget * parent, const char * name )
01054 : ConfigModuleTab ( parent, name )
01055 {
01056
01057 QVBoxLayout *vlay;
01058 QVBoxLayout *btn_vlay;
01059 QHBoxLayout *hlay;
01060 QPushButton *button;
01061 QGroupBox *group;
01062
01063 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
01064
01065
01066 vlay->addWidget( new QLabel( i18n("Incoming accounts (add at least one):"), this ) );
01067
01068
01069 hlay = new QHBoxLayout();
01070 vlay->addLayout( hlay, 10 );
01071
01072
01073 mAccountList = new ListView( this, "accountList", 5 );
01074 mAccountList->addColumn( i18n("Name") );
01075 mAccountList->addColumn( i18n("Type") );
01076 mAccountList->addColumn( i18n("Folder") );
01077 mAccountList->setAllColumnsShowFocus( true );
01078 mAccountList->setSorting( -1 );
01079 connect( mAccountList, SIGNAL(selectionChanged()),
01080 this, SLOT(slotAccountSelected()) );
01081 connect( mAccountList, SIGNAL(doubleClicked( QListViewItem *)),
01082 this, SLOT(slotModifySelectedAccount()) );
01083 hlay->addWidget( mAccountList, 1 );
01084
01085
01086 btn_vlay = new QVBoxLayout( hlay );
01087
01088
01089 button = new QPushButton( i18n("A&dd..."), this );
01090 button->setAutoDefault( false );
01091 connect( button, SIGNAL(clicked()),
01092 this, SLOT(slotAddAccount()) );
01093 btn_vlay->addWidget( button );
01094
01095
01096 mModifyAccountButton = new QPushButton( i18n("&Modify..."), this );
01097 mModifyAccountButton->setAutoDefault( false );
01098 mModifyAccountButton->setEnabled( false );
01099 connect( mModifyAccountButton, SIGNAL(clicked()),
01100 this, SLOT(slotModifySelectedAccount()) );
01101 btn_vlay->addWidget( mModifyAccountButton );
01102
01103
01104 mRemoveAccountButton = new QPushButton( i18n("R&emove"), this );
01105 mRemoveAccountButton->setAutoDefault( false );
01106 mRemoveAccountButton->setEnabled( false );
01107 connect( mRemoveAccountButton, SIGNAL(clicked()),
01108 this, SLOT(slotRemoveSelectedAccount()) );
01109 btn_vlay->addWidget( mRemoveAccountButton );
01110 btn_vlay->addStretch( 1 );
01111
01112 mCheckmailStartupCheck = new QCheckBox( i18n("Chec&k mail on startup"), this );
01113 vlay->addWidget( mCheckmailStartupCheck );
01114 connect( mCheckmailStartupCheck, SIGNAL( stateChanged( int ) ),
01115 this, SLOT( slotEmitChanged( void ) ) );
01116
01117
01118 group = new QVGroupBox( i18n("New Mail Notification"), this );
01119 vlay->addWidget( group );
01120 group->layout()->setSpacing( KDialog::spacingHint() );
01121
01122
01123 mBeepNewMailCheck = new QCheckBox(i18n("&Beep"), group );
01124 mBeepNewMailCheck->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding,
01125 QSizePolicy::Fixed ) );
01126 connect( mBeepNewMailCheck, SIGNAL( stateChanged( int ) ),
01127 this, SLOT( slotEmitChanged( void ) ) );
01128
01129
01130 mVerboseNotificationCheck =
01131 new QCheckBox( i18n( "Deta&iled new mail notification" ), group );
01132 mVerboseNotificationCheck->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding,
01133 QSizePolicy::Fixed ) );
01134 QToolTip::add( mVerboseNotificationCheck,
01135 i18n( "Show for each folder the number of newly arrived "
01136 "messages" ) );
01137 QWhatsThis::add( mVerboseNotificationCheck,
01138 GlobalSettings::self()->verboseNewMailNotificationItem()->whatsThis() );
01139 connect( mVerboseNotificationCheck, SIGNAL( stateChanged( int ) ),
01140 this, SLOT( slotEmitChanged() ) );
01141
01142
01143 mOtherNewMailActionsButton = new QPushButton( i18n("Other Actio&ns"), group );
01144 mOtherNewMailActionsButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed,
01145 QSizePolicy::Fixed ) );
01146 connect( mOtherNewMailActionsButton, SIGNAL(clicked()),
01147 this, SLOT(slotEditNotifications()) );
01148 }
01149
01150 AccountsPageReceivingTab::~AccountsPageReceivingTab()
01151 {
01152
01153
01154
01155
01156 QValueList< QGuardedPtr<KMAccount> >::Iterator it;
01157 for (it = mNewAccounts.begin(); it != mNewAccounts.end(); ++it ) {
01158 delete (*it);
01159 }
01160 mNewAccounts.clear();
01161
01162
01163 QValueList<ModifiedAccountsType*>::Iterator j;
01164 for ( j = mModifiedAccounts.begin() ; j != mModifiedAccounts.end() ; ++j ) {
01165 delete (*j)->newAccount;
01166 delete (*j);
01167 }
01168 mModifiedAccounts.clear();
01169
01170
01171 }
01172
01173 void AccountsPage::ReceivingTab::slotAccountSelected()
01174 {
01175 QListViewItem * item = mAccountList->selectedItem();
01176 mModifyAccountButton->setEnabled( item );
01177 mRemoveAccountButton->setEnabled( item );
01178 }
01179
01180 QStringList AccountsPage::ReceivingTab::occupiedNames()
01181 {
01182 QStringList accountNames = kmkernel->acctMgr()->getAccounts();
01183
01184 QValueList<ModifiedAccountsType*>::Iterator k;
01185 for (k = mModifiedAccounts.begin(); k != mModifiedAccounts.end(); ++k )
01186 if ((*k)->oldAccount)
01187 accountNames.remove( (*k)->oldAccount->name() );
01188
01189 QValueList< QGuardedPtr<KMAccount> >::Iterator l;
01190 for (l = mAccountsToDelete.begin(); l != mAccountsToDelete.end(); ++l )
01191 if (*l)
01192 accountNames.remove( (*l)->name() );
01193
01194 QValueList< QGuardedPtr<KMAccount> >::Iterator it;
01195 for (it = mNewAccounts.begin(); it != mNewAccounts.end(); ++it )
01196 if (*it)
01197 accountNames += (*it)->name();
01198
01199 QValueList<ModifiedAccountsType*>::Iterator j;
01200 for (j = mModifiedAccounts.begin(); j != mModifiedAccounts.end(); ++j )
01201 accountNames += (*j)->newAccount->name();
01202
01203 return accountNames;
01204 }
01205
01206 void AccountsPage::ReceivingTab::slotAddAccount() {
01207 KMAcctSelDlg accountSelectorDialog( this );
01208 if( accountSelectorDialog.exec() != QDialog::Accepted ) return;
01209
01210 const char *accountType = 0;
01211 switch ( accountSelectorDialog.selected() ) {
01212 case 0: accountType = "local"; break;
01213 case 1: accountType = "pop"; break;
01214 case 2: accountType = "imap"; break;
01215 case 3: accountType = "cachedimap"; break;
01216 case 4: accountType = "maildir"; break;
01217
01218 default:
01219
01220
01221 KMessageBox::sorry( this, i18n("Unknown account type selected") );
01222 return;
01223 }
01224
01225 KMAccount *account
01226 = kmkernel->acctMgr()->create( QString::fromLatin1( accountType ) );
01227 if ( !account ) {
01228
01229
01230 KMessageBox::sorry( this, i18n("Unable to create account") );
01231 return;
01232 }
01233
01234 account->init();
01235
01236 AccountDialog dialog( i18n("Add Account"), account, this );
01237
01238 QStringList accountNames = occupiedNames();
01239
01240 if( dialog.exec() != QDialog::Accepted ) {
01241 delete account;
01242 return;
01243 }
01244
01245 account->deinstallTimer();
01246 account->setName( uniqueName( accountNames, account->name() ) );
01247
01248 QListViewItem *after = mAccountList->firstChild();
01249 while ( after && after->nextSibling() )
01250 after = after->nextSibling();
01251
01252 QListViewItem *listItem =
01253 new QListViewItem( mAccountList, after, account->name(), account->type() );
01254 if( account->folder() )
01255 listItem->setText( 2, account->folder()->label() );
01256
01257 mNewAccounts.append( account );
01258 emit changed( true );
01259 }
01260
01261
01262
01263 void AccountsPage::ReceivingTab::slotModifySelectedAccount()
01264 {
01265 QListViewItem *listItem = mAccountList->selectedItem();
01266 if( !listItem ) return;
01267
01268 KMAccount *account = 0;
01269 QValueList<ModifiedAccountsType*>::Iterator j;
01270 for (j = mModifiedAccounts.begin(); j != mModifiedAccounts.end(); ++j )
01271 if ( (*j)->newAccount->name() == listItem->text(0) ) {
01272 account = (*j)->newAccount;
01273 break;
01274 }
01275
01276 if ( !account ) {
01277 QValueList< QGuardedPtr<KMAccount> >::Iterator it;
01278 for ( it = mNewAccounts.begin() ; it != mNewAccounts.end() ; ++it )
01279 if ( (*it)->name() == listItem->text(0) ) {
01280 account = *it;
01281 break;
01282 }
01283
01284 if ( !account ) {
01285 account = kmkernel->acctMgr()->findByName( listItem->text(0) );
01286 if( !account ) {
01287
01288 KMessageBox::sorry( this, i18n("Unable to locate account") );
01289 return;
01290 }
01291 if ( account->type() == "imap" || account->type() == "cachedimap" )
01292 {
01293 ImapAccountBase* ai = static_cast<ImapAccountBase*>( account );
01294 if ( ai->namespaces().isEmpty() || ai->namespaceToDelimiter().isEmpty() )
01295 {
01296
01297 kdDebug(5006) << "slotModifySelectedAccount - connect" << endl;
01298 ai->makeConnection();
01299 }
01300 }
01301
01302 ModifiedAccountsType *mod = new ModifiedAccountsType;
01303 mod->oldAccount = account;
01304 mod->newAccount = kmkernel->acctMgr()->create( account->type(),
01305 account->name() );
01306 mod->newAccount->pseudoAssign( account );
01307 mModifiedAccounts.append( mod );
01308 account = mod->newAccount;
01309 }
01310 }
01311
01312 QStringList accountNames = occupiedNames();
01313 accountNames.remove( account->name() );
01314
01315 AccountDialog dialog( i18n("Modify Account"), account, this );
01316
01317 if( dialog.exec() != QDialog::Accepted ) return;
01318
01319 account->setName( uniqueName( accountNames, account->name() ) );
01320
01321 listItem->setText( 0, account->name() );
01322 listItem->setText( 1, account->type() );
01323 if( account->folder() )
01324 listItem->setText( 2, account->folder()->label() );
01325
01326 emit changed( true );
01327 }
01328
01329
01330
01331 void AccountsPage::ReceivingTab::slotRemoveSelectedAccount() {
01332 QListViewItem *listItem = mAccountList->selectedItem();
01333 if( !listItem ) return;
01334
01335 KMAccount *acct = 0;
01336 QValueList<ModifiedAccountsType*>::Iterator j;
01337 for ( j = mModifiedAccounts.begin() ; j != mModifiedAccounts.end() ; ++j )
01338 if ( (*j)->newAccount->name() == listItem->text(0) ) {
01339 acct = (*j)->oldAccount;
01340 mAccountsToDelete.append( acct );
01341 mModifiedAccounts.remove( j );
01342 break;
01343 }
01344 if ( !acct ) {
01345 QValueList< QGuardedPtr<KMAccount> >::Iterator it;
01346 for ( it = mNewAccounts.begin() ; it != mNewAccounts.end() ; ++it )
01347 if ( (*it)->name() == listItem->text(0) ) {
01348 acct = *it;
01349 mNewAccounts.remove( it );
01350 break;
01351 }
01352 }
01353 if ( !acct ) {
01354 acct = kmkernel->acctMgr()->findByName( listItem->text(0) );
01355 if ( acct )
01356 mAccountsToDelete.append( acct );
01357 }
01358 if ( !acct ) {
01359
01360 KMessageBox::sorry( this, i18n("<qt>Unable to locate account <b>%1</b>.</qt>")
01361 .arg(listItem->text(0)) );
01362 return;
01363 }
01364
01365 QListViewItem * item = listItem->itemBelow();
01366 if ( !item ) item = listItem->itemAbove();
01367 delete listItem;
01368
01369 if ( item )
01370 mAccountList->setSelected( item, true );
01371
01372 emit changed( true );
01373 }
01374
01375 void AccountsPage::ReceivingTab::slotEditNotifications()
01376 {
01377 if(kmkernel->xmlGuiInstance())
01378 KNotifyDialog::configure(this, 0, kmkernel->xmlGuiInstance()->aboutData());
01379 else
01380 KNotifyDialog::configure(this);
01381 }
01382
01383 void AccountsPage::ReceivingTab::doLoadFromGlobalSettings() {
01384 mVerboseNotificationCheck->setChecked( GlobalSettings::self()->verboseNewMailNotification() );
01385 }
01386
01387 void AccountsPage::ReceivingTab::doLoadOther() {
01388 KConfigGroup general( KMKernel::config(), "General" );
01389
01390 mAccountList->clear();
01391 QListViewItem *top = 0;
01392
01393 for( KMAccount *a = kmkernel->acctMgr()->first(); a!=0;
01394 a = kmkernel->acctMgr()->next() ) {
01395 QListViewItem *listItem =
01396 new QListViewItem( mAccountList, top, a->name(), a->type() );
01397 if( a->folder() )
01398 listItem->setText( 2, a->folder()->label() );
01399 top = listItem;
01400 }
01401 QListViewItem *listItem = mAccountList->firstChild();
01402 if ( listItem ) {
01403 mAccountList->setCurrentItem( listItem );
01404 mAccountList->setSelected( listItem, true );
01405 }
01406
01407 mBeepNewMailCheck->setChecked( general.readBoolEntry("beep-on-mail", false ) );
01408 mCheckmailStartupCheck->setChecked( general.readBoolEntry("checkmail-startup", false) );
01409 QTimer::singleShot( 0, this, SLOT( slotTweakAccountList() ) );
01410 }
01411
01412 void AccountsPage::ReceivingTab::slotTweakAccountList()
01413 {
01414
01415
01416 mAccountList->resizeContents( mAccountList->visibleWidth(), mAccountList->contentsHeight() );
01417 }
01418
01419 void AccountsPage::ReceivingTab::save() {
01420
01421 QValueList< QGuardedPtr<KMAccount> >::Iterator it;
01422 for (it = mNewAccounts.begin(); it != mNewAccounts.end(); ++it ) {
01423 kmkernel->acctMgr()->add( *it );
01424 }
01425
01426
01427 QValueList<ModifiedAccountsType*>::Iterator j;
01428 for ( j = mModifiedAccounts.begin() ; j != mModifiedAccounts.end() ; ++j ) {
01429 (*j)->oldAccount->pseudoAssign( (*j)->newAccount );
01430 delete (*j)->newAccount;
01431 delete (*j);
01432 }
01433 mModifiedAccounts.clear();
01434
01435
01436 for ( it = mAccountsToDelete.begin() ;
01437 it != mAccountsToDelete.end() ; ++it ) {
01438 kmkernel->acctMgr()->writeConfig( true );
01439 if ( (*it) && !kmkernel->acctMgr()->remove(*it) )
01440 KMessageBox::sorry( this, i18n("<qt>Unable to locate account <b>%1</b>.</qt>")
01441 .arg( (*it)->name() ) );
01442 }
01443 mAccountsToDelete.clear();
01444
01445
01446 kmkernel->acctMgr()->writeConfig( false );
01447 kmkernel->cleanupImapFolders();
01448
01449
01450 KConfigGroup general( KMKernel::config(), "General" );
01451 general.writeEntry( "beep-on-mail", mBeepNewMailCheck->isChecked() );
01452 GlobalSettings::self()->setVerboseNewMailNotification( mVerboseNotificationCheck->isChecked() );
01453
01454 general.writeEntry( "checkmail-startup", mCheckmailStartupCheck->isChecked() );
01455
01456
01457 for (it = mNewAccounts.begin(); it != mNewAccounts.end(); ++it ) {
01458 KMAccount *macc = (*it);
01459 ImapAccountBase *acc = dynamic_cast<ImapAccountBase*> (macc);
01460 if ( acc ) {
01461 AccountUpdater *au = new AccountUpdater( acc );
01462 au->update();
01463 }
01464 }
01465 mNewAccounts.clear();
01466
01467 }
01468
01469
01470
01471
01472
01473
01474 QString AppearancePage::helpAnchor() const {
01475 return QString::fromLatin1("configure-appearance");
01476 }
01477
01478 AppearancePage::AppearancePage( QWidget * parent, const char * name )
01479 : ConfigModuleWithTabs( parent, name )
01480 {
01481
01482
01483
01484 mFontsTab = new FontsTab();
01485 addTab( mFontsTab, i18n("&Fonts") );
01486
01487
01488
01489
01490 mColorsTab = new ColorsTab();
01491 addTab( mColorsTab, i18n("Color&s") );
01492
01493
01494
01495
01496 mLayoutTab = new LayoutTab();
01497 addTab( mLayoutTab, i18n("La&yout") );
01498
01499
01500
01501
01502 mHeadersTab = new HeadersTab();
01503 addTab( mHeadersTab, i18n("M&essage List") );
01504
01505
01506
01507
01508 mReaderTab = new ReaderTab();
01509 addTab( mReaderTab, i18n("Message W&indow") );
01510
01511
01512
01513
01514 mSystemTrayTab = new SystemTrayTab();
01515 addTab( mSystemTrayTab, i18n("System &Tray") );
01516
01517 load();
01518 }
01519
01520
01521 QString AppearancePage::FontsTab::helpAnchor() const {
01522 return QString::fromLatin1("configure-appearance-fonts");
01523 }
01524
01525 static const struct {
01526 const char * configName;
01527 const char * displayName;
01528 bool enableFamilyAndSize;
01529 bool onlyFixed;
01530 } fontNames[] = {
01531 { "body-font", I18N_NOOP("Message Body"), true, false },
01532 { "list-font", I18N_NOOP("Message List"), true, false },
01533 { "list-new-font", I18N_NOOP("Message List - New Messages"), true, false },
01534 { "list-unread-font", I18N_NOOP("Message List - Unread Messages"), true, false },
01535 { "list-important-font", I18N_NOOP("Message List - Important Messages"), true, false },
01536 { "list-todo-font", I18N_NOOP("Message List - Todo Messages"), true, false },
01537 { "list-date-font", I18N_NOOP("Message List - Date Field"), true, false },
01538 { "folder-font", I18N_NOOP("Folder List"), true, false },
01539 { "quote1-font", I18N_NOOP("Quoted Text - First Level"), false, false },
01540 { "quote2-font", I18N_NOOP("Quoted Text - Second Level"), false, false },
01541 { "quote3-font", I18N_NOOP("Quoted Text - Third Level"), false, false },
01542 { "fixed-font", I18N_NOOP("Fixed Width Font"), true, true },
01543 { "composer-font", I18N_NOOP("Composer"), true, false },
01544 { "print-font", I18N_NOOP("Printing Output"), true, false },
01545 };
01546 static const int numFontNames = sizeof fontNames / sizeof *fontNames;
01547
01548 AppearancePageFontsTab::AppearancePageFontsTab( QWidget * parent, const char * name )
01549 : ConfigModuleTab( parent, name ), mActiveFontIndex( -1 )
01550 {
01551 assert( numFontNames == sizeof mFont / sizeof *mFont );
01552
01553 QVBoxLayout *vlay;
01554 QHBoxLayout *hlay;
01555 QLabel *label;
01556
01557
01558 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
01559 mCustomFontCheck = new QCheckBox( i18n("&Use custom fonts"), this );
01560 vlay->addWidget( mCustomFontCheck );
01561 vlay->addWidget( new KSeparator( KSeparator::HLine, this ) );
01562 connect ( mCustomFontCheck, SIGNAL( stateChanged( int ) ),
01563 this, SLOT( slotEmitChanged( void ) ) );
01564
01565
01566 hlay = new QHBoxLayout( vlay );
01567 mFontLocationCombo = new QComboBox( false, this );
01568 mFontLocationCombo->setEnabled( false );
01569
01570 QStringList fontDescriptions;
01571 for ( int i = 0 ; i < numFontNames ; i++ )
01572 fontDescriptions << i18n( fontNames[i].displayName );
01573 mFontLocationCombo->insertStringList( fontDescriptions );
01574
01575 label = new QLabel( mFontLocationCombo, i18n("Apply &to:"), this );
01576 label->setEnabled( false );
01577 hlay->addWidget( label );
01578
01579 hlay->addWidget( mFontLocationCombo );
01580 hlay->addStretch( 10 );
01581 vlay->addSpacing( KDialog::spacingHint() );
01582 mFontChooser = new KFontChooser( this, "font", false, QStringList(),
01583 false, 4 );
01584 mFontChooser->setEnabled( false );
01585 vlay->addWidget( mFontChooser );
01586 connect ( mFontChooser, SIGNAL( fontSelected( const QFont& ) ),
01587 this, SLOT( slotEmitChanged( void ) ) );
01588
01589
01590
01591 connect( mCustomFontCheck, SIGNAL(toggled(bool)),
01592 label, SLOT(setEnabled(bool)) );
01593 connect( mCustomFontCheck, SIGNAL(toggled(bool)),
01594 mFontLocationCombo, SLOT(setEnabled(bool)) );
01595 connect( mCustomFontCheck, SIGNAL(toggled(bool)),
01596 mFontChooser, SLOT(setEnabled(bool)) );
01597
01598 connect( mFontLocationCombo, SIGNAL(activated(int) ),
01599 this, SLOT(slotFontSelectorChanged(int)) );
01600 }
01601
01602
01603 void AppearancePage::FontsTab::slotFontSelectorChanged( int index )
01604 {
01605 kdDebug(5006) << "slotFontSelectorChanged() called" << endl;
01606 if( index < 0 || index >= mFontLocationCombo->count() )
01607 return;
01608
01609
01610 if( mActiveFontIndex == 0 ) {
01611 mFont[0] = mFontChooser->font();
01612
01613 for ( int i = 0 ; i < numFontNames ; i++ )
01614 if ( !fontNames[i].enableFamilyAndSize ) {
01615
01616
01617
01618 mFont[i].setFamily( mFont[0].family() );
01619 mFont[i].setPointSize( mFont[0].pointSize() );
01620 }
01621 } else if ( mActiveFontIndex > 0 )
01622 mFont[ mActiveFontIndex ] = mFontChooser->font();
01623 mActiveFontIndex = index;
01624
01625
01626 disconnect ( mFontChooser, SIGNAL( fontSelected( const QFont& ) ),
01627 this, SLOT( slotEmitChanged( void ) ) );
01628
01629
01630 mFontChooser->setFont( mFont[index], fontNames[index].onlyFixed );
01631
01632 connect ( mFontChooser, SIGNAL( fontSelected( const QFont& ) ),
01633 this, SLOT( slotEmitChanged( void ) ) );
01634
01635
01636 mFontChooser->enableColumn( KFontChooser::FamilyList|KFontChooser::SizeList,
01637 fontNames[ index ].enableFamilyAndSize );
01638 }
01639
01640 void AppearancePage::FontsTab::doLoadOther() {
01641 KConfigGroup fonts( KMKernel::config(), "Fonts" );
01642
01643 mFont[0] = KGlobalSettings::generalFont();
01644 QFont fixedFont = KGlobalSettings::fixedFont();
01645 for ( int i = 0 ; i < numFontNames ; i++ )
01646 mFont[i] = fonts.readFontEntry( fontNames[i].configName,
01647 (fontNames[i].onlyFixed) ? &fixedFont : &mFont[0] );
01648
01649 mCustomFontCheck->setChecked( !fonts.readBoolEntry( "defaultFonts", true ) );
01650 mFontLocationCombo->setCurrentItem( 0 );
01651 slotFontSelectorChanged( 0 );
01652 }
01653
01654 void AppearancePage::FontsTab::installProfile( KConfig * profile ) {
01655 KConfigGroup fonts( profile, "Fonts" );
01656
01657
01658 bool needChange = false;
01659 for ( int i = 0 ; i < numFontNames ; i++ )
01660 if ( fonts.hasKey( fontNames[i].configName ) ) {
01661 needChange = true;
01662 mFont[i] = fonts.readFontEntry( fontNames[i].configName );
01663 kdDebug(5006) << "got font \"" << fontNames[i].configName
01664 << "\" thusly: \"" << mFont[i].toString() << "\"" << endl;
01665 }
01666 if ( needChange && mFontLocationCombo->currentItem() > 0 )
01667 mFontChooser->setFont( mFont[ mFontLocationCombo->currentItem() ],
01668 fontNames[ mFontLocationCombo->currentItem() ].onlyFixed );
01669
01670 if ( fonts.hasKey( "defaultFonts" ) )
01671 mCustomFontCheck->setChecked( !fonts.readBoolEntry( "defaultFonts" ) );
01672 }
01673
01674 void AppearancePage::FontsTab::save() {
01675 KConfigGroup fonts( KMKernel::config(), "Fonts" );
01676
01677
01678 if ( mActiveFontIndex >= 0 )
01679 mFont[ mActiveFontIndex ] = mFontChooser->font();
01680
01681 bool customFonts = mCustomFontCheck->isChecked();
01682 fonts.writeEntry( "defaultFonts", !customFonts );
01683 for ( int i = 0 ; i < numFontNames ; i++ )
01684 if ( customFonts || fonts.hasKey( fontNames[i].configName ) )
01685
01686
01687 fonts.writeEntry( fontNames[i].configName, mFont[i] );
01688 }
01689
01690 QString AppearancePage::ColorsTab::helpAnchor() const {
01691 return QString::fromLatin1("configure-appearance-colors");
01692 }
01693
01694
01695 static const struct {
01696 const char * configName;
01697 const char * displayName;
01698 } colorNames[] = {
01699 { "BackgroundColor", I18N_NOOP("Composer Background") },
01700 { "AltBackgroundColor", I18N_NOOP("Alternative Background Color") },
01701 { "ForegroundColor", I18N_NOOP("Normal Text") },
01702 { "QuotedText1", I18N_NOOP("Quoted Text - First Level") },
01703 { "QuotedText2", I18N_NOOP("Quoted Text - Second Level") },
01704 { "QuotedText3", I18N_NOOP("Quoted Text - Third Level") },
01705 { "LinkColor", I18N_NOOP("Link") },
01706 { "FollowedColor", I18N_NOOP("Followed Link") },
01707 { "MisspelledColor", I18N_NOOP("Misspelled Words") },
01708 { "NewMessage", I18N_NOOP("New Message") },
01709 { "UnreadMessage", I18N_NOOP("Unread Message") },
01710 { "FlagMessage", I18N_NOOP("Important Message") },
01711 { "TodoMessage", I18N_NOOP("Todo Message") },
01712 { "PGPMessageEncr", I18N_NOOP("OpenPGP Message - Encrypted") },
01713 { "PGPMessageOkKeyOk", I18N_NOOP("OpenPGP Message - Valid Signature with Trusted Key") },
01714 { "PGPMessageOkKeyBad", I18N_NOOP("OpenPGP Message - Valid Signature with Untrusted Key") },
01715 { "PGPMessageWarn", I18N_NOOP("OpenPGP Message - Unchecked Signature") },
01716 { "PGPMessageErr", I18N_NOOP("OpenPGP Message - Bad Signature") },
01717 { "HTMLWarningColor", I18N_NOOP("Border Around Warning Prepending HTML Messages") },
01718 { "ColorbarBackgroundPlain", I18N_NOOP("HTML Status Bar Background - No HTML Message") },
01719 { "ColorbarForegroundPlain", I18N_NOOP("HTML Status Bar Foreground - No HTML Message") },
01720 { "ColorbarBackgroundHTML", I18N_NOOP("HTML Status Bar Background - HTML Message") },
01721 { "ColorbarForegroundHTML", I18N_NOOP("HTML Status Bar Foreground - HTML Message") },
01722 };
01723 static const int numColorNames = sizeof colorNames / sizeof *colorNames;
01724
01725 AppearancePageColorsTab::AppearancePageColorsTab( QWidget * parent, const char * name )
01726 : ConfigModuleTab( parent, name )
01727 {
01728
01729 QVBoxLayout *vlay;
01730
01731
01732 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
01733 mCustomColorCheck = new QCheckBox( i18n("&Use custom colors"), this );
01734 vlay->addWidget( mCustomColorCheck );
01735 connect( mCustomColorCheck, SIGNAL( stateChanged( int ) ),
01736 this, SLOT( slotEmitChanged( void ) ) );
01737
01738
01739 mColorList = new ColorListBox( this );
01740 mColorList->setEnabled( false );
01741 QStringList modeList;
01742 for ( int i = 0 ; i < numColorNames ; i++ )
01743 mColorList->insertItem( new ColorListItem( i18n( colorNames[i].displayName ) ) );
01744 vlay->addWidget( mColorList, 1 );
01745
01746
01747 mRecycleColorCheck =
01748 new QCheckBox( i18n("Recycle colors on deep "ing"), this );
01749 mRecycleColorCheck->setEnabled( false );
01750 vlay->addWidget( mRecycleColorCheck );
01751 connect( mRecycleColorCheck, SIGNAL( stateChanged( int ) ),
01752 this, SLOT( slotEmitChanged( void ) ) );
01753
01754
01755 connect( mCustomColorCheck, SIGNAL(toggled(bool)),
01756 mColorList, SLOT(setEnabled(bool)) );
01757 connect( mCustomColorCheck, SIGNAL(toggled(bool)),
01758 mRecycleColorCheck, SLOT(setEnabled(bool)) );
01759 connect( mCustomColorCheck, SIGNAL( stateChanged( int ) ),
01760 this, SLOT( slotEmitChanged( void ) ) );
01761 }
01762
01763 void AppearancePage::ColorsTab::doLoadOther() {
01764 KConfigGroup reader( KMKernel::config(), "Reader" );
01765
01766 mCustomColorCheck->setChecked( !reader.readBoolEntry( "defaultColors", true ) );
01767 mRecycleColorCheck->setChecked( reader.readBoolEntry( "RecycleQuoteColors", false ) );
01768
01769 static const QColor defaultColor[ numColorNames ] = {
01770 kapp->palette().active().base(),
01771 KGlobalSettings::alternateBackgroundColor(),
01772 kapp->palette().active().text(),
01773 QColor( 0x00, 0x80, 0x00 ),
01774 QColor( 0x00, 0x70, 0x00 ),
01775 QColor( 0x00, 0x60, 0x00 ),
01776 KGlobalSettings::linkColor(),
01777 KGlobalSettings::visitedLinkColor(),
01778 Qt::red,
01779 Qt::red,
01780 Qt::blue,
01781 QColor( 0x00, 0x7F, 0x00 ),
01782 QColor( 0x00, 0x80, 0xFF ),
01783 QColor( 0x40, 0xFF, 0x40 ),
01784 QColor( 0xFF, 0xFF, 0x40 ),
01785 QColor( 0xFF, 0xFF, 0x40 ),
01786 Qt::red,
01787 QColor( 0xFF, 0x40, 0x40 ),
01788 Qt::lightGray,
01789 Qt::black,
01790 Qt::black,
01791 Qt::white,
01792 };
01793
01794 for ( int i = 0 ; i < numColorNames ; i++ )
01795 mColorList->setColor( i,
01796 reader.readColorEntry( colorNames[i].configName, &defaultColor[i] ) );
01797 connect( mColorList, SIGNAL( changed( ) ),
01798 this, SLOT( slotEmitChanged( void ) ) );
01799 }
01800
01801 void AppearancePage::ColorsTab::installProfile( KConfig * profile ) {
01802 KConfigGroup reader( profile, "Reader" );
01803
01804 if ( reader.hasKey( "defaultColors" ) )
01805 mCustomColorCheck->setChecked( !reader.readBoolEntry( "defaultColors" ) );
01806 if ( reader.hasKey( "RecycleQuoteColors" ) )
01807 mRecycleColorCheck->setChecked( reader.readBoolEntry( "RecycleQuoteColors" ) );
01808
01809 for ( int i = 0 ; i < numColorNames ; i++ )
01810 if ( reader.hasKey( colorNames[i].configName ) )
01811 mColorList->setColor( i, reader.readColorEntry( colorNames[i].configName ) );
01812 }
01813
01814 void AppearancePage::ColorsTab::save() {
01815 KConfigGroup reader( KMKernel::config(), "Reader" );
01816
01817 bool customColors = mCustomColorCheck->isChecked();
01818 reader.writeEntry( "defaultColors", !customColors );
01819
01820 for ( int i = 0 ; i < numColorNames ; i++ )
01821
01822
01823 if ( customColors || reader.hasKey( colorNames[i].configName ) )
01824 reader.writeEntry( colorNames[i].configName, mColorList->color(i) );
01825
01826 reader.writeEntry( "RecycleQuoteColors", mRecycleColorCheck->isChecked() );
01827 }
01828
01829 QString AppearancePage::LayoutTab::helpAnchor() const {
01830 return QString::fromLatin1("configure-appearance-layout");
01831 }
01832
01833 static const EnumConfigEntryItem folderListModes[] = {
01834 { "long", I18N_NOOP("Lon&g folder list") },
01835 { "short", I18N_NOOP("Shor&t folder list" ) }
01836 };
01837 static const EnumConfigEntry folderListMode = {
01838 "Geometry", "FolderList", I18N_NOOP("Folder List"),
01839 folderListModes, DIM(folderListModes), 0
01840 };
01841
01842
01843 static const EnumConfigEntryItem mimeTreeLocations[] = {
01844 { "top", I18N_NOOP("Abo&ve the message pane") },
01845 { "bottom", I18N_NOOP("&Below the message pane") }
01846 };
01847 static const EnumConfigEntry mimeTreeLocation = {
01848 "Reader", "MimeTreeLocation", I18N_NOOP("Message Structure Viewer Placement"),
01849 mimeTreeLocations, DIM(mimeTreeLocations), 1
01850 };
01851
01852 static const EnumConfigEntryItem mimeTreeModes[] = {
01853 { "never", I18N_NOOP("Show &never") },
01854 { "smart", I18N_NOOP("Show only for non-plaintext &messages") },
01855 { "always", I18N_NOOP("Show alway&s") }
01856 };
01857 static const EnumConfigEntry mimeTreeMode = {
01858 "Reader", "MimeTreeMode", I18N_NOOP("Message Structure Viewer"),
01859 mimeTreeModes, DIM(mimeTreeModes), 1
01860 };
01861
01862
01863 static const EnumConfigEntryItem readerWindowModes[] = {
01864 { "hide", I18N_NOOP("&Do not show a message preview pane") },
01865 { "below", I18N_NOOP("Show the message preview pane belo&w the message list") },
01866 { "right", I18N_NOOP("Show the message preview pane ne&xt to the message list") }
01867 };
01868 static const EnumConfigEntry readerWindowMode = {
01869 "Geometry", "readerWindowMode", I18N_NOOP("Message Preview Pane"),
01870 readerWindowModes, DIM(readerWindowModes), 1
01871 };
01872
01873 AppearancePageLayoutTab::AppearancePageLayoutTab( QWidget * parent, const char * name )
01874 : ConfigModuleTab( parent, name )
01875 {
01876
01877 QVBoxLayout * vlay;
01878
01879 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
01880
01881
01882 populateButtonGroup( mFolderListGroup = new QHButtonGroup( this ), folderListMode );
01883 vlay->addWidget( mFolderListGroup );
01884 connect( mFolderListGroup, SIGNAL ( clicked( int ) ),
01885 this, SLOT( slotEmitChanged() ) );
01886
01887
01888 populateButtonGroup( mReaderWindowModeGroup = new QVButtonGroup( this ), readerWindowMode );
01889 vlay->addWidget( mReaderWindowModeGroup );
01890 connect( mReaderWindowModeGroup, SIGNAL ( clicked( int ) ),
01891 this, SLOT( slotEmitChanged() ) );
01892
01893
01894 populateButtonGroup( mMIMETreeModeGroup = new QVButtonGroup( this ), mimeTreeMode );
01895 vlay->addWidget( mMIMETreeModeGroup );
01896 connect( mMIMETreeModeGroup, SIGNAL ( clicked( int ) ),
01897 this, SLOT( slotEmitChanged() ) );
01898
01899
01900 populateButtonGroup( mMIMETreeLocationGroup = new QHButtonGroup( this ), mimeTreeLocation );
01901 vlay->addWidget( mMIMETreeLocationGroup );
01902 connect( mMIMETreeLocationGroup, SIGNAL ( clicked( int ) ),
01903 this, SLOT( slotEmitChanged() ) );
01904
01905 vlay->addStretch( 10 );
01906 }
01907
01908 void AppearancePage::LayoutTab::doLoadOther() {
01909 const KConfigGroup reader( KMKernel::config(), "Reader" );
01910 const KConfigGroup geometry( KMKernel::config(), "Geometry" );
01911
01912 loadWidget( mFolderListGroup, geometry, folderListMode );
01913 loadWidget( mMIMETreeLocationGroup, reader, mimeTreeLocation );
01914 loadWidget( mMIMETreeModeGroup, reader, mimeTreeMode );
01915 loadWidget( mReaderWindowModeGroup, geometry, readerWindowMode );
01916 }
01917
01918 void AppearancePage::LayoutTab::installProfile( KConfig * profile ) {
01919 const KConfigGroup reader( profile, "Reader" );
01920 const KConfigGroup geometry( profile, "Geometry" );
01921
01922 loadProfile( mFolderListGroup, geometry, folderListMode );
01923 loadProfile( mMIMETreeLocationGroup, reader, mimeTreeLocation );
01924 loadProfile( mMIMETreeModeGroup, reader, mimeTreeMode );
01925 loadProfile( mReaderWindowModeGroup, geometry, readerWindowMode );
01926 }
01927
01928 void AppearancePage::LayoutTab::save() {
01929 KConfigGroup reader( KMKernel::config(), "Reader" );
01930 KConfigGroup geometry( KMKernel::config(), "Geometry" );
01931
01932 saveButtonGroup( mFolderListGroup, geometry, folderListMode );
01933 saveButtonGroup( mMIMETreeLocationGroup, reader, mimeTreeLocation );
01934 saveButtonGroup( mMIMETreeModeGroup, reader, mimeTreeMode );
01935 saveButtonGroup( mReaderWindowModeGroup, geometry, readerWindowMode );
01936 }
01937
01938
01939
01940
01941
01942 QString AppearancePage::HeadersTab::helpAnchor() const {
01943 return QString::fromLatin1("configure-appearance-headers");
01944 }
01945
01946 static const struct {
01947 const char * displayName;
01948 DateFormatter::FormatType dateDisplay;
01949 } dateDisplayConfig[] = {
01950 { I18N_NOOP("Sta&ndard format (%1)"), KMime::DateFormatter::CTime },
01951 { I18N_NOOP("Locali&zed format (%1)"), KMime::DateFormatter::Localized },
01952 { I18N_NOOP("Fancy for&mat (%1)"), KMime::DateFormatter::Fancy },
01953 { I18N_NOOP("C&ustom format (Shift+F1 for help):"),
01954 KMime::DateFormatter::Custom }
01955 };
01956 static const int numDateDisplayConfig =
01957 sizeof dateDisplayConfig / sizeof *dateDisplayConfig;
01958
01959 AppearancePageHeadersTab::AppearancePageHeadersTab( QWidget * parent, const char * name )
01960 : ConfigModuleTab( parent, name ),
01961 mCustomDateFormatEdit( 0 )
01962 {
01963
01964 QButtonGroup * group;
01965 QRadioButton * radio;
01966
01967 QVBoxLayout * vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
01968
01969
01970 group = new QVButtonGroup( i18n( "General Options" ), this );
01971 group->layout()->setSpacing( KDialog::spacingHint() );
01972
01973 mMessageSizeCheck = new QCheckBox( i18n("Display messa&ge sizes"), group );
01974
01975 mCryptoIconsCheck = new QCheckBox( i18n( "Show crypto &icons" ), group );
01976
01977 mAttachmentCheck = new QCheckBox( i18n("Show attachment icon"), group );
01978
01979 mNestedMessagesCheck =
01980 new QCheckBox( i18n("&Threaded message list"), group );
01981
01982 connect( mMessageSizeCheck, SIGNAL( stateChanged( int ) ),
01983 this, SLOT( slotEmitChanged( void ) ) );
01984 connect( mAttachmentCheck, SIGNAL( stateChanged( int ) ),
01985 this, SLOT( slotEmitChanged( void ) ) );
01986 connect( mCryptoIconsCheck, SIGNAL( stateChanged( int ) ),
01987 this, SLOT( slotEmitChanged( void ) ) );
01988 connect( mNestedMessagesCheck, SIGNAL( stateChanged( int ) ),
01989 this, SLOT( slotEmitChanged( void ) ) );
01990
01991
01992 vlay->addWidget( group );
01993
01994
01995 mNestingPolicy =
01996 new QVButtonGroup( i18n("Threaded Message List Options"), this );
01997 mNestingPolicy->layout()->setSpacing( KDialog::spacingHint() );
01998
01999 mNestingPolicy->insert(
02000 new QRadioButton( i18n("Always &keep threads open"),
02001 mNestingPolicy ), 0 );
02002 mNestingPolicy->insert(
02003 new QRadioButton( i18n("Threads default to o&pen"),
02004 mNestingPolicy ), 1 );
02005 mNestingPolicy->insert(
02006 new QRadioButton( i18n("Threads default to closed"),
02007 mNestingPolicy ), 2 );
02008 mNestingPolicy->insert(
02009 new QRadioButton( i18n("Open threads that contain ne&w, unread "
02010 "or important messages and open watched threads."),
02011 mNestingPolicy ), 3 );
02012
02013 vlay->addWidget( mNestingPolicy );
02014
02015 connect( mNestingPolicy, SIGNAL( clicked( int ) ),
02016 this, SLOT( slotEmitChanged( void ) ) );
02017
02018
02019 mDateDisplay = new QVButtonGroup( i18n("Date Display"), this );
02020 mDateDisplay->layout()->setSpacing( KDialog::spacingHint() );
02021
02022 for ( int i = 0 ; i < numDateDisplayConfig ; i++ ) {
02023 QString buttonLabel = i18n(dateDisplayConfig[i].displayName);
02024 if ( buttonLabel.contains("%1") )
02025 buttonLabel = buttonLabel.arg( DateFormatter::formatCurrentDate( dateDisplayConfig[i].dateDisplay ) );
02026 radio = new QRadioButton( buttonLabel, mDateDisplay );
02027 mDateDisplay->insert( radio, i );
02028 if ( dateDisplayConfig[i].dateDisplay == DateFormatter::Custom ) {
02029 mCustomDateFormatEdit = new KLineEdit( mDateDisplay );
02030 mCustomDateFormatEdit->setEnabled( false );
02031 connect( radio, SIGNAL(toggled(bool)),
02032 mCustomDateFormatEdit, SLOT(setEnabled(bool)) );
02033 connect( mCustomDateFormatEdit, SIGNAL(textChanged(const QString&)),
02034 this, SLOT(slotEmitChanged(void)) );
02035 QString customDateWhatsThis =
02036 i18n("<qt><p><strong>These expressions may be used for the date:"
02037 "</strong></p>"
02038 "<ul>"
02039 "<li>d - the day as a number without a leading zero (1-31)</li>"
02040 "<li>dd - the day as a number with a leading zero (01-31)</li>"
02041 "<li>ddd - the abbreviated day name (Mon - Sun)</li>"
02042 "<li>dddd - the long day name (Monday - Sunday)</li>"
02043 "<li>M - the month as a number without a leading zero (1-12)</li>"
02044 "<li>MM - the month as a number with a leading zero (01-12)</li>"
02045 "<li>MMM - the abbreviated month name (Jan - Dec)</li>"
02046 "<li>MMMM - the long month name (January - December)</li>"
02047 "<li>yy - the year as a two digit number (00-99)</li>"
02048 "<li>yyyy - the year as a four digit number (0000-9999)</li>"
02049 "</ul>"
02050 "<p><strong>These expressions may be used for the time:"
02051 "</string></p> "
02052 "<ul>"
02053 "<li>h - the hour without a leading zero (0-23 or 1-12 if AM/PM display)</li>"
02054 "<li>hh - the hour with a leading zero (00-23 or 01-12 if AM/PM display)</li>"
02055 "<li>m - the minutes without a leading zero (0-59)</li>"
02056 "<li>mm - the minutes with a leading zero (00-59)</li>"
02057 "<li>s - the seconds without a leading zero (0-59)</li>"
02058 "<li>ss - the seconds with a leading zero (00-59)</li>"
02059 "<li>z - the milliseconds without leading zeroes (0-999)</li>"
02060 "<li>zzz - the milliseconds with leading zeroes (000-999)</li>"
02061 "<li>AP - switch to AM/PM display. AP will be replaced by either \"AM\" or \"PM\".</li>"
02062 "<li>ap - switch to AM/PM display. ap will be replaced by either \"am\" or \"pm\".</li>"
02063 "<li>Z - time zone in numeric form (-0500)</li>"
02064 "</ul>"
02065 "<p><strong>All other input characters will be ignored."
02066 "</strong></p></qt>");
02067 QWhatsThis::add( mCustomDateFormatEdit, customDateWhatsThis );
02068 QWhatsThis::add( radio, customDateWhatsThis );
02069 }
02070 }
02071
02072 vlay->addWidget( mDateDisplay );
02073 connect( mDateDisplay, SIGNAL( clicked( int ) ),
02074 this, SLOT( slotEmitChanged( void ) ) );
02075
02076
02077 vlay->addStretch( 10 );
02078 }
02079
02080 void AppearancePage::HeadersTab::doLoadOther() {
02081 KConfigGroup general( KMKernel::config(), "General" );
02082 KConfigGroup geometry( KMKernel::config(), "Geometry" );
02083
02084
02085 mNestedMessagesCheck->setChecked( geometry.readBoolEntry( "nestedMessages", false ) );
02086 mMessageSizeCheck->setChecked( general.readBoolEntry( "showMessageSize", false ) );
02087 mCryptoIconsCheck->setChecked( general.readBoolEntry( "showCryptoIcons", false ) );
02088 mAttachmentCheck->setChecked( general.readBoolEntry( "showAttachmentIcon", true ) );
02089
02090
02091 int num = geometry.readNumEntry( "nestingPolicy", 3 );
02092 if ( num < 0 || num > 3 ) num = 3;
02093 mNestingPolicy->setButton( num );
02094
02095
02096 setDateDisplay( general.readNumEntry( "dateFormat", DateFormatter::Fancy ),
02097 general.readEntry( "customDateFormat" ) );
02098 }
02099
02100 void AppearancePage::HeadersTab::setDateDisplay( int num, const QString & format ) {
02101 DateFormatter::FormatType dateDisplay =
02102 static_cast<DateFormatter::FormatType>( num );
02103
02104
02105 if ( dateDisplay == DateFormatter::Custom )
02106 mCustomDateFormatEdit->setText( format );
02107
02108 for ( int i = 0 ; i < numDateDisplayConfig ; i++ )
02109 if ( dateDisplay == dateDisplayConfig[i].dateDisplay ) {
02110 mDateDisplay->setButton( i );
02111 return;
02112 }
02113
02114 mDateDisplay->setButton( numDateDisplayConfig - 2 );
02115 }
02116
02117 void AppearancePage::HeadersTab::installProfile( KConfig * profile ) {
02118 KConfigGroup general( profile, "General" );
02119 KConfigGroup geometry( profile, "Geometry" );
02120
02121 if ( geometry.hasKey( "nestedMessages" ) )
02122 mNestedMessagesCheck->setChecked( geometry.readBoolEntry( "nestedMessages" ) );
02123 if ( general.hasKey( "showMessageSize" ) )
02124 mMessageSizeCheck->setChecked( general.readBoolEntry( "showMessageSize" ) );
02125
02126 if( general.hasKey( "showCryptoIcons" ) )
02127 mCryptoIconsCheck->setChecked( general.readBoolEntry( "showCryptoIcons" ) );
02128 if ( general.hasKey( "showAttachmentIcon" ) )
02129 mAttachmentCheck->setChecked( general.readBoolEntry( "showAttachmentIcon" ) );
02130
02131 if ( geometry.hasKey( "nestingPolicy" ) ) {
02132 int num = geometry.readNumEntry( "nestingPolicy" );
02133 if ( num < 0 || num > 3 ) num = 3;
02134 mNestingPolicy->setButton( num );
02135 }
02136
02137 if ( general.hasKey( "dateFormat" ) )
02138 setDateDisplay( general.readNumEntry( "dateFormat" ),
02139 general.readEntry( "customDateFormat" ) );
02140 }
02141
02142 void AppearancePage::HeadersTab::save() {
02143 KConfigGroup general( KMKernel::config(), "General" );
02144 KConfigGroup geometry( KMKernel::config(), "Geometry" );
02145
02146 if ( geometry.readBoolEntry( "nestedMessages", false )
02147 != mNestedMessagesCheck->isChecked() ) {
02148 int result = KMessageBox::warningContinueCancel( this,
02149 i18n("Changing the global threading setting will override "
02150 "all folder specific values."),
02151 QString::null, KStdGuiItem::cont(), "threadOverride" );
02152 if ( result == KMessageBox::Continue ) {
02153 geometry.writeEntry( "nestedMessages", mNestedMessagesCheck->isChecked() );
02154
02155 QStringList groups = KMKernel::config()->groupList().grep( QRegExp("^Folder-") );
02156 kdDebug(5006) << "groups.count() == " << groups.count() << endl;
02157 for ( QStringList::const_iterator it = groups.begin() ; it != groups.end() ; ++it ) {
02158 KConfigGroup group( KMKernel::config(), *it );
02159 group.deleteEntry( "threadMessagesOverride" );
02160 }
02161 }
02162 }
02163
02164 geometry.writeEntry( "nestingPolicy",
02165 mNestingPolicy->id( mNestingPolicy->selected() ) );
02166 general.writeEntry( "showMessageSize", mMessageSizeCheck->isChecked() );
02167 general.writeEntry( "showCryptoIcons", mCryptoIconsCheck->isChecked() );
02168 general.writeEntry( "showAttachmentIcon", mAttachmentCheck->isChecked() );
02169
02170 int dateDisplayID = mDateDisplay->id( mDateDisplay->selected() );
02171
02172 assert( dateDisplayID >= 0 ); assert( dateDisplayID < numDateDisplayConfig );
02173 general.writeEntry( "dateFormat",
02174 dateDisplayConfig[ dateDisplayID ].dateDisplay );
02175 general.writeEntry( "customDateFormat", mCustomDateFormatEdit->text() );
02176 }
02177
02178
02179
02180
02181
02182
02183
02184 static const BoolConfigEntry showColorbarMode = {
02185 "Reader", "showColorbar", I18N_NOOP("Show HTML stat&us bar"), false
02186 };
02187
02188 static const BoolConfigEntry showSpamStatusMode = {
02189 "Reader", "showSpamStatus", I18N_NOOP("Show s&pam status in fancy headers"), true
02190 };
02191
02192 static const BoolConfigEntry showEmoticons = {
02193 "Reader", "ShowEmoticons", I18N_NOOP("Replace smileys by emoticons"), true
02194 };
02195
02196 static const BoolConfigEntry shrinkQuotes = {
02197 "Reader", "ShrinkQuotes", I18N_NOOP("Use smaller font for quoted text"), false
02198 };
02199
02200 static const BoolConfigEntry showExpandQuotesMark= {
02201 "Reader", "ShowExpandQuotesMark", I18N_NOOP("Show expand/collapse quote marks"), false
02202 };
02203
02204
02205 QString AppearancePage::ReaderTab::helpAnchor() const {
02206 return QString::fromLatin1("configure-appearance-reader");
02207 }
02208
02209 AppearancePageReaderTab::AppearancePageReaderTab( QWidget * parent,
02210 const char * name )
02211 : ConfigModuleTab( parent, name )
02212 {
02213 QVBoxLayout *vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
02214
02215
02216 populateCheckBox( mShowColorbarCheck = new QCheckBox( this ), showColorbarMode );
02217 vlay->addWidget( mShowColorbarCheck );
02218 connect( mShowColorbarCheck, SIGNAL ( stateChanged( int ) ),
02219 this, SLOT( slotEmitChanged() ) );
02220
02221
02222 populateCheckBox( mShowSpamStatusCheck = new QCheckBox( this ), showSpamStatusMode );
02223 vlay->addWidget( mShowSpamStatusCheck );
02224 connect( mShowSpamStatusCheck, SIGNAL ( stateChanged( int ) ),
02225 this, SLOT( slotEmitChanged() ) );
02226
02227
02228 populateCheckBox( mShowEmoticonsCheck = new QCheckBox( this ), showEmoticons );
02229 vlay->addWidget( mShowEmoticonsCheck );
02230 connect( mShowEmoticonsCheck, SIGNAL ( stateChanged( int ) ),
02231 this, SLOT( slotEmitChanged() ) );
02232
02233
02234 mShrinkQuotesCheck = new QCheckBox( i18n( shrinkQuotes.desc ), this,
02235 "kcfg_ShrinkQuotes" );
02236 vlay->addWidget( mShrinkQuotesCheck );
02237 connect( mShrinkQuotesCheck, SIGNAL( stateChanged( int ) ),
02238 this, SLOT( slotEmitChanged() ) );
02239
02240
02241 QHBoxLayout *hlay= new QHBoxLayout( vlay );
02242 populateCheckBox( mShowExpandQuotesMark= new QCheckBox( this ), showExpandQuotesMark);
02243 hlay->addWidget( mShowExpandQuotesMark);
02244 connect( mShowExpandQuotesMark, SIGNAL ( stateChanged( int ) ),
02245 this, SLOT( slotEmitChanged() ) );
02246
02247 hlay->addStretch( 1 );
02248 mCollapseQuoteLevelSpin = new KIntSpinBox( 0,10,1,
02249 3,10,this );
02250
02251 QLabel *label = new QLabel( mCollapseQuoteLevelSpin,
02252 GlobalSettings::self()->collapseQuoteLevelSpinItem()->label(), this );
02253
02254 hlay->addWidget( label );
02255
02256 mCollapseQuoteLevelSpin->setEnabled( false );
02257 connect( mCollapseQuoteLevelSpin, SIGNAL( valueChanged( int ) ),
02258 this, SLOT( slotEmitChanged( void ) ) );
02259 hlay->addWidget( mCollapseQuoteLevelSpin);
02260
02261 connect( mShowExpandQuotesMark, SIGNAL( toggled( bool ) ),
02262 mCollapseQuoteLevelSpin, SLOT( setEnabled( bool ) ) );
02263
02264
02265 hlay = new QHBoxLayout( vlay );
02266 mCharsetCombo = new QComboBox( this );
02267 mCharsetCombo->insertStringList( KMMsgBase::supportedEncodings( false ) );
02268
02269 connect( mCharsetCombo, SIGNAL( activated( int ) ),
02270 this, SLOT( slotEmitChanged( void ) ) );
02271
02272 QString fallbackCharsetWhatsThis =
02273 i18n( GlobalSettings::self()->fallbackCharacterEncodingItem()->whatsThis().utf8() );
02274 QWhatsThis::add( mCharsetCombo, fallbackCharsetWhatsThis );
02275
02276 label = new QLabel( i18n("Fallback ch&aracter encoding:"), this );
02277 label->setBuddy( mCharsetCombo );
02278
02279 hlay->addWidget( label );
02280 hlay->addWidget( mCharsetCombo );
02281
02282
02283 QHBoxLayout *hlay2 = new QHBoxLayout( vlay );
02284 mOverrideCharsetCombo = new QComboBox( this );
02285 QStringList encodings = KMMsgBase::supportedEncodings( false );
02286 encodings.prepend( i18n( "Auto" ) );
02287 mOverrideCharsetCombo->insertStringList( encodings );
02288 mOverrideCharsetCombo->setCurrentItem(0);
02289
02290 connect( mOverrideCharsetCombo, SIGNAL( activated( int ) ),
02291 this, SLOT( slotEmitChanged( void ) ) );
02292
02293 QString overrideCharsetWhatsThis =
02294 i18n( GlobalSettings::self()->overrideCharacterEncodingItem()->whatsThis().utf8() );
02295 QWhatsThis::add( mOverrideCharsetCombo, overrideCharsetWhatsThis );
02296
02297 label = new QLabel( i18n("&Override character encoding:"), this );
02298 label->setBuddy( mOverrideCharsetCombo );
02299
02300 hlay2->addWidget( label );
02301 hlay2->addWidget( mOverrideCharsetCombo );
02302
02303 vlay->addStretch( 100 );
02304 }
02305
02306
02307 void AppearancePage::ReaderTab::readCurrentFallbackCodec()
02308 {
02309 QStringList encodings = KMMsgBase::supportedEncodings( false );
02310 QStringList::ConstIterator it( encodings.begin() );
02311 QStringList::ConstIterator end( encodings.end() );
02312 QString currentEncoding = GlobalSettings::self()->fallbackCharacterEncoding();
02313 currentEncoding = currentEncoding.replace( "iso ", "iso-", false );
02315 int i = 0;
02316 int indexOfLatin9 = 0;
02317 bool found = false;
02318 for( ; it != end; ++it)
02319 {
02320 const QString encoding = KGlobal::charsets()->encodingForName(*it);
02321 if ( encoding == "iso-8859-15" )
02322 indexOfLatin9 = i;
02323 if( encoding == currentEncoding )
02324 {
02325 mCharsetCombo->setCurrentItem( i );
02326 found = true;
02327 break;
02328 }
02329 i++;
02330 }
02331 if ( !found )
02332 mCharsetCombo->setCurrentItem( indexOfLatin9 );
02333 }
02334
02335 void AppearancePage::ReaderTab::readCurrentOverrideCodec()
02336 {
02337 const QString ¤tOverrideEncoding = GlobalSettings::self()->overrideCharacterEncoding();
02338 if ( currentOverrideEncoding.isEmpty() ) {
02339 mOverrideCharsetCombo->setCurrentItem( 0 );
02340 return;
02341 }
02342 QStringList encodings = KMMsgBase::supportedEncodings( false );
02343 encodings.prepend( i18n( "Auto" ) );
02344 QStringList::Iterator it( encodings.begin() );
02345 QStringList::Iterator end( encodings.end() );
02346 uint i = 0;
02347 for( ; it != end; ++it)
02348 {
02349 if( KGlobal::charsets()->encodingForName(*it) == currentOverrideEncoding )
02350 {
02351 mOverrideCharsetCombo->setCurrentItem( i );
02352 break;
02353 }
02354 i++;
02355 }
02356 if ( i == encodings.size() ) {
02357
02358 kdWarning(5006) << "Unknown override character encoding \"" << currentOverrideEncoding
02359 << "\". Resetting to Auto." << endl;
02360 mOverrideCharsetCombo->setCurrentItem( 0 );
02361 GlobalSettings::self()->setOverrideCharacterEncoding( QString::null );
02362 }
02363 }
02364
02365 void AppearancePage::ReaderTab::doLoadFromGlobalSettings()
02366 {
02367 mShowEmoticonsCheck->setChecked( GlobalSettings::self()->showEmoticons() );
02368 mShrinkQuotesCheck->setChecked( GlobalSettings::self()->shrinkQuotes() );
02369 mShowExpandQuotesMark->setChecked( GlobalSettings::self()->showExpandQuotesMark() );
02370 mCollapseQuoteLevelSpin->setValue( GlobalSettings::self()->collapseQuoteLevelSpin() );
02371 readCurrentFallbackCodec();
02372 readCurrentOverrideCodec();
02373 }
02374
02375 void AppearancePage::ReaderTab::doLoadOther()
02376 {
02377 const KConfigGroup reader( KMKernel::config(), "Reader" );
02378 loadWidget( mShowColorbarCheck, reader, showColorbarMode );
02379 loadWidget( mShowSpamStatusCheck, reader, showSpamStatusMode );
02380 }
02381
02382
02383 void AppearancePage::ReaderTab::save() {
02384 KConfigGroup reader( KMKernel::config(), "Reader" );
02385 saveCheckBox( mShowColorbarCheck, reader, showColorbarMode );
02386 saveCheckBox( mShowSpamStatusCheck, reader, showSpamStatusMode );
02387 GlobalSettings::self()->setShowEmoticons( mShowEmoticonsCheck->isChecked() );
02388 GlobalSettings::self()->setShrinkQuotes( mShrinkQuotesCheck->isChecked() );
02389 GlobalSettings::self()->setShowExpandQuotesMark( mShowExpandQuotesMark->isChecked() );
02390
02391 GlobalSettings::self()->setCollapseQuoteLevelSpin( mCollapseQuoteLevelSpin->value() );
02392 GlobalSettings::self()->setFallbackCharacterEncoding(
02393 KGlobal::charsets()->encodingForName( mCharsetCombo->currentText() ) );
02394 GlobalSettings::self()->setOverrideCharacterEncoding(
02395 mOverrideCharsetCombo->currentItem() == 0 ?
02396 QString() :
02397 KGlobal::charsets()->encodingForName( mOverrideCharsetCombo->currentText() ) );
02398 }
02399
02400
02401 void AppearancePage::ReaderTab::installProfile( KConfig * ) {
02402 const KConfigGroup reader( KMKernel::config(), "Reader" );
02403 loadProfile( mShowColorbarCheck, reader, showColorbarMode );
02404 loadProfile( mShowSpamStatusCheck, reader, showSpamStatusMode );
02405 loadProfile( mShowEmoticonsCheck, reader, showEmoticons );
02406 loadProfile( mShrinkQuotesCheck, reader, shrinkQuotes );
02407 loadProfile( mShowExpandQuotesMark, reader, showExpandQuotesMark);
02408 }
02409
02410
02411 QString AppearancePage::SystemTrayTab::helpAnchor() const {
02412 return QString::fromLatin1("configure-appearance-systemtray");
02413 }
02414
02415 AppearancePageSystemTrayTab::AppearancePageSystemTrayTab( QWidget * parent,
02416 const char * name )
02417 : ConfigModuleTab( parent, name )
02418 {
02419 QVBoxLayout * vlay = new QVBoxLayout( this, KDialog::marginHint(),
02420 KDialog::spacingHint() );
02421
02422
02423 mSystemTrayCheck = new QCheckBox( i18n("Enable system tray icon"), this );
02424 vlay->addWidget( mSystemTrayCheck );
02425 connect( mSystemTrayCheck, SIGNAL( stateChanged( int ) ),
02426 this, SLOT( slotEmitChanged( void ) ) );
02427
02428
02429 mSystemTrayGroup = new QVButtonGroup( i18n("System Tray Mode"), this );
02430 mSystemTrayGroup->layout()->setSpacing( KDialog::spacingHint() );
02431 vlay->addWidget( mSystemTrayGroup );
02432 connect( mSystemTrayGroup, SIGNAL( clicked( int ) ),
02433 this, SLOT( slotEmitChanged( void ) ) );
02434 connect( mSystemTrayCheck, SIGNAL( toggled( bool ) ),
02435 mSystemTrayGroup, SLOT( setEnabled( bool ) ) );
02436
02437 mSystemTrayGroup->insert( new QRadioButton( i18n("Always show KMail in system tray"), mSystemTrayGroup ),
02438 GlobalSettings::EnumSystemTrayPolicy::ShowAlways );
02439
02440 mSystemTrayGroup->insert( new QRadioButton( i18n("Only show KMail in system tray if there are unread messages"), mSystemTrayGroup ),
02441 GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread );
02442
02443 vlay->addStretch( 10 );
02444 }
02445
02446 void AppearancePage::SystemTrayTab::doLoadFromGlobalSettings() {
02447 mSystemTrayCheck->setChecked( GlobalSettings::self()->systemTrayEnabled() );
02448 mSystemTrayGroup->setButton( GlobalSettings::self()->systemTrayPolicy() );
02449 mSystemTrayGroup->setEnabled( mSystemTrayCheck->isChecked() );
02450 }
02451
02452 void AppearancePage::SystemTrayTab::installProfile( KConfig * profile ) {
02453 KConfigGroup general( profile, "General" );
02454
02455 if ( general.hasKey( "SystemTrayEnabled" ) ) {
02456 mSystemTrayCheck->setChecked( general.readBoolEntry( "SystemTrayEnabled" ) );
02457 }
02458 if ( general.hasKey( "SystemTrayPolicy" ) ) {
02459 mSystemTrayGroup->setButton( general.readNumEntry( "SystemTrayPolicy" ) );
02460 }
02461 mSystemTrayGroup->setEnabled( mSystemTrayCheck->isChecked() );
02462 }
02463
02464 void AppearancePage::SystemTrayTab::save() {
02465 GlobalSettings::self()->setSystemTrayEnabled( mSystemTrayCheck->isChecked() );
02466 GlobalSettings::self()->setSystemTrayPolicy( mSystemTrayGroup->id( mSystemTrayGroup->selected() ) );
02467 }
02468
02469
02470
02471
02472
02473
02474
02475
02476 QString ComposerPage::helpAnchor() const {
02477 return QString::fromLatin1("configure-composer");
02478 }
02479
02480 ComposerPage::ComposerPage( QWidget * parent, const char * name )
02481 : ConfigModuleWithTabs( parent, name )
02482 {
02483
02484
02485
02486 mGeneralTab = new GeneralTab();
02487 addTab( mGeneralTab, i18n("&General") );
02488 addConfig( GlobalSettings::self(), mGeneralTab );
02489
02490
02491
02492
02493
02494
02495
02496
02497
02498
02499 mTemplatesTab = new TemplatesTab();
02500 addTab( mTemplatesTab, i18n("&Templates") );
02501
02502
02503
02504
02505 mCustomTemplatesTab = new CustomTemplatesTab();
02506 addTab( mCustomTemplatesTab, i18n("&Custom Templates") );
02507
02508
02509
02510
02511 mSubjectTab = new SubjectTab();
02512 addTab( mSubjectTab, i18n("&Subject") );
02513 addConfig( GlobalSettings::self(), mSubjectTab );
02514
02515
02516
02517
02518 mCharsetTab = new CharsetTab();
02519 addTab( mCharsetTab, i18n("Cha&rset") );
02520
02521
02522
02523
02524 mHeadersTab = new HeadersTab();
02525 addTab( mHeadersTab, i18n("H&eaders") );
02526
02527
02528
02529
02530 mAttachmentsTab = new AttachmentsTab();
02531 addTab( mAttachmentsTab, i18n("Config->Composer->Attachments", "A&ttachments") );
02532 load();
02533 }
02534
02535 QString ComposerPage::GeneralTab::helpAnchor() const {
02536 return QString::fromLatin1("configure-composer-general");
02537 }
02538
02539 ComposerPageGeneralTab::ComposerPageGeneralTab( QWidget * parent, const char * name )
02540 : ConfigModuleTab( parent, name )
02541 {
02542
02543 QVBoxLayout *vlay;
02544 QHBoxLayout *hlay;
02545 QGroupBox *group;
02546 QLabel *label;
02547 QHBox *hbox;
02548 QString msg;
02549
02550 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
02551
02552
02553 mAutoAppSignFileCheck = new QCheckBox(
02554 GlobalSettings::self()->autoTextSignatureItem()->label(),
02555 this );
02556 vlay->addWidget( mAutoAppSignFileCheck );
02557 connect( mAutoAppSignFileCheck, SIGNAL( stateChanged(int) ),
02558 this, SLOT( slotEmitChanged( void ) ) );
02559
02560 mSmartQuoteCheck = new QCheckBox(
02561 GlobalSettings::self()->smartQuoteItem()->label(),
02562 this, "kcfg_SmartQuote" );
02563 vlay->addWidget( mSmartQuoteCheck );
02564 connect( mSmartQuoteCheck, SIGNAL( stateChanged(int) ),
02565 this, SLOT( slotEmitChanged( void ) ) );
02566
02567 mAutoRequestMDNCheck = new QCheckBox(
02568 GlobalSettings::self()->requestMDNItem()->label(),
02569 this, "kcfg_RequestMDN" );
02570 vlay->addWidget( mAutoRequestMDNCheck );
02571 connect( mAutoRequestMDNCheck, SIGNAL( stateChanged(int) ),
02572 this, SLOT( slotEmitChanged( void ) ) );
02573
02574 mShowRecentAddressesInComposer = new QCheckBox(
02575 GlobalSettings::self()->showRecentAddressesInComposerItem()->label(),
02576 this, "kcfg_ShowRecentAddressesInComposer" );
02577 vlay->addWidget( mShowRecentAddressesInComposer );
02578 connect( mShowRecentAddressesInComposer, SIGNAL( stateChanged(int) ),
02579 this, SLOT( slotEmitChanged( void ) ) );
02580
02581
02582
02583 hlay = new QHBoxLayout( vlay );
02584 mWordWrapCheck = new QCheckBox(
02585 GlobalSettings::self()->wordWrapItem()->label(),
02586 this, "kcfg_WordWrap" );
02587 hlay->addWidget( mWordWrapCheck );
02588 connect( mWordWrapCheck, SIGNAL( stateChanged(int) ),
02589 this, SLOT( slotEmitChanged( void ) ) );
02590
02591 mWrapColumnSpin = new KIntSpinBox( 30, 78, 1,
02592 78, 10 , this, "kcfg_LineWrapWidth" );
02593 mWrapColumnSpin->setEnabled( false );
02594 connect( mWrapColumnSpin, SIGNAL( valueChanged(int) ),
02595 this, SLOT( slotEmitChanged( void ) ) );
02596
02597 hlay->addWidget( mWrapColumnSpin );
02598 hlay->addStretch( 1 );
02599
02600 connect( mWordWrapCheck, SIGNAL(toggled(bool)),
02601 mWrapColumnSpin, SLOT(setEnabled(bool)) );
02602
02603 hlay = new QHBoxLayout( vlay );
02604 mAutoSave = new KIntSpinBox( 0, 60, 1, 1, 10, this, "kcfg_AutosaveInterval" );
02605 label = new QLabel( mAutoSave,
02606 GlobalSettings::self()->autosaveIntervalItem()->label(), this );
02607 hlay->addWidget( label );
02608 hlay->addWidget( mAutoSave );
02609 mAutoSave->setSpecialValueText( i18n("No autosave") );
02610 mAutoSave->setSuffix( i18n(" min") );
02611 hlay->addStretch( 1 );
02612 connect( mAutoSave, SIGNAL( valueChanged(int) ),
02613 this, SLOT( slotEmitChanged( void ) ) );
02614
02615 hlay = new QHBoxLayout( vlay );
02616 QPushButton *completionOrderBtn = new QPushButton( i18n( "Configure Completion Order" ), this );
02617 connect( completionOrderBtn, SIGNAL( clicked() ),
02618 this, SLOT( slotConfigureCompletionOrder() ) );
02619 hlay->addWidget( completionOrderBtn );
02620 hlay->addItem( new QSpacerItem(0, 0) );
02621
02622
02623 hlay = new QHBoxLayout( vlay );
02624 QPushButton *recentAddressesBtn = new QPushButton( i18n( "Edit Recent Addresses" ), this );
02625 connect( recentAddressesBtn, SIGNAL( clicked() ),
02626 this, SLOT( slotConfigureRecentAddresses() ) );
02627 hlay->addWidget( recentAddressesBtn );
02628 hlay->addItem( new QSpacerItem(0, 0) );
02629
02630
02631 group = new QVGroupBox( i18n("External Editor"), this );
02632 group->layout()->setSpacing( KDialog::spacingHint() );
02633
02634 mExternalEditorCheck = new QCheckBox(
02635 GlobalSettings::self()->useExternalEditorItem()->label(),
02636 group, "kcfg_UseExternalEditor" );
02637 connect( mExternalEditorCheck, SIGNAL( toggled( bool ) ),
02638 this, SLOT( slotEmitChanged( void ) ) );
02639
02640 hbox = new QHBox( group );
02641 label = new QLabel( GlobalSettings::self()->externalEditorItem()->label(),
02642 hbox );
02643 mEditorRequester = new KURLRequester( hbox, "kcfg_ExternalEditor" );
02644 connect( mEditorRequester, SIGNAL( urlSelected(const QString&) ),
02645 this, SLOT( slotEmitChanged( void ) ) );
02646 connect( mEditorRequester, SIGNAL( textChanged(const QString&) ),
02647 this, SLOT( slotEmitChanged( void ) ) );
02648
02649 hbox->setStretchFactor( mEditorRequester, 1 );
02650 label->setBuddy( mEditorRequester );
02651 label->setEnabled( false );
02652
02653 mEditorRequester->setFilter( "application/x-executable "
02654 "application/x-shellscript "
02655 "application/x-desktop" );
02656 mEditorRequester->setEnabled( false );
02657 connect( mExternalEditorCheck, SIGNAL(toggled(bool)),
02658 label, SLOT(setEnabled(bool)) );
02659 connect( mExternalEditorCheck, SIGNAL(toggled(bool)),
02660 mEditorRequester, SLOT(setEnabled(bool)) );
02661
02662 label = new QLabel( i18n("<b>%f</b> will be replaced with the "
02663 "filename to edit."), group );
02664 label->setEnabled( false );
02665 connect( mExternalEditorCheck, SIGNAL(toggled(bool)),
02666 label, SLOT(setEnabled(bool)) );
02667
02668 vlay->addWidget( group );
02669 vlay->addStretch( 100 );
02670 }
02671
02672 void ComposerPage::GeneralTab::doLoadFromGlobalSettings() {
02673
02674
02675 mAutoAppSignFileCheck->setChecked(
02676 GlobalSettings::self()->autoTextSignature()=="auto" );
02677 mSmartQuoteCheck->setChecked( GlobalSettings::self()->smartQuote() );
02678 mAutoRequestMDNCheck->setChecked( GlobalSettings::self()->requestMDN() );
02679 mWordWrapCheck->setChecked( GlobalSettings::self()->wordWrap() );
02680
02681 mWrapColumnSpin->setValue( GlobalSettings::self()->lineWrapWidth() );
02682 mAutoSave->setValue( GlobalSettings::self()->autosaveInterval() );
02683
02684
02685 mExternalEditorCheck->setChecked( GlobalSettings::self()->useExternalEditor() );
02686 mEditorRequester->setURL( GlobalSettings::self()->externalEditor() );
02687 }
02688
02689 void ComposerPage::GeneralTab::installProfile( KConfig * profile ) {
02690 KConfigGroup composer( profile, "Composer" );
02691 KConfigGroup general( profile, "General" );
02692
02693 if ( composer.hasKey( "signature" ) ) {
02694 bool state = composer.readBoolEntry("signature");
02695 mAutoAppSignFileCheck->setChecked( state );
02696 }
02697 if ( composer.hasKey( "smart-quote" ) )
02698 mSmartQuoteCheck->setChecked( composer.readBoolEntry( "smart-quote" ) );
02699 if ( composer.hasKey( "request-mdn" ) )
02700 mAutoRequestMDNCheck->setChecked( composer.readBoolEntry( "request-mdn" ) );
02701 if ( composer.hasKey( "word-wrap" ) )
02702 mWordWrapCheck->setChecked( composer.readBoolEntry( "word-wrap" ) );
02703 if ( composer.hasKey( "break-at" ) )
02704 mWrapColumnSpin->setValue( composer.readNumEntry( "break-at" ) );
02705 if ( composer.hasKey( "autosave" ) )
02706 mAutoSave->setValue( composer.readNumEntry( "autosave" ) );
02707
02708 if ( general.hasKey( "use-external-editor" )
02709 && general.hasKey( "external-editor" ) ) {
02710 mExternalEditorCheck->setChecked( general.readBoolEntry( "use-external-editor" ) );
02711 mEditorRequester->setURL( general.readPathEntry( "external-editor" ) );
02712 }
02713 }
02714
02715 void ComposerPage::GeneralTab::save() {
02716 GlobalSettings::self()->setAutoTextSignature(
02717 mAutoAppSignFileCheck->isChecked() ? "auto" : "manual" );
02718 GlobalSettings::self()->setSmartQuote( mSmartQuoteCheck->isChecked() );
02719 GlobalSettings::self()->setRequestMDN( mAutoRequestMDNCheck->isChecked() );
02720 GlobalSettings::self()->setWordWrap( mWordWrapCheck->isChecked() );
02721
02722 GlobalSettings::self()->setLineWrapWidth( mWrapColumnSpin->value() );
02723 GlobalSettings::self()->setAutosaveInterval( mAutoSave->value() );
02724
02725
02726 GlobalSettings::self()->setUseExternalEditor( mExternalEditorCheck->isChecked() );
02727 GlobalSettings::self()->setExternalEditor( mEditorRequester->url() );
02728 }
02729
02730 void ComposerPage::GeneralTab::slotConfigureRecentAddresses( )
02731 {
02732 KRecentAddress::RecentAddressDialog dlg( this );
02733 dlg.setAddresses( RecentAddresses::self( KMKernel::config() )->addresses() );
02734 if ( dlg.exec() ) {
02735 RecentAddresses::self( KMKernel::config() )->clear();
02736 const QStringList &addrList = dlg.addresses();
02737 QStringList::ConstIterator it;
02738 for ( it = addrList.constBegin(); it != addrList.constEnd(); ++it )
02739 RecentAddresses::self( KMKernel::config() )->add( *it );
02740 }
02741 }
02742
02743 void ComposerPage::GeneralTab::slotConfigureCompletionOrder( )
02744 {
02745 KPIM::LdapSearch search;
02746 KPIM::CompletionOrderEditor editor( &search, this );
02747 editor.exec();
02748 }
02749
02750 QString ComposerPage::PhrasesTab::helpAnchor() const {
02751 return QString::fromLatin1("configure-composer-phrases");
02752 }
02753
02754 ComposerPagePhrasesTab::ComposerPagePhrasesTab( QWidget * parent, const char * name )
02755 : ConfigModuleTab( parent, name )
02756 {
02757
02758 QGridLayout *glay;
02759 QPushButton *button;
02760
02761 glay = new QGridLayout( this, 7, 3, KDialog::spacingHint() );
02762 glay->setMargin( KDialog::marginHint() );
02763 glay->setColStretch( 1, 1 );
02764 glay->setColStretch( 2, 1 );
02765 glay->setRowStretch( 7, 1 );
02766
02767
02768 glay->addMultiCellWidget( new QLabel( i18n("<qt>The following placeholders are "
02769 "supported in the reply phrases:<br>"
02770 "<b>%D</b>: date, <b>%S</b>: subject,<br>"
02771 "<b>%e</b>: sender's address, <b>%F</b>: sender's name, <b>%f</b>: sender's initials,<br>"
02772 "<b>%T</b>: recipient's name, <b>%t</b>: recipient's name and address,<br>"
02773 "<b>%C</b>: carbon copy names, <b>%c</b>: carbon copy names and addresses,<br>"
02774 "<b>%%</b>: percent sign, <b>%_</b>: space, "
02775 "<b>%L</b>: linebreak</qt>"), this ),
02776 0, 0, 0, 2 );
02777
02778
02779 mPhraseLanguageCombo = new LanguageComboBox( false, this );
02780 glay->addWidget( new QLabel( mPhraseLanguageCombo,
02781 i18n("Lang&uage:"), this ), 1, 0 );
02782 glay->addMultiCellWidget( mPhraseLanguageCombo, 1, 1, 1, 2 );
02783 connect( mPhraseLanguageCombo, SIGNAL(activated(const QString&)),
02784 this, SLOT(slotLanguageChanged(const QString&)) );
02785
02786
02787 button = new QPushButton( i18n("A&dd..."), this );
02788 button->setAutoDefault( false );
02789 glay->addWidget( button, 2, 1 );
02790 mRemoveButton = new QPushButton( i18n("Re&move"), this );
02791 mRemoveButton->setAutoDefault( false );
02792 mRemoveButton->setEnabled( false );
02793 glay->addWidget( mRemoveButton, 2, 2 );
02794 connect( button, SIGNAL(clicked()),
02795 this, SLOT(slotNewLanguage()) );
02796 connect( mRemoveButton, SIGNAL(clicked()),
02797 this, SLOT(slotRemoveLanguage()) );
02798
02799
02800 mPhraseReplyEdit = new KLineEdit( this );
02801 connect( mPhraseReplyEdit, SIGNAL( textChanged( const QString& ) ),
02802 this, SLOT( slotEmitChanged( void ) ) );
02803 glay->addWidget( new QLabel( mPhraseReplyEdit,
02804 i18n("Reply to se&nder:"), this ), 3, 0 );
02805 glay->addMultiCellWidget( mPhraseReplyEdit, 3, 3, 1, 2 );
02806
02807
02808 mPhraseReplyAllEdit = new KLineEdit( this );
02809 connect( mPhraseReplyAllEdit, SIGNAL( textChanged( const QString& ) ),
02810 this, SLOT( slotEmitChanged( void ) ) );
02811 glay->addWidget( new QLabel( mPhraseReplyAllEdit,
02812 i18n("Repl&y to all:"), this ), 4, 0 );
02813 glay->addMultiCellWidget( mPhraseReplyAllEdit, 4, 4, 1, 2 );
02814
02815
02816 mPhraseForwardEdit = new KLineEdit( this );
02817 connect( mPhraseForwardEdit, SIGNAL( textChanged( const QString& ) ),
02818 this, SLOT( slotEmitChanged( void ) ) );
02819 glay->addWidget( new QLabel( mPhraseForwardEdit,
02820 i18n("&Forward:"), this ), 5, 0 );
02821 glay->addMultiCellWidget( mPhraseForwardEdit, 5, 5, 1, 2 );
02822
02823
02824 mPhraseIndentPrefixEdit = new KLineEdit( this );
02825 connect( mPhraseIndentPrefixEdit, SIGNAL( textChanged( const QString& ) ),
02826 this, SLOT( slotEmitChanged( void ) ) );
02827 glay->addWidget( new QLabel( mPhraseIndentPrefixEdit,
02828 i18n("&Quote indicator:"), this ), 6, 0 );
02829 glay->addMultiCellWidget( mPhraseIndentPrefixEdit, 6, 6, 1, 2 );
02830
02831
02832 }
02833
02834
02835 void ComposerPage::PhrasesTab::setLanguageItemInformation( int index ) {
02836 assert( 0 <= index && index < (int)mLanguageList.count() );
02837
02838 LanguageItem &l = *mLanguageList.at( index );
02839
02840 mPhraseReplyEdit->setText( l.mReply );
02841 mPhraseReplyAllEdit->setText( l.mReplyAll );
02842 mPhraseForwardEdit->setText( l.mForward );
02843 mPhraseIndentPrefixEdit->setText( l.mIndentPrefix );
02844 }
02845
02846 void ComposerPage::PhrasesTab::saveActiveLanguageItem() {
02847 int index = mActiveLanguageItem;
02848 if (index == -1) return;
02849 assert( 0 <= index && index < (int)mLanguageList.count() );
02850
02851 LanguageItem &l = *mLanguageList.at( index );
02852
02853 l.mReply = mPhraseReplyEdit->text();
02854 l.mReplyAll = mPhraseReplyAllEdit->text();
02855 l.mForward = mPhraseForwardEdit->text();
02856 l.mIndentPrefix = mPhraseIndentPrefixEdit->text();
02857 }
02858
02859 void ComposerPage::PhrasesTab::slotNewLanguage()
02860 {
02861 NewLanguageDialog dialog( mLanguageList, parentWidget(), "New", true );
02862 if ( dialog.exec() == QDialog::Accepted ) slotAddNewLanguage( dialog.language() );
02863 }
02864
02865 void ComposerPage::PhrasesTab::slotAddNewLanguage( const QString& lang )
02866 {
02867 mPhraseLanguageCombo->setCurrentItem(
02868 mPhraseLanguageCombo->insertLanguage( lang ) );
02869 KLocale locale("kmail");
02870 locale.setLanguage( lang );
02871 mLanguageList.append(
02872 LanguageItem( lang,
02873 locale.translate("On %D, you wrote:"),
02874 locale.translate("On %D, %F wrote:"),
02875 locale.translate("Forwarded Message"),
02876 locale.translate(">%_") ) );
02877 mRemoveButton->setEnabled( true );
02878 slotLanguageChanged( QString::null );
02879 }
02880
02881 void ComposerPage::PhrasesTab::slotRemoveLanguage()
02882 {
02883 assert( mPhraseLanguageCombo->count() > 1 );
02884 int index = mPhraseLanguageCombo->currentItem();
02885 assert( 0 <= index && index < (int)mLanguageList.count() );
02886
02887
02888 mLanguageList.remove( mLanguageList.at( index ) );
02889 mPhraseLanguageCombo->removeItem( index );
02890
02891 if ( index >= (int)mLanguageList.count() ) index--;
02892
02893 mActiveLanguageItem = index;
02894 setLanguageItemInformation( index );
02895 mRemoveButton->setEnabled( mLanguageList.count() > 1 );
02896 emit changed( true );
02897 }
02898
02899 void ComposerPage::PhrasesTab::slotLanguageChanged( const QString& )
02900 {
02901 int index = mPhraseLanguageCombo->currentItem();
02902 assert( index < (int)mLanguageList.count() );
02903 saveActiveLanguageItem();
02904 mActiveLanguageItem = index;
02905 setLanguageItemInformation( index );
02906 emit changed( true );
02907 }
02908
02909
02910 void ComposerPage::PhrasesTab::doLoadFromGlobalSettings() {
02911 mLanguageList.clear();
02912 mPhraseLanguageCombo->clear();
02913 mActiveLanguageItem = -1;
02914
02915 int numLang = GlobalSettings::self()->replyLanguagesCount();
02916 int currentNr = GlobalSettings::self()->replyCurrentLanguage();
02917
02918
02919 for ( int i = 0 ; i < numLang ; i++ ) {
02920 ReplyPhrases replyPhrases( QString::number(i) );
02921 replyPhrases.readConfig();
02922 QString lang = replyPhrases.language();
02923 mLanguageList.append(
02924 LanguageItem( lang,
02925 replyPhrases.phraseReplySender(),
02926 replyPhrases.phraseReplyAll(),
02927 replyPhrases.phraseForward(),
02928 replyPhrases.indentPrefix() ) );
02929 mPhraseLanguageCombo->insertLanguage( lang );
02930 }
02931
02932 if ( currentNr >= numLang || currentNr < 0 )
02933 currentNr = 0;
02934
02935 if ( numLang == 0 ) {
02936 slotAddNewLanguage( KGlobal::locale()->language() );
02937 }
02938
02939 mPhraseLanguageCombo->setCurrentItem( currentNr );
02940 mActiveLanguageItem = currentNr;
02941 setLanguageItemInformation( currentNr );
02942 mRemoveButton->setEnabled( mLanguageList.count() > 1 );
02943 }
02944
02945 void ComposerPage::PhrasesTab::save() {
02946 GlobalSettings::self()->setReplyLanguagesCount( mLanguageList.count() );
02947 GlobalSettings::self()->setReplyCurrentLanguage( mPhraseLanguageCombo->currentItem() );
02948
02949 saveActiveLanguageItem();
02950 LanguageItemList::Iterator it = mLanguageList.begin();
02951 for ( int i = 0 ; it != mLanguageList.end() ; ++it, ++i ) {
02952 ReplyPhrases replyPhrases( QString::number(i) );
02953 replyPhrases.setLanguage( (*it).mLanguage );
02954 replyPhrases.setPhraseReplySender( (*it).mReply );
02955 replyPhrases.setPhraseReplyAll( (*it).mReplyAll );
02956 replyPhrases.setPhraseForward( (*it).mForward );
02957 replyPhrases.setIndentPrefix( (*it).mIndentPrefix );
02958 replyPhrases.writeConfig();
02959 }
02960 }
02961
02962 QString ComposerPage::TemplatesTab::helpAnchor() const {
02963 return QString::fromLatin1("configure-composer-templates");
02964 }
02965
02966 ComposerPageTemplatesTab::ComposerPageTemplatesTab( QWidget * parent, const char * name )
02967 : ConfigModuleTab ( parent, name )
02968 {
02969 QVBoxLayout* vlay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
02970
02971 mWidget = new TemplatesConfiguration( this );
02972 vlay->addWidget( mWidget );
02973
02974 connect( mWidget, SIGNAL( changed() ),
02975 this, SLOT( slotEmitChanged( void ) ) );
02976 }
02977
02978 void ComposerPage::TemplatesTab::doLoadFromGlobalSettings() {
02979 mWidget->loadFromGlobal();
02980 }
02981
02982 void ComposerPage::TemplatesTab::save() {
02983 mWidget->saveToGlobal();
02984 }
02985
02986 QString ComposerPage::CustomTemplatesTab::helpAnchor() const {
02987 return QString::fromLatin1("configure-composer-custom-templates");
02988 }
02989
02990 ComposerPageCustomTemplatesTab::ComposerPageCustomTemplatesTab( QWidget * parent, const char * name )
02991 : ConfigModuleTab ( parent, name )
02992 {
02993 QVBoxLayout* vlay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
02994
02995 mWidget = new CustomTemplates( this );
02996 vlay->addWidget( mWidget );
02997
02998 connect( mWidget, SIGNAL( changed() ),
02999 this, SLOT( slotEmitChanged( void ) ) );
03000 }
03001
03002 void ComposerPage::CustomTemplatesTab::doLoadFromGlobalSettings() {
03003 mWidget->load();
03004 }
03005
03006 void ComposerPage::CustomTemplatesTab::save() {
03007 mWidget->save();
03008 }
03009
03010 QString ComposerPage::SubjectTab::helpAnchor() const {
03011 return QString::fromLatin1("configure-composer-subject");
03012 }
03013
03014 ComposerPageSubjectTab::ComposerPageSubjectTab( QWidget * parent, const char * name )
03015 : ConfigModuleTab( parent, name )
03016 {
03017
03018 QVBoxLayout *vlay;
03019 QGroupBox *group;
03020 QLabel *label;
03021
03022
03023 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
03024
03025 group = new QVGroupBox( i18n("Repl&y Subject Prefixes"), this );
03026 group->layout()->setSpacing( KDialog::spacingHint() );
03027
03028
03029 label = new QLabel( i18n("Recognize any sequence of the following prefixes\n"
03030 "(entries are case-insensitive regular expressions):"), group );
03031 label->setAlignment( AlignLeft|WordBreak );
03032
03033
03034 SimpleStringListEditor::ButtonCode buttonCode =
03035 static_cast<SimpleStringListEditor::ButtonCode>( SimpleStringListEditor::Add | SimpleStringListEditor::Remove | SimpleStringListEditor::Modify );
03036 mReplyListEditor =
03037 new SimpleStringListEditor( group, 0, buttonCode,
03038 i18n("A&dd..."), i18n("Re&move"),
03039 i18n("Mod&ify..."),
03040 i18n("Enter new reply prefix:") );
03041 connect( mReplyListEditor, SIGNAL( changed( void ) ),
03042 this, SLOT( slotEmitChanged( void ) ) );
03043
03044
03045 mReplaceReplyPrefixCheck = new QCheckBox(
03046 GlobalSettings::self()->replaceReplyPrefixItem()->label(),
03047 group, "kcfg_ReplaceReplyPrefix" );
03048 connect( mReplaceReplyPrefixCheck, SIGNAL( stateChanged( int ) ),
03049 this, SLOT( slotEmitChanged( void ) ) );
03050
03051 vlay->addWidget( group );
03052
03053
03054 group = new QVGroupBox( i18n("For&ward Subject Prefixes"), this );
03055 group->layout()->setSpacing( KDialog::marginHint() );
03056
03057
03058 label= new QLabel( i18n("Recognize any sequence of the following prefixes\n"
03059 "(entries are case-insensitive regular expressions):"), group );
03060 label->setAlignment( AlignLeft|WordBreak );
03061
03062
03063 mForwardListEditor =
03064 new SimpleStringListEditor( group, 0, buttonCode,
03065 i18n("Add..."),
03066 i18n("Remo&ve"),
03067 i18n("Modify..."),
03068 i18n("Enter new forward prefix:") );
03069 connect( mForwardListEditor, SIGNAL( changed( void ) ),
03070 this, SLOT( slotEmitChanged( void ) ) );
03071
03072
03073 mReplaceForwardPrefixCheck = new QCheckBox(
03074 GlobalSettings::self()->replaceForwardPrefixItem()->label(),
03075 group, "kcfg_ReplaceForwardPrefix" );
03076 connect( mReplaceForwardPrefixCheck, SIGNAL( stateChanged( int ) ),
03077 this, SLOT( slotEmitChanged( void ) ) );
03078
03079 vlay->addWidget( group );
03080 }
03081
03082 void ComposerPage::SubjectTab::doLoadFromGlobalSettings() {
03083 mReplyListEditor->setStringList( GlobalSettings::self()->replyPrefixes() );
03084 mReplaceReplyPrefixCheck->setChecked( GlobalSettings::self()->replaceReplyPrefix() );
03085 mForwardListEditor->setStringList( GlobalSettings::self()->forwardPrefixes() );
03086 mReplaceForwardPrefixCheck->setChecked( GlobalSettings::self()->replaceForwardPrefix() );
03087 }
03088
03089 void ComposerPage::SubjectTab::save() {
03090 GlobalSettings::self()->setReplyPrefixes( mReplyListEditor->stringList() );
03091 GlobalSettings::self()->setForwardPrefixes( mForwardListEditor->stringList() );
03092 }
03093
03094 QString ComposerPage::CharsetTab::helpAnchor() const {
03095 return QString::fromLatin1("configure-composer-charset");
03096 }
03097
03098 ComposerPageCharsetTab::ComposerPageCharsetTab( QWidget * parent, const char * name )
03099 : ConfigModuleTab( parent, name )
03100 {
03101
03102 QVBoxLayout *vlay;
03103 QLabel *label;
03104
03105 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
03106
03107 label = new QLabel( i18n("This list is checked for every outgoing message "
03108 "from the top to the bottom for a charset that "
03109 "contains all required characters."), this );
03110 label->setAlignment( WordBreak);
03111 vlay->addWidget( label );
03112
03113 mCharsetListEditor =
03114 new SimpleStringListEditor( this, 0, SimpleStringListEditor::All,
03115 i18n("A&dd..."), i18n("Remo&ve"),
03116 i18n("&Modify..."), i18n("Enter charset:") );
03117 connect( mCharsetListEditor, SIGNAL( changed( void ) ),
03118 this, SLOT( slotEmitChanged( void ) ) );
03119
03120 vlay->addWidget( mCharsetListEditor, 1 );
03121
03122 mKeepReplyCharsetCheck = new QCheckBox( i18n("&Keep original charset when "
03123 "replying or forwarding (if "
03124 "possible)"), this );
03125 connect( mKeepReplyCharsetCheck, SIGNAL ( stateChanged( int ) ),
03126 this, SLOT( slotEmitChanged( void ) ) );
03127 vlay->addWidget( mKeepReplyCharsetCheck );
03128
03129 connect( mCharsetListEditor, SIGNAL(aboutToAdd(QString&)),
03130 this, SLOT(slotVerifyCharset(QString&)) );
03131 }
03132
03133 void ComposerPage::CharsetTab::slotVerifyCharset( QString & charset ) {
03134 if ( charset.isEmpty() ) return;
03135
03136
03137
03138 if ( charset.lower() == QString::fromLatin1("us-ascii") ) {
03139 charset = QString::fromLatin1("us-ascii");
03140 return;
03141 }
03142
03143 if ( charset.lower() == QString::fromLatin1("locale") ) {
03144 charset = QString::fromLatin1("%1 (locale)")
03145 .arg( QCString( kmkernel->networkCodec()->mimeName() ).lower() );
03146 return;
03147 }
03148
03149 bool ok = false;
03150 QTextCodec *codec = KGlobal::charsets()->codecForName( charset, ok );
03151 if ( ok && codec ) {
03152 charset = QString::fromLatin1( codec->mimeName() ).lower();
03153 return;
03154 }
03155
03156 KMessageBox::sorry( this, i18n("This charset is not supported.") );
03157 charset = QString::null;
03158 }
03159
03160 void ComposerPage::CharsetTab::doLoadOther() {
03161 KConfigGroup composer( KMKernel::config(), "Composer" );
03162
03163 QStringList charsets = composer.readListEntry( "pref-charsets" );
03164 for ( QStringList::Iterator it = charsets.begin() ;
03165 it != charsets.end() ; ++it )
03166 if ( (*it) == QString::fromLatin1("locale") ) {
03167 QCString cset = kmkernel->networkCodec()->mimeName();
03168 KPIM::kAsciiToLower( cset.data() );
03169 (*it) = QString("%1 (locale)").arg( cset );
03170 }
03171
03172 mCharsetListEditor->setStringList( charsets );
03173 mKeepReplyCharsetCheck->setChecked( !composer.readBoolEntry( "force-reply-charset", false ) );
03174 }
03175
03176 void ComposerPage::CharsetTab::save() {
03177 KConfigGroup composer( KMKernel::config(), "Composer" );
03178
03179 QStringList charsetList = mCharsetListEditor->stringList();
03180 QStringList::Iterator it = charsetList.begin();
03181 for ( ; it != charsetList.end() ; ++it )
03182 if ( (*it).endsWith("(locale)") )
03183 (*it) = "locale";
03184 composer.writeEntry( "pref-charsets", charsetList );
03185 composer.writeEntry( "force-reply-charset",
03186 !mKeepReplyCharsetCheck->isChecked() );
03187 }
03188
03189 QString ComposerPage::HeadersTab::helpAnchor() const {
03190 return QString::fromLatin1("configure-composer-headers");
03191 }
03192
03193 ComposerPageHeadersTab::ComposerPageHeadersTab( QWidget * parent, const char * name )
03194 : ConfigModuleTab( parent, name )
03195 {
03196
03197 QVBoxLayout *vlay;
03198 QHBoxLayout *hlay;
03199 QGridLayout *glay;
03200 QLabel *label;
03201 QPushButton *button;
03202
03203 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
03204
03205
03206 mCreateOwnMessageIdCheck =
03207 new QCheckBox( i18n("&Use custom message-id suffix"), this );
03208 connect( mCreateOwnMessageIdCheck, SIGNAL ( stateChanged( int ) ),
03209 this, SLOT( slotEmitChanged( void ) ) );
03210 vlay->addWidget( mCreateOwnMessageIdCheck );
03211
03212
03213 hlay = new QHBoxLayout( vlay );
03214 mMessageIdSuffixEdit = new KLineEdit( this );
03215
03216 mMessageIdSuffixValidator =
03217 new QRegExpValidator( QRegExp( "[a-zA-Z0-9+-]+(?:\\.[a-zA-Z0-9+-]+)*" ), this );
03218 mMessageIdSuffixEdit->setValidator( mMessageIdSuffixValidator );
03219 label = new QLabel( mMessageIdSuffixEdit,
03220 i18n("Custom message-&id suffix:"), this );
03221 label->setEnabled( false );
03222 mMessageIdSuffixEdit->setEnabled( false );
03223 hlay->addWidget( label );
03224 hlay->addWidget( mMessageIdSuffixEdit, 1 );
03225 connect( mCreateOwnMessageIdCheck, SIGNAL(toggled(bool) ),
03226 label, SLOT(setEnabled(bool)) );
03227 connect( mCreateOwnMessageIdCheck, SIGNAL(toggled(bool) ),
03228 mMessageIdSuffixEdit, SLOT(setEnabled(bool)) );
03229 connect( mMessageIdSuffixEdit, SIGNAL( textChanged( const QString& ) ),
03230 this, SLOT( slotEmitChanged( void ) ) );
03231
03232
03233 vlay->addWidget( new KSeparator( KSeparator::HLine, this ) );
03234 vlay->addWidget( new QLabel( i18n("Define custom mime header fields:"), this) );
03235
03236
03237 glay = new QGridLayout( vlay, 5, 3 );
03238 glay->setRowStretch( 2, 1 );
03239 glay->setColStretch( 1, 1 );
03240 mTagList = new ListView( this, "tagList" );
03241 mTagList->addColumn( i18n("Name") );
03242 mTagList->addColumn( i18n("Value") );
03243 mTagList->setAllColumnsShowFocus( true );
03244 mTagList->setSorting( -1 );
03245 connect( mTagList, SIGNAL(selectionChanged()),
03246 this, SLOT(slotMimeHeaderSelectionChanged()) );
03247 glay->addMultiCellWidget( mTagList, 0, 2, 0, 1 );
03248
03249
03250 button = new QPushButton( i18n("Ne&w"), this );
03251 connect( button, SIGNAL(clicked()), this, SLOT(slotNewMimeHeader()) );
03252 button->setAutoDefault( false );
03253 glay->addWidget( button, 0, 2 );
03254 mRemoveHeaderButton = new QPushButton( i18n("Re&move"), this );
03255 connect( mRemoveHeaderButton, SIGNAL(clicked()),
03256 this, SLOT(slotRemoveMimeHeader()) );
03257 button->setAutoDefault( false );
03258 glay->addWidget( mRemoveHeaderButton, 1, 2 );
03259
03260
03261 mTagNameEdit = new KLineEdit( this );
03262 mTagNameEdit->setEnabled( false );
03263 mTagNameLabel = new QLabel( mTagNameEdit, i18n("&Name:"), this );
03264 mTagNameLabel->setEnabled( false );
03265 glay->addWidget( mTagNameLabel, 3, 0 );
03266 glay->addWidget( mTagNameEdit, 3, 1 );
03267 connect( mTagNameEdit, SIGNAL(textChanged(const QString&)),
03268 this, SLOT(slotMimeHeaderNameChanged(const QString&)) );
03269
03270 mTagValueEdit = new KLineEdit( this );
03271 mTagValueEdit->setEnabled( false );
03272 mTagValueLabel = new QLabel( mTagValueEdit, i18n("&Value:"), this );
03273 mTagValueLabel->setEnabled( false );
03274 glay->addWidget( mTagValueLabel, 4, 0 );
03275 glay->addWidget( mTagValueEdit, 4, 1 );
03276 connect( mTagValueEdit, SIGNAL(textChanged(const QString&)),
03277 this, SLOT(slotMimeHeaderValueChanged(const QString&)) );
03278 }
03279
03280 void ComposerPage::HeadersTab::slotMimeHeaderSelectionChanged()
03281 {
03282 QListViewItem * item = mTagList->selectedItem();
03283
03284 if ( item ) {
03285 mTagNameEdit->setText( item->text( 0 ) );
03286 mTagValueEdit->setText( item->text( 1 ) );
03287 } else {
03288 mTagNameEdit->clear();
03289 mTagValueEdit->clear();
03290 }
03291 mRemoveHeaderButton->setEnabled( item );
03292 mTagNameEdit->setEnabled( item );
03293 mTagValueEdit->setEnabled( item );
03294 mTagNameLabel->setEnabled( item );
03295 mTagValueLabel->setEnabled( item );
03296 }
03297
03298
03299 void ComposerPage::HeadersTab::slotMimeHeaderNameChanged( const QString & text ) {
03300
03301
03302 QListViewItem * item = mTagList->selectedItem();
03303 if ( item )
03304 item->setText( 0, text );
03305 emit changed( true );
03306 }
03307
03308
03309 void ComposerPage::HeadersTab::slotMimeHeaderValueChanged( const QString & text ) {
03310
03311
03312 QListViewItem * item = mTagList->selectedItem();
03313 if ( item )
03314 item->setText( 1, text );
03315 emit changed( true );
03316 }
03317
03318
03319 void ComposerPage::HeadersTab::slotNewMimeHeader()
03320 {
03321 QListViewItem *listItem = new QListViewItem( mTagList );
03322 mTagList->setCurrentItem( listItem );
03323 mTagList->setSelected( listItem, true );
03324 emit changed( true );
03325 }
03326
03327
03328 void ComposerPage::HeadersTab::slotRemoveMimeHeader()
03329 {
03330
03331 QListViewItem * item = mTagList->selectedItem();
03332 if ( !item ) {
03333 kdDebug(5006) << "==================================================\n"
03334 << "Error: Remove button was pressed although no custom header was selected\n"
03335 << "==================================================\n";
03336 return;
03337 }
03338
03339 QListViewItem * below = item->nextSibling();
03340 delete item;
03341
03342 if ( below )
03343 mTagList->setSelected( below, true );
03344 else if ( mTagList->lastItem() )
03345 mTagList->setSelected( mTagList->lastItem(), true );
03346 emit changed( true );
03347 }
03348
03349 void ComposerPage::HeadersTab::doLoadOther() {
03350 KConfigGroup general( KMKernel::config(), "General" );
03351
03352 QString suffix = general.readEntry( "myMessageIdSuffix" );
03353 mMessageIdSuffixEdit->setText( suffix );
03354 bool state = ( !suffix.isEmpty() &&
03355 general.readBoolEntry( "useCustomMessageIdSuffix", false ) );
03356 mCreateOwnMessageIdCheck->setChecked( state );
03357
03358 mTagList->clear();
03359 mTagNameEdit->clear();
03360 mTagValueEdit->clear();
03361
03362 QListViewItem * item = 0;
03363
03364 int count = general.readNumEntry( "mime-header-count", 0 );
03365 for( int i = 0 ; i < count ; i++ ) {
03366 KConfigGroup config( KMKernel::config(),
03367 QCString("Mime #") + QCString().setNum(i) );
03368 QString name = config.readEntry( "name" );
03369 QString value = config.readEntry( "value" );
03370 if( !name.isEmpty() )
03371 item = new QListViewItem( mTagList, item, name, value );
03372 }
03373 if ( mTagList->childCount() ) {
03374 mTagList->setCurrentItem( mTagList->firstChild() );
03375 mTagList->setSelected( mTagList->firstChild(), true );
03376 }
03377 else {
03378
03379 mRemoveHeaderButton->setEnabled( false );
03380 }
03381 }
03382
03383 void ComposerPage::HeadersTab::save() {
03384 KConfigGroup general( KMKernel::config(), "General" );
03385
03386 general.writeEntry( "useCustomMessageIdSuffix",
03387 mCreateOwnMessageIdCheck->isChecked() );
03388 general.writeEntry( "myMessageIdSuffix",
03389 mMessageIdSuffixEdit->text() );
03390
03391 int numValidEntries = 0;
03392 QListViewItem * item = mTagList->firstChild();
03393 for ( ; item ; item = item->itemBelow() )
03394 if( !item->text(0).isEmpty() ) {
03395 KConfigGroup config( KMKernel::config(), QCString("Mime #")
03396 + QCString().setNum( numValidEntries ) );
03397 config.writeEntry( "name", item->text( 0 ) );
03398 config.writeEntry( "value", item->text( 1 ) );
03399 numValidEntries++;
03400 }
03401 general.writeEntry( "mime-header-count", numValidEntries );
03402 }
03403
03404 QString ComposerPage::AttachmentsTab::helpAnchor() const {
03405 return QString::fromLatin1("configure-composer-attachments");
03406 }
03407
03408 ComposerPageAttachmentsTab::ComposerPageAttachmentsTab( QWidget * parent,
03409 const char * name )
03410 : ConfigModuleTab( parent, name ) {
03411
03412 QVBoxLayout *vlay;
03413 QLabel *label;
03414
03415 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
03416
03417
03418 mOutlookCompatibleCheck =
03419 new QCheckBox( i18n( "Outlook-compatible attachment naming" ), this );
03420 mOutlookCompatibleCheck->setChecked( false );
03421 QToolTip::add( mOutlookCompatibleCheck, i18n(
03422 "Turn this option on to make Outlook(tm) understand attachment names "
03423 "containing non-English characters" ) );
03424 connect( mOutlookCompatibleCheck, SIGNAL( stateChanged( int ) ),
03425 this, SLOT( slotEmitChanged( void ) ) );
03426 connect( mOutlookCompatibleCheck, SIGNAL( clicked() ),
03427 this, SLOT( slotOutlookCompatibleClicked() ) );
03428 vlay->addWidget( mOutlookCompatibleCheck );
03429 vlay->addSpacing( 5 );
03430
03431
03432 mMissingAttachmentDetectionCheck =
03433 new QCheckBox( i18n("E&nable detection of missing attachments"), this );
03434 mMissingAttachmentDetectionCheck->setChecked( true );
03435 connect( mMissingAttachmentDetectionCheck, SIGNAL( stateChanged( int ) ),
03436 this, SLOT( slotEmitChanged( void ) ) );
03437 vlay->addWidget( mMissingAttachmentDetectionCheck );
03438
03439
03440 label = new QLabel( i18n("Recognize any of the following key words as "
03441 "intention to attach a file:"), this );
03442 label->setAlignment( AlignLeft|WordBreak );
03443 vlay->addWidget( label );
03444
03445 SimpleStringListEditor::ButtonCode buttonCode =
03446 static_cast<SimpleStringListEditor::ButtonCode>( SimpleStringListEditor::Add | SimpleStringListEditor::Remove | SimpleStringListEditor::Modify );
03447 mAttachWordsListEditor =
03448 new SimpleStringListEditor( this, 0, buttonCode,
03449 i18n("A&dd..."), i18n("Re&move"),
03450 i18n("Mod&ify..."),
03451 i18n("Enter new key word:") );
03452 connect( mAttachWordsListEditor, SIGNAL( changed( void ) ),
03453 this, SLOT( slotEmitChanged( void ) ) );
03454 vlay->addWidget( mAttachWordsListEditor );
03455
03456 connect( mMissingAttachmentDetectionCheck, SIGNAL(toggled(bool) ),
03457 label, SLOT(setEnabled(bool)) );
03458 connect( mMissingAttachmentDetectionCheck, SIGNAL(toggled(bool) ),
03459 mAttachWordsListEditor, SLOT(setEnabled(bool)) );
03460 }
03461
03462 void ComposerPage::AttachmentsTab::doLoadFromGlobalSettings() {
03463 mOutlookCompatibleCheck->setChecked(
03464 GlobalSettings::self()->outlookCompatibleAttachments() );
03465 mMissingAttachmentDetectionCheck->setChecked(
03466 GlobalSettings::self()->showForgottenAttachmentWarning() );
03467 QStringList attachWordsList = GlobalSettings::self()->attachmentKeywords();
03468 if ( attachWordsList.isEmpty() ) {
03469
03470 attachWordsList << QString::fromLatin1("attachment")
03471 << QString::fromLatin1("attached");
03472 if ( QString::fromLatin1("attachment") != i18n("attachment") )
03473 attachWordsList << i18n("attachment");
03474 if ( QString::fromLatin1("attached") != i18n("attached") )
03475 attachWordsList << i18n("attached");
03476 }
03477
03478 mAttachWordsListEditor->setStringList( attachWordsList );
03479 }
03480
03481 void ComposerPage::AttachmentsTab::save() {
03482 GlobalSettings::self()->setOutlookCompatibleAttachments(
03483 mOutlookCompatibleCheck->isChecked() );
03484 GlobalSettings::self()->setShowForgottenAttachmentWarning(
03485 mMissingAttachmentDetectionCheck->isChecked() );
03486 GlobalSettings::self()->setAttachmentKeywords(
03487 mAttachWordsListEditor->stringList() );
03488 }
03489
03490 void ComposerPageAttachmentsTab::slotOutlookCompatibleClicked()
03491 {
03492 if (mOutlookCompatibleCheck->isChecked()) {
03493 KMessageBox::information(0,i18n("You have chosen to "
03494 "encode attachment names containing non-English characters in a way that "
03495 "is understood by Outlook(tm) and other mail clients that do not "
03496 "support standard-compliant encoded attachment names.\n"
03497 "Note that KMail may create non-standard compliant messages, "
03498 "and consequently it is possible that your messages will not be "
03499 "understood by standard-compliant mail clients; so, unless you have no "
03500 "other choice, you should not enable this option." ) );
03501 }
03502 }
03503
03504
03505
03506
03507
03508
03509 QString SecurityPage::helpAnchor() const {
03510 return QString::fromLatin1("configure-security");
03511 }
03512
03513 SecurityPage::SecurityPage( QWidget * parent, const char * name )
03514 : ConfigModuleWithTabs( parent, name )
03515 {
03516
03517
03518
03519 mGeneralTab = new GeneralTab();
03520 addTab( mGeneralTab, i18n("&Reading") );
03521
03522
03523
03524
03525 mComposerCryptoTab = new ComposerCryptoTab();
03526 addTab( mComposerCryptoTab, i18n("Composing") );
03527
03528
03529
03530
03531 mWarningTab = new WarningTab();
03532 addTab( mWarningTab, i18n("Warnings") );
03533
03534
03535
03536
03537 mSMimeTab = new SMimeTab();
03538 addTab( mSMimeTab, i18n("S/MIME &Validation") );
03539
03540
03541
03542
03543 mCryptPlugTab = new CryptPlugTab();
03544 addTab( mCryptPlugTab, i18n("Crypto Backe&nds") );
03545 load();
03546 }
03547
03548
03549 void SecurityPage::installProfile( KConfig * profile ) {
03550 mGeneralTab->installProfile( profile );
03551 mComposerCryptoTab->installProfile( profile );
03552 mWarningTab->installProfile( profile );
03553 mSMimeTab->installProfile( profile );
03554 }
03555
03556 QString SecurityPage::GeneralTab::helpAnchor() const {
03557 return QString::fromLatin1("configure-security-reading");
03558 }
03559
03560 SecurityPageGeneralTab::SecurityPageGeneralTab( QWidget * parent, const char * name )
03561 : ConfigModuleTab ( parent, name )
03562 {
03563
03564 QVBoxLayout *vlay;
03565 QHBox *hbox;
03566 QGroupBox *group;
03567 QRadioButton *radio;
03568 KActiveLabel *label;
03569 QWidget *w;
03570 QString msg;
03571
03572 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
03573
03574
03575 QString htmlWhatsThis = i18n( "<qt><p>Messages sometimes come in both formats. "
03576 "This option controls whether you want the HTML part or the plain "
03577 "text part to be displayed.</p>"
03578 "<p>Displaying the HTML part makes the message look better, "
03579 "but at the same time increases the risk of security holes "
03580 "being exploited.</p>"
03581 "<p>Displaying the plain text part loses much of the message's "
03582 "formatting, but makes it almost <em>impossible</em> "
03583 "to exploit security holes in the HTML renderer (Konqueror).</p>"
03584 "<p>The option below guards against one common misuse of HTML "
03585 "messages, but it cannot guard against security issues that were "
03586 "not known at the time this version of KMail was written.</p>"
03587 "<p>It is therefore advisable to <em>not</em> prefer HTML to "
03588 "plain text.</p>"
03589 "<p><b>Note:</b> You can set this option on a per-folder basis "
03590 "from the <i>Folder</i> menu of KMail's main window.</p></qt>" );
03591
03592 QString externalWhatsThis = i18n( "<qt><p>Some mail advertisements are in HTML "
03593 "and contain references to, for example, images that the advertisers"
03594 " employ to find out that you have read their message "
03595 "("web bugs").</p>"
03596 "<p>There is no valid reason to load images off the Internet like "
03597 "this, since the sender can always attach the required images "
03598 "directly to the message.</p>"
03599 "<p>To guard from such a misuse of the HTML displaying feature "
03600 "of KMail, this option is <em>disabled</em> by default.</p>"
03601 "<p>However, if you wish to, for example, view images in HTML "
03602 "messages that were not attached to it, you can enable this "
03603 "option, but you should be aware of the possible problem.</p></qt>" );
03604
03605 QString receiptWhatsThis = i18n( "<qt><h3>Message Disposition "
03606 "Notification Policy</h3>"
03607 "<p>MDNs are a generalization of what is commonly called <b>read "
03608 "receipt</b>. The message author requests a disposition "
03609 "notification to be sent and the receiver's mail program "
03610 "generates a reply from which the author can learn what "
03611 "happened to his message. Common disposition types include "
03612 "<b>displayed</b> (i.e. read), <b>deleted</b> and <b>dispatched</b> "
03613 "(e.g. forwarded).</p>"
03614 "<p>The following options are available to control KMail's "
03615 "sending of MDNs:</p>"
03616 "<ul>"
03617 "<li><em>Ignore</em>: Ignores any request for disposition "
03618 "notifications. No MDN will ever be sent automatically "
03619 "(recommended).</li>"
03620 "<li><em>Ask</em>: Answers requests only after asking the user "
03621 "for permission. This way, you can send MDNs for selected "
03622 "messages while denying or ignoring them for others.</li>"
03623 "<li><em>Deny</em>: Always sends a <b>denied</b> notification. This "
03624 "is only <em>slightly</em> better than always sending MDNs. "
03625 "The author will still know that the messages has been acted "
03626 "upon, he just cannot tell whether it was deleted or read etc.</li>"
03627 "<li><em>Always send</em>: Always sends the requested "
03628 "disposition notification. That means that the author of the "
03629 "message gets to know when the message was acted upon and, "
03630 "in addition, what happened to it (displayed, deleted, "
03631 "etc.). This option is strongly discouraged, but since it "
03632 "makes much sense e.g. for customer relationship management, "
03633 "it has been made available.</li>"
03634 "</ul></qt>" );
03635
03636
03637
03638 group = new QVGroupBox( i18n( "HTML Messages" ), this );
03639 group->layout()->setSpacing( KDialog::spacingHint() );
03640
03641 mHtmlMailCheck = new QCheckBox( i18n("Prefer H&TML to plain text"), group );
03642 QWhatsThis::add( mHtmlMailCheck, htmlWhatsThis );
03643 connect( mHtmlMailCheck, SIGNAL( stateChanged( int ) ),
03644 this, SLOT( slotEmitChanged( void ) ) );
03645 mExternalReferences = new QCheckBox( i18n("Allow messages to load e&xternal "
03646 "references from the Internet" ), group );
03647 QWhatsThis::add( mExternalReferences, externalWhatsThis );
03648 connect( mExternalReferences, SIGNAL( stateChanged( int ) ),
03649 this, SLOT( slotEmitChanged( void ) ) );
03650 label = new KActiveLabel( i18n("<b>WARNING:</b> Allowing HTML in email may "
03651 "increase the risk that your system will be "
03652 "compromised by present and anticipated security "
03653 "exploits. <a href=\"whatsthis:%1\">More about "
03654 "HTML mails...</a> <a href=\"whatsthis:%2\">More "
03655 "about external references...</a>")
03656 .arg(htmlWhatsThis).arg(externalWhatsThis),
03657 group );
03658
03659 vlay->addWidget( group );
03660
03661
03662 group = new QVGroupBox( i18n("Message Disposition Notifications"), this );
03663 group->layout()->setSpacing( KDialog::spacingHint() );
03664
03665
03666
03667 mMDNGroup = new QButtonGroup( group );
03668 mMDNGroup->hide();
03669 connect( mMDNGroup, SIGNAL( clicked( int ) ),
03670 this, SLOT( slotEmitChanged( void ) ) );
03671 hbox = new QHBox( group );
03672 hbox->setSpacing( KDialog::spacingHint() );
03673
03674 (void)new QLabel( i18n("Send policy:"), hbox );
03675
03676 radio = new QRadioButton( i18n("&Ignore"), hbox );
03677 mMDNGroup->insert( radio );
03678
03679 radio = new QRadioButton( i18n("As&k"), hbox );
03680 mMDNGroup->insert( radio );
03681
03682 radio = new QRadioButton( i18n("&Deny"), hbox );
03683 mMDNGroup->insert( radio );
03684
03685 radio = new QRadioButton( i18n("Al&ways send"), hbox );
03686 mMDNGroup->insert( radio );
03687
03688 for ( int i = 0 ; i < mMDNGroup->count() ; ++i )
03689 QWhatsThis::add( mMDNGroup->find( i ), receiptWhatsThis );
03690
03691 w = new QWidget( hbox );
03692 hbox->setStretchFactor( w, 1 );
03693
03694
03695 mOrigQuoteGroup = new QButtonGroup( group );
03696 mOrigQuoteGroup->hide();
03697 connect( mOrigQuoteGroup, SIGNAL( clicked( int ) ),
03698 this, SLOT( slotEmitChanged( void ) ) );
03699
03700 hbox = new QHBox( group );
03701 hbox->setSpacing( KDialog::spacingHint() );
03702
03703 (void)new QLabel( i18n("Quote original message:"), hbox );
03704
03705 radio = new QRadioButton( i18n("Nothin&g"), hbox );
03706 mOrigQuoteGroup->insert( radio );
03707
03708 radio = new QRadioButton( i18n("&Full message"), hbox );
03709 mOrigQuoteGroup->insert( radio );
03710
03711 radio = new QRadioButton( i18n("Onl&y headers"), hbox );
03712 mOrigQuoteGroup->insert( radio );
03713
03714 w = new QWidget( hbox );
03715 hbox->setStretchFactor( w, 1 );
03716
03717 mNoMDNsWhenEncryptedCheck = new QCheckBox( i18n("Do not send MDNs in response to encrypted messages"), group );
03718 connect( mNoMDNsWhenEncryptedCheck, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03719
03720
03721 label = new KActiveLabel( i18n("<b>WARNING:</b> Unconditionally returning "
03722 "confirmations undermines your privacy. "
03723 "<a href=\"whatsthis:%1\">More...</a>")
03724 .arg(receiptWhatsThis),
03725 group );
03726
03727 vlay->addWidget( group );
03728
03729
03730 group = new QVGroupBox( i18n( "Certificate && Key Bundle Attachments" ), this );
03731 group->layout()->setSpacing( KDialog::spacingHint() );
03732
03733 mAutomaticallyImportAttachedKeysCheck = new QCheckBox( i18n("Automatically import keys and certificates"), group );
03734 connect( mAutomaticallyImportAttachedKeysCheck, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03735
03736 vlay->addWidget( group );
03737
03738
03739
03740 vlay->addStretch( 10 );
03741 }
03742
03743 void SecurityPage::GeneralTab::doLoadOther() {
03744 const KConfigGroup reader( KMKernel::config(), "Reader" );
03745
03746 mHtmlMailCheck->setChecked( reader.readBoolEntry( "htmlMail", false ) );
03747 mExternalReferences->setChecked( reader.readBoolEntry( "htmlLoadExternal", false ) );
03748 mAutomaticallyImportAttachedKeysCheck->setChecked( reader.readBoolEntry( "AutoImportKeys", false ) );
03749
03750 const KConfigGroup mdn( KMKernel::config(), "MDN" );
03751
03752 int num = mdn.readNumEntry( "default-policy", 0 );
03753 if ( num < 0 || num >= mMDNGroup->count() ) num = 0;
03754 mMDNGroup->setButton( num );
03755 num = mdn.readNumEntry( "quote-message", 0 );
03756 if ( num < 0 || num >= mOrigQuoteGroup->count() ) num = 0;
03757 mOrigQuoteGroup->setButton( num );
03758 mNoMDNsWhenEncryptedCheck->setChecked(mdn.readBoolEntry( "not-send-when-encrypted", true ));
03759 }
03760
03761 void SecurityPage::GeneralTab::installProfile( KConfig * profile ) {
03762 const KConfigGroup reader( profile, "Reader" );
03763 const KConfigGroup mdn( profile, "MDN" );
03764
03765 if ( reader.hasKey( "htmlMail" ) )
03766 mHtmlMailCheck->setChecked( reader.readBoolEntry( "htmlMail" ) );
03767 if ( reader.hasKey( "htmlLoadExternal" ) )
03768 mExternalReferences->setChecked( reader.readBoolEntry( "htmlLoadExternal" ) );
03769 if ( reader.hasKey( "AutoImportKeys" ) )
03770 mAutomaticallyImportAttachedKeysCheck->setChecked( reader.readBoolEntry( "AutoImportKeys" ) );
03771
03772 if ( mdn.hasKey( "default-policy" ) ) {
03773 int num = mdn.readNumEntry( "default-policy" );
03774 if ( num < 0 || num >= mMDNGroup->count() ) num = 0;
03775 mMDNGroup->setButton( num );
03776 }
03777 if ( mdn.hasKey( "quote-message" ) ) {
03778 int num = mdn.readNumEntry( "quote-message" );
03779 if ( num < 0 || num >= mOrigQuoteGroup->count() ) num = 0;
03780 mOrigQuoteGroup->setButton( num );
03781 }
03782 if ( mdn.hasKey( "not-send-when-encrypted" ) )
03783 mNoMDNsWhenEncryptedCheck->setChecked(mdn.readBoolEntry( "not-send-when-encrypted" ));
03784 }
03785
03786 void SecurityPage::GeneralTab::save() {
03787 KConfigGroup reader( KMKernel::config(), "Reader" );
03788 KConfigGroup mdn( KMKernel::config(), "MDN" );
03789
03790 if (reader.readBoolEntry( "htmlMail", false ) != mHtmlMailCheck->isChecked())
03791 {
03792 if (KMessageBox::warningContinueCancel(this, i18n("Changing the global "
03793 "HTML setting will override all folder specific values."), QString::null,
03794 KStdGuiItem::cont(), "htmlMailOverride") == KMessageBox::Continue)
03795 {
03796 reader.writeEntry( "htmlMail", mHtmlMailCheck->isChecked() );
03797 QStringList names;
03798 QValueList<QGuardedPtr<KMFolder> > folders;
03799 kmkernel->folderMgr()->createFolderList(&names, &folders);
03800 kmkernel->imapFolderMgr()->createFolderList(&names, &folders);
03801 kmkernel->dimapFolderMgr()->createFolderList(&names, &folders);
03802 kmkernel->searchFolderMgr()->createFolderList(&names, &folders);
03803 for (QValueList<QGuardedPtr<KMFolder> >::iterator it = folders.begin();
03804 it != folders.end(); ++it)
03805 {
03806 if (*it)
03807 {
03808 KConfigGroupSaver saver(KMKernel::config(),
03809 "Folder-" + (*it)->idString());
03810 KMKernel::config()->writeEntry("htmlMailOverride", false);
03811 }
03812 }
03813 }
03814 }
03815 reader.writeEntry( "htmlLoadExternal", mExternalReferences->isChecked() );
03816 reader.writeEntry( "AutoImportKeys", mAutomaticallyImportAttachedKeysCheck->isChecked() );
03817 mdn.writeEntry( "default-policy", mMDNGroup->id( mMDNGroup->selected() ) );
03818 mdn.writeEntry( "quote-message", mOrigQuoteGroup->id( mOrigQuoteGroup->selected() ) );
03819 mdn.writeEntry( "not-send-when-encrypted", mNoMDNsWhenEncryptedCheck->isChecked() );
03820 }
03821
03822
03823 QString SecurityPage::ComposerCryptoTab::helpAnchor() const {
03824 return QString::fromLatin1("configure-security-composing");
03825 }
03826
03827 SecurityPageComposerCryptoTab::SecurityPageComposerCryptoTab( QWidget * parent, const char * name )
03828 : ConfigModuleTab ( parent, name )
03829 {
03830
03831 QVBoxLayout* vlay = new QVBoxLayout( this, 0, 0 );
03832
03833 mWidget = new ComposerCryptoConfiguration( this );
03834 connect( mWidget->mAutoSignature, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03835 connect( mWidget->mEncToSelf, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03836 connect( mWidget->mShowEncryptionResult, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03837 connect( mWidget->mShowKeyApprovalDlg, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03838 connect( mWidget->mAutoEncrypt, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03839 connect( mWidget->mNeverEncryptWhenSavingInDrafts, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03840 connect( mWidget->mStoreEncrypted, SIGNAL( toggled(bool) ), this, SLOT( slotEmitChanged() ) );
03841 vlay->addWidget( mWidget );
03842 }
03843
03844 void SecurityPage::ComposerCryptoTab::doLoadOther() {
03845 const KConfigGroup composer( KMKernel::config(), "Composer" );
03846
03847
03848
03849 mWidget->mAutoSignature->setChecked( composer.readBoolEntry( "pgp-auto-sign", false ) );
03850
03851 mWidget->mEncToSelf->setChecked( composer.readBoolEntry( "crypto-encrypt-to-self", true ) );
03852 mWidget->mShowEncryptionResult->setChecked( false );
03853 mWidget->mShowEncryptionResult->hide();
03854 mWidget->mShowKeyApprovalDlg->setChecked( composer.readBoolEntry( "crypto-show-keys-for-approval", true ) );
03855
03856 mWidget->mAutoEncrypt->setChecked( composer.readBoolEntry( "pgp-auto-encrypt", false ) );
03857 mWidget->mNeverEncryptWhenSavingInDrafts->setChecked( composer.readBoolEntry( "never-encrypt-drafts", true ) );
03858
03859 mWidget->mStoreEncrypted->setChecked( composer.readBoolEntry( "crypto-store-encrypted", true ) );
03860 }
03861
03862 void SecurityPage::ComposerCryptoTab::installProfile( KConfig * profile ) {
03863 const KConfigGroup composer( profile, "Composer" );
03864
03865 if ( composer.hasKey( "pgp-auto-sign" ) )
03866 mWidget->mAutoSignature->setChecked( composer.readBoolEntry( "pgp-auto-sign" ) );
03867
03868 if ( composer.hasKey( "crypto-encrypt-to-self" ) )
03869 mWidget->mEncToSelf->setChecked( composer.readBoolEntry( "crypto-encrypt-to-self" ) );
03870 if ( composer.hasKey( "crypto-show-encryption-result" ) )
03871 mWidget->mShowEncryptionResult->setChecked( composer.readBoolEntry( "crypto-show-encryption-result" ) );
03872 if ( composer.hasKey( "crypto-show-keys-for-approval" ) )
03873 mWidget->mShowKeyApprovalDlg->setChecked( composer.readBoolEntry( "crypto-show-keys-for-approval" ) );
03874 if ( composer.hasKey( "pgp-auto-encrypt" ) )
03875 mWidget->mAutoEncrypt->setChecked( composer.readBoolEntry( "pgp-auto-encrypt" ) );
03876 if ( composer.hasKey( "never-encrypt-drafts" ) )
03877 mWidget->mNeverEncryptWhenSavingInDrafts->setChecked( composer.readBoolEntry( "never-encrypt-drafts" ) );
03878
03879 if ( composer.hasKey( "crypto-store-encrypted" ) )
03880 mWidget->mStoreEncrypted->setChecked( composer.readBoolEntry( "crypto-store-encrypted" ) );
03881 }
03882
03883 void SecurityPage::ComposerCryptoTab::save() {
03884 KConfigGroup composer( KMKernel::config(), "Composer" );
03885
03886 composer.writeEntry( "pgp-auto-sign", mWidget->mAutoSignature->isChecked() );
03887
03888 composer.writeEntry( "crypto-encrypt-to-self", mWidget->mEncToSelf->isChecked() );
03889 composer.writeEntry( "crypto-show-encryption-result", mWidget->mShowEncryptionResult->isChecked() );
03890 composer.writeEntry( "crypto-show-keys-for-approval", mWidget->mShowKeyApprovalDlg->isChecked() );
03891
03892 composer.writeEntry( "pgp-auto-encrypt", mWidget->mAutoEncrypt->isChecked() );
03893 composer.writeEntry( "never-encrypt-drafts", mWidget->mNeverEncryptWhenSavingInDrafts->isChecked() );
03894
03895 composer.writeEntry( "crypto-store-encrypted", mWidget->mStoreEncrypted->isChecked() );
03896 }
03897
03898 QString SecurityPage::WarningTab::helpAnchor() const {
03899 return QString::fromLatin1("configure-security-warnings");
03900 }
03901
03902 SecurityPageWarningTab::SecurityPageWarningTab( QWidget * parent, const char * name )
03903 : ConfigModuleTab( parent, name )
03904 {
03905
03906 QVBoxLayout* vlay = new QVBoxLayout( this, 0, 0 );
03907
03908 mWidget = new WarningConfiguration( this );
03909 vlay->addWidget( mWidget );
03910
03911 connect( mWidget->warnGroupBox, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03912 connect( mWidget->mWarnUnsigned, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03913 connect( mWidget->warnUnencryptedCB, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03914 connect( mWidget->warnReceiverNotInCertificateCB, SIGNAL(toggled(bool)), SLOT(slotEmitChanged()) );
03915 connect( mWidget->mWarnSignKeyExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03916 connect( mWidget->mWarnSignChainCertExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03917 connect( mWidget->mWarnSignRootCertExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03918
03919 connect( mWidget->mWarnEncrKeyExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03920 connect( mWidget->mWarnEncrChainCertExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03921 connect( mWidget->mWarnEncrRootCertExpiresSB, SIGNAL( valueChanged( int ) ), SLOT( slotEmitChanged() ) );
03922
03923 connect( mWidget->enableAllWarningsPB, SIGNAL(clicked()),
03924 SLOT(slotReenableAllWarningsClicked()) );
03925 }
03926
03927 void SecurityPage::WarningTab::doLoadOther() {
03928 const KConfigGroup composer( KMKernel::config(), "Composer" );
03929
03930 mWidget->warnUnencryptedCB->setChecked( composer.readBoolEntry( "crypto-warning-unencrypted", false ) );
03931 mWidget->mWarnUnsigned->setChecked( composer.readBoolEntry( "crypto-warning-unsigned", false ) );
03932 mWidget->warnReceiverNotInCertificateCB->setChecked( composer.readBoolEntry( "crypto-warn-recv-not-in-cert", true ) );
03933
03934
03935
03936 mWidget->warnGroupBox->setChecked( composer.readBoolEntry( "crypto-warn-when-near-expire", true ) );
03937
03938 mWidget->mWarnSignKeyExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-key-near-expire-int", 14 ) );
03939 mWidget->mWarnSignChainCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-chaincert-near-expire-int", 14 ) );
03940 mWidget->mWarnSignRootCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-root-near-expire-int", 14 ) );
03941
03942 mWidget->mWarnEncrKeyExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-key-near-expire-int", 14 ) );
03943 mWidget->mWarnEncrChainCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-chaincert-near-expire-int", 14 ) );
03944 mWidget->mWarnEncrRootCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-root-near-expire-int", 14 ) );
03945
03946 mWidget->enableAllWarningsPB->setEnabled( true );
03947 }
03948
03949 void SecurityPage::WarningTab::installProfile( KConfig * profile ) {
03950 const KConfigGroup composer( profile, "Composer" );
03951
03952 if ( composer.hasKey( "crypto-warning-unencrypted" ) )
03953 mWidget->warnUnencryptedCB->setChecked( composer.readBoolEntry( "crypto-warning-unencrypted" ) );
03954 if ( composer.hasKey( "crypto-warning-unsigned" ) )
03955 mWidget->mWarnUnsigned->setChecked( composer.readBoolEntry( "crypto-warning-unsigned" ) );
03956 if ( composer.hasKey( "crypto-warn-recv-not-in-cert" ) )
03957 mWidget->warnReceiverNotInCertificateCB->setChecked( composer.readBoolEntry( "crypto-warn-recv-not-in-cert" ) );
03958
03959 if ( composer.hasKey( "crypto-warn-when-near-expire" ) )
03960 mWidget->warnGroupBox->setChecked( composer.readBoolEntry( "crypto-warn-when-near-expire" ) );
03961
03962 if ( composer.hasKey( "crypto-warn-sign-key-near-expire-int" ) )
03963 mWidget->mWarnSignKeyExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-key-near-expire-int" ) );
03964 if ( composer.hasKey( "crypto-warn-sign-chaincert-near-expire-int" ) )
03965 mWidget->mWarnSignChainCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-chaincert-near-expire-int" ) );
03966 if ( composer.hasKey( "crypto-warn-sign-root-near-expire-int" ) )
03967 mWidget->mWarnSignRootCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-sign-root-near-expire-int" ) );
03968
03969 if ( composer.hasKey( "crypto-warn-encr-key-near-expire-int" ) )
03970 mWidget->mWarnEncrKeyExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-key-near-expire-int" ) );
03971 if ( composer.hasKey( "crypto-warn-encr-chaincert-near-expire-int" ) )
03972 mWidget->mWarnEncrChainCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-chaincert-near-expire-int" ) );
03973 if ( composer.hasKey( "crypto-warn-encr-root-near-expire-int" ) )
03974 mWidget->mWarnEncrRootCertExpiresSB->setValue( composer.readNumEntry( "crypto-warn-encr-root-near-expire-int" ) );
03975 }
03976
03977 void SecurityPage::WarningTab::save() {
03978 KConfigGroup composer( KMKernel::config(), "Composer" );
03979
03980 composer.writeEntry( "crypto-warn-recv-not-in-cert", mWidget->warnReceiverNotInCertificateCB->isChecked() );
03981 composer.writeEntry( "crypto-warning-unencrypted", mWidget->warnUnencryptedCB->isChecked() );
03982 composer.writeEntry( "crypto-warning-unsigned", mWidget->mWarnUnsigned->isChecked() );
03983
03984 composer.writeEntry( "crypto-warn-when-near-expire", mWidget->warnGroupBox->isChecked() );
03985 composer.writeEntry( "crypto-warn-sign-key-near-expire-int",
03986 mWidget->mWarnSignKeyExpiresSB->value() );
03987 composer.writeEntry( "crypto-warn-sign-chaincert-near-expire-int",
03988 mWidget->mWarnSignChainCertExpiresSB->value() );
03989 composer.writeEntry( "crypto-warn-sign-root-near-expire-int",
03990 mWidget->mWarnSignRootCertExpiresSB->value() );
03991
03992 composer.writeEntry( "crypto-warn-encr-key-near-expire-int",
03993 mWidget->mWarnEncrKeyExpiresSB->value() );
03994 composer.writeEntry( "crypto-warn-encr-chaincert-near-expire-int",
03995 mWidget->mWarnEncrChainCertExpiresSB->value() );
03996 composer.writeEntry( "crypto-warn-encr-root-near-expire-int",
03997 mWidget->mWarnEncrRootCertExpiresSB->value() );
03998 }
03999
04000 void SecurityPage::WarningTab::slotReenableAllWarningsClicked() {
04001 KMessageBox::enableAllMessages();
04002 mWidget->enableAllWarningsPB->setEnabled( false );
04003 }
04004
04006
04007 QString SecurityPage::SMimeTab::helpAnchor() const {
04008 return QString::fromLatin1("configure-security-smime-validation");
04009 }
04010
04011 SecurityPageSMimeTab::SecurityPageSMimeTab( QWidget * parent, const char * name )
04012 : ConfigModuleTab( parent, name )
04013 {
04014
04015 QVBoxLayout* vlay = new QVBoxLayout( this, 0, 0 );
04016
04017 mWidget = new SMimeConfiguration( this );
04018 vlay->addWidget( mWidget );
04019
04020
04021 QButtonGroup* bg = new QButtonGroup( mWidget );
04022 bg->hide();
04023 bg->insert( mWidget->CRLRB );
04024 bg->insert( mWidget->OCSPRB );
04025
04026
04027 mWidget->OCSPResponderSignature->setAllowedKeys(
04028 Kleo::KeySelectionDialog::SMIMEKeys
04029 | Kleo::KeySelectionDialog::TrustedKeys
04030 | Kleo::KeySelectionDialog::ValidKeys
04031 | Kleo::KeySelectionDialog::SigningKeys
04032 | Kleo::KeySelectionDialog::PublicKeys );
04033 mWidget->OCSPResponderSignature->setMultipleKeysEnabled( false );
04034
04035 mConfig = Kleo::CryptoBackendFactory::instance()->config();
04036
04037 connect( mWidget->CRLRB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04038 connect( mWidget->OCSPRB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04039 connect( mWidget->OCSPResponderURL, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotEmitChanged() ) );
04040 connect( mWidget->OCSPResponderSignature, SIGNAL( changed() ), this, SLOT( slotEmitChanged() ) );
04041 connect( mWidget->doNotCheckCertPolicyCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04042 connect( mWidget->neverConsultCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04043 connect( mWidget->fetchMissingCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04044
04045 connect( mWidget->ignoreServiceURLCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04046 connect( mWidget->ignoreHTTPDPCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04047 connect( mWidget->disableHTTPCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04048 connect( mWidget->honorHTTPProxyRB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04049 connect( mWidget->useCustomHTTPProxyRB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04050 connect( mWidget->customHTTPProxy, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotEmitChanged() ) );
04051 connect( mWidget->ignoreLDAPDPCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04052 connect( mWidget->disableLDAPCB, SIGNAL( toggled( bool ) ), this, SLOT( slotEmitChanged() ) );
04053 connect( mWidget->customLDAPProxy, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotEmitChanged() ) );
04054
04055 connect( mWidget->disableHTTPCB, SIGNAL( toggled( bool ) ),
04056 this, SLOT( slotUpdateHTTPActions() ) );
04057 connect( mWidget->ignoreHTTPDPCB, SIGNAL( toggled( bool ) ),
04058 this, SLOT( slotUpdateHTTPActions() ) );
04059
04060
04061 QButtonGroup* bgHTTPProxy = new QButtonGroup( mWidget );
04062 bgHTTPProxy->hide();
04063 bgHTTPProxy->insert( mWidget->honorHTTPProxyRB );
04064 bgHTTPProxy->insert( mWidget->useCustomHTTPProxyRB );
04065
04066 if ( !connectDCOPSignal( 0, "KPIM::CryptoConfig", "changed()",
04067 "load()", false ) )
04068 kdError(5650) << "SecurityPageSMimeTab: connection to CryptoConfig's changed() failed" << endl;
04069
04070 }
04071
04072 SecurityPageSMimeTab::~SecurityPageSMimeTab()
04073 {
04074 }
04075
04076 static void disableDirmngrWidget( QWidget* w ) {
04077 w->setEnabled( false );
04078 QWhatsThis::remove( w );
04079 QWhatsThis::add( w, i18n( "This option requires dirmngr >= 0.9.0" ) );
04080 }
04081
04082 static void initializeDirmngrCheckbox( QCheckBox* cb, Kleo::CryptoConfigEntry* entry ) {
04083 if ( entry )
04084 cb->setChecked( entry->boolValue() );
04085 else
04086 disableDirmngrWidget( cb );
04087 }
04088
04089 struct SMIMECryptoConfigEntries {
04090 SMIMECryptoConfigEntries( Kleo::CryptoConfig* config )
04091 : mConfig( config ) {
04092
04093
04094 mCheckUsingOCSPConfigEntry = configEntry( "gpgsm", "Security", "enable-ocsp", Kleo::CryptoConfigEntry::ArgType_None, false );
04095 mEnableOCSPsendingConfigEntry = configEntry( "dirmngr", "OCSP", "allow-ocsp", Kleo::CryptoConfigEntry::ArgType_None, false );
04096 mDoNotCheckCertPolicyConfigEntry = configEntry( "gpgsm", "Security", "disable-policy-checks", Kleo::CryptoConfigEntry::ArgType_None, false );
04097 mNeverConsultConfigEntry = configEntry( "gpgsm", "Security", "disable-crl-checks", Kleo::CryptoConfigEntry::ArgType_None, false );
04098 mFetchMissingConfigEntry = configEntry( "gpgsm", "Security", "auto-issuer-key-retrieve", Kleo::CryptoConfigEntry::ArgType_None, false );
04099
04100 mIgnoreServiceURLEntry = configEntry( "dirmngr", "OCSP", "ignore-ocsp-service-url", Kleo::CryptoConfigEntry::ArgType_None, false );
04101 mIgnoreHTTPDPEntry = configEntry( "dirmngr", "HTTP", "ignore-http-dp", Kleo::CryptoConfigEntry::ArgType_None, false );
04102 mDisableHTTPEntry = configEntry( "dirmngr", "HTTP", "disable-http", Kleo::CryptoConfigEntry::ArgType_None, false );
04103 mHonorHTTPProxy = configEntry( "dirmngr", "HTTP", "honor-http-proxy", Kleo::CryptoConfigEntry::ArgType_None, false );
04104
04105 mIgnoreLDAPDPEntry = configEntry( "dirmngr", "LDAP", "ignore-ldap-dp", Kleo::CryptoConfigEntry::ArgType_None, false );
04106 mDisableLDAPEntry = configEntry( "dirmngr", "LDAP", "disable-ldap", Kleo::CryptoConfigEntry::ArgType_None, false );
04107
04108 mOCSPResponderURLConfigEntry = configEntry( "dirmngr", "OCSP", "ocsp-responder", Kleo::CryptoConfigEntry::ArgType_String, false );
04109 mOCSPResponderSignature = configEntry( "dirmngr", "OCSP", "ocsp-signer", Kleo::CryptoConfigEntry::ArgType_String, false );
04110 mCustomHTTPProxy = configEntry( "dirmngr", "HTTP", "http-proxy", Kleo::CryptoConfigEntry::ArgType_String, false );
04111 mCustomLDAPProxy = configEntry( "dirmngr", "LDAP", "ldap-proxy", Kleo::CryptoConfigEntry::ArgType_String, false );
04112 }
04113
04114 Kleo::CryptoConfigEntry* configEntry( const char* componentName,
04115 const char* groupName,
04116 const char* entryName,
04117 int argType,
04118 bool isList );
04119
04120
04121 Kleo::CryptoConfigEntry* mCheckUsingOCSPConfigEntry;
04122 Kleo::CryptoConfigEntry* mEnableOCSPsendingConfigEntry;
04123 Kleo::CryptoConfigEntry* mDoNotCheckCertPolicyConfigEntry;
04124 Kleo::CryptoConfigEntry* mNeverConsultConfigEntry;
04125 Kleo::CryptoConfigEntry* mFetchMissingConfigEntry;
04126 Kleo::CryptoConfigEntry* mIgnoreServiceURLEntry;
04127 Kleo::CryptoConfigEntry* mIgnoreHTTPDPEntry;
04128 Kleo::CryptoConfigEntry* mDisableHTTPEntry;
04129 Kleo::CryptoConfigEntry* mHonorHTTPProxy;
04130 Kleo::CryptoConfigEntry* mIgnoreLDAPDPEntry;
04131 Kleo::CryptoConfigEntry* mDisableLDAPEntry;
04132
04133 Kleo::CryptoConfigEntry* mOCSPResponderURLConfigEntry;
04134 Kleo::CryptoConfigEntry* mOCSPResponderSignature;
04135 Kleo::CryptoConfigEntry* mCustomHTTPProxy;
04136 Kleo::CryptoConfigEntry* mCustomLDAPProxy;
04137
04138 Kleo::CryptoConfig* mConfig;
04139 };
04140
04141 void SecurityPage::SMimeTab::doLoadOther() {
04142 if ( !mConfig ) {
04143 setEnabled( false );
04144 return;
04145 }
04146
04147
04148
04149 mConfig->clear();
04150
04151
04152
04153
04154 SMIMECryptoConfigEntries e( mConfig );
04155
04156
04157
04158 if ( e.mCheckUsingOCSPConfigEntry ) {
04159 bool b = e.mCheckUsingOCSPConfigEntry->boolValue();
04160 mWidget->OCSPRB->setChecked( b );
04161 mWidget->CRLRB->setChecked( !b );
04162 mWidget->OCSPGroupBox->setEnabled( b );
04163 } else {
04164 mWidget->OCSPGroupBox->setEnabled( false );
04165 }
04166 if ( e.mDoNotCheckCertPolicyConfigEntry )
04167 mWidget->doNotCheckCertPolicyCB->setChecked( e.mDoNotCheckCertPolicyConfigEntry->boolValue() );
04168 if ( e.mNeverConsultConfigEntry )
04169 mWidget->neverConsultCB->setChecked( e.mNeverConsultConfigEntry->boolValue() );
04170 if ( e.mFetchMissingConfigEntry )
04171 mWidget->fetchMissingCB->setChecked( e.mFetchMissingConfigEntry->boolValue() );
04172
04173 if ( e.mOCSPResponderURLConfigEntry )
04174 mWidget->OCSPResponderURL->setText( e.mOCSPResponderURLConfigEntry->stringValue() );
04175 if ( e.mOCSPResponderSignature ) {
04176 mWidget->OCSPResponderSignature->setFingerprint( e.mOCSPResponderSignature->stringValue() );
04177 }
04178
04179
04180 initializeDirmngrCheckbox( mWidget->ignoreServiceURLCB, e.mIgnoreServiceURLEntry );
04181 initializeDirmngrCheckbox( mWidget->ignoreHTTPDPCB, e.mIgnoreHTTPDPEntry );
04182 initializeDirmngrCheckbox( mWidget->disableHTTPCB, e.mDisableHTTPEntry );
04183 initializeDirmngrCheckbox( mWidget->ignoreLDAPDPCB, e.mIgnoreLDAPDPEntry );
04184 initializeDirmngrCheckbox( mWidget->disableLDAPCB, e.mDisableLDAPEntry );
04185 if ( e.mCustomHTTPProxy ) {
04186 QString systemProxy = QString::fromLocal8Bit( getenv( "http_proxy" ) );
04187 if ( systemProxy.isEmpty() )
04188 systemProxy = i18n( "no proxy" );
04189 mWidget->systemHTTPProxy->setText( i18n( "(Current system setting: %1)" ).arg( systemProxy ) );
04190 bool honor = e.mHonorHTTPProxy && e.mHonorHTTPProxy->boolValue();
04191 mWidget->honorHTTPProxyRB->setChecked( honor );
04192 mWidget->useCustomHTTPProxyRB->setChecked( !honor );
04193 mWidget->customHTTPProxy->setText( e.mCustomHTTPProxy->stringValue() );
04194 } else {
04195 disableDirmngrWidget( mWidget->honorHTTPProxyRB );
04196 disableDirmngrWidget( mWidget->useCustomHTTPProxyRB );
04197 disableDirmngrWidget( mWidget->systemHTTPProxy );
04198 disableDirmngrWidget( mWidget->customHTTPProxy );
04199 }
04200 if ( e.mCustomLDAPProxy )
04201 mWidget->customLDAPProxy->setText( e.mCustomLDAPProxy->stringValue() );
04202 else {
04203 disableDirmngrWidget( mWidget->customLDAPProxy );
04204 disableDirmngrWidget( mWidget->customLDAPLabel );
04205 }
04206 slotUpdateHTTPActions();
04207 }
04208
04209 void SecurityPage::SMimeTab::slotUpdateHTTPActions() {
04210 mWidget->ignoreHTTPDPCB->setEnabled( !mWidget->disableHTTPCB->isChecked() );
04211
04212
04213 bool enableProxySettings = !mWidget->disableHTTPCB->isChecked()
04214 && mWidget->ignoreHTTPDPCB->isChecked();
04215 mWidget->systemHTTPProxy->setEnabled( enableProxySettings );
04216 mWidget->useCustomHTTPProxyRB->setEnabled( enableProxySettings );
04217 mWidget->honorHTTPProxyRB->setEnabled( enableProxySettings );
04218 mWidget->customHTTPProxy->setEnabled( enableProxySettings );
04219 }
04220
04221 void SecurityPage::SMimeTab::installProfile( KConfig * ) {
04222 }
04223
04224 static void saveCheckBoxToKleoEntry( QCheckBox* cb, Kleo::CryptoConfigEntry* entry ) {
04225 const bool b = cb->isChecked();
04226 if ( entry && entry->boolValue() != b )
04227 entry->setBoolValue( b );
04228 }
04229
04230 void SecurityPage::SMimeTab::save() {
04231 if ( !mConfig ) {
04232 return;
04233 }
04234
04235
04236
04237 SMIMECryptoConfigEntries e( mConfig );
04238
04239 bool b = mWidget->OCSPRB->isChecked();
04240 if ( e.mCheckUsingOCSPConfigEntry && e.mCheckUsingOCSPConfigEntry->boolValue() != b )
04241 e.mCheckUsingOCSPConfigEntry->setBoolValue( b );
04242
04243 if ( e.mEnableOCSPsendingConfigEntry && e.mEnableOCSPsendingConfigEntry->boolValue() != b )
04244 e.mEnableOCSPsendingConfigEntry->setBoolValue( b );
04245
04246 saveCheckBoxToKleoEntry( mWidget->doNotCheckCertPolicyCB, e.mDoNotCheckCertPolicyConfigEntry );
04247 saveCheckBoxToKleoEntry( mWidget->neverConsultCB, e.mNeverConsultConfigEntry );
04248 saveCheckBoxToKleoEntry( mWidget->fetchMissingCB, e.mFetchMissingConfigEntry );
04249
04250 QString txt = mWidget->OCSPResponderURL->text();
04251 if ( e.mOCSPResponderURLConfigEntry && e.mOCSPResponderURLConfigEntry->stringValue() != txt )
04252 e.mOCSPResponderURLConfigEntry->setStringValue( txt );
04253
04254 txt = mWidget->OCSPResponderSignature->fingerprint();
04255 if ( e.mOCSPResponderSignature && e.mOCSPResponderSignature->stringValue() != txt ) {
04256 e.mOCSPResponderSignature->setStringValue( txt );
04257 }
04258
04259
04260 saveCheckBoxToKleoEntry( mWidget->ignoreServiceURLCB, e.mIgnoreServiceURLEntry );
04261 saveCheckBoxToKleoEntry( mWidget->ignoreHTTPDPCB, e.mIgnoreHTTPDPEntry );
04262 saveCheckBoxToKleoEntry( mWidget->disableHTTPCB, e.mDisableHTTPEntry );
04263 saveCheckBoxToKleoEntry( mWidget->ignoreLDAPDPCB, e.mIgnoreLDAPDPEntry );
04264 saveCheckBoxToKleoEntry( mWidget->disableLDAPCB, e.mDisableLDAPEntry );
04265 if ( e.mCustomHTTPProxy ) {
04266 const bool honor = mWidget->honorHTTPProxyRB->isChecked();
04267 if ( e.mHonorHTTPProxy && e.mHonorHTTPProxy->boolValue() != honor )
04268 e.mHonorHTTPProxy->setBoolValue( honor );
04269
04270 QString chosenProxy = mWidget->customHTTPProxy->text();
04271 if ( chosenProxy != e.mCustomHTTPProxy->stringValue() )
04272 e.mCustomHTTPProxy->setStringValue( chosenProxy );
04273 }
04274 txt = mWidget->customLDAPProxy->text();
04275 if ( e.mCustomLDAPProxy && e.mCustomLDAPProxy->stringValue() != txt )
04276 e.mCustomLDAPProxy->setStringValue( mWidget->customLDAPProxy->text() );
04277
04278 mConfig->sync( true );
04279 }
04280
04281 bool SecurityPageSMimeTab::process(const QCString &fun, const QByteArray &data, QCString& replyType, QByteArray &replyData)
04282 {
04283 if ( fun == "load()" ) {
04284 replyType = "void";
04285 load();
04286 } else {
04287 return DCOPObject::process( fun, data, replyType, replyData );
04288 }
04289 return true;
04290 }
04291
04292 QCStringList SecurityPageSMimeTab::interfaces()
04293 {
04294 QCStringList ifaces = DCOPObject::interfaces();
04295 ifaces += "SecurityPageSMimeTab";
04296 return ifaces;
04297 }
04298
04299 QCStringList SecurityPageSMimeTab::functions()
04300 {
04301
04302 return DCOPObject::functions();
04303 }
04304
04305 Kleo::CryptoConfigEntry* SMIMECryptoConfigEntries::configEntry( const char* componentName,
04306 const char* groupName,
04307 const char* entryName,
04308 int argType,
04309 bool isList )
04310 {
04311 Kleo::CryptoConfigEntry* entry = mConfig->entry( componentName, groupName, entryName );
04312 if ( !entry ) {
04313 kdWarning(5006) << QString( "Backend error: gpgconf doesn't seem to know the entry for %1/%2/%3" ).arg( componentName, groupName, entryName ) << endl;
04314 return 0;
04315 }
04316 if( entry->argType() != argType || entry->isList() != isList ) {
04317 kdWarning(5006) << QString( "Backend error: gpgconf has wrong type for %1/%2/%3: %4 %5" ).arg( componentName, groupName, entryName ).arg( entry->argType() ).arg( entry->isList() ) << endl;
04318 return 0;
04319 }
04320 return entry;
04321 }
04322
04324
04325 QString SecurityPage::CryptPlugTab::helpAnchor() const {
04326 return QString::fromLatin1("configure-security-crypto-backends");
04327 }
04328
04329 SecurityPageCryptPlugTab::SecurityPageCryptPlugTab( QWidget * parent, const char * name )
04330 : ConfigModuleTab( parent, name )
04331 {
04332 QVBoxLayout * vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
04333
04334 mBackendConfig = Kleo::CryptoBackendFactory::instance()->configWidget( this, "mBackendConfig" );
04335 connect( mBackendConfig, SIGNAL( changed( bool ) ), this, SIGNAL( changed( bool ) ) );
04336
04337 vlay->addWidget( mBackendConfig );
04338 }
04339
04340 SecurityPageCryptPlugTab::~SecurityPageCryptPlugTab()
04341 {
04342
04343 }
04344
04345 void SecurityPage::CryptPlugTab::doLoadOther() {
04346 mBackendConfig->load();
04347 }
04348
04349 void SecurityPage::CryptPlugTab::save() {
04350 mBackendConfig->save();
04351 }
04352
04353
04354
04355
04356
04357
04358 QString MiscPage::helpAnchor() const {
04359 return QString::fromLatin1("configure-misc");
04360 }
04361
04362 MiscPage::MiscPage( QWidget * parent, const char * name )
04363 : ConfigModuleWithTabs( parent, name )
04364 {
04365 mFolderTab = new FolderTab();
04366 addTab( mFolderTab, i18n("&Folders") );
04367
04368 mGroupwareTab = new GroupwareTab();
04369 addTab( mGroupwareTab, i18n("&Groupware") );
04370 load();
04371 }
04372
04373 QString MiscPage::FolderTab::helpAnchor() const {
04374 return QString::fromLatin1("configure-misc-folders");
04375 }
04376
04377 MiscPageFolderTab::MiscPageFolderTab( QWidget * parent, const char * name )
04378 : ConfigModuleTab( parent, name )
04379 {
04380
04381 QVBoxLayout *vlay;
04382 QHBoxLayout *hlay;
04383 QLabel *label;
04384
04385 vlay = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
04386
04387
04388 mEmptyFolderConfirmCheck =
04389 new QCheckBox( i18n("Corresponds to Folder->Move All Messages to Trash",
04390 "Ask for co&nfirmation before moving all messages to "
04391 "trash"),
04392 this );
04393 vlay->addWidget( mEmptyFolderConfirmCheck );
04394 connect( mEmptyFolderConfirmCheck, SIGNAL( stateChanged( int ) ),
04395 this, SLOT( slotEmitChanged( void ) ) );
04396 mExcludeImportantFromExpiry =
04397 new QCheckBox( i18n("E&xclude important messages from expiry"), this );
04398 vlay->addWidget( mExcludeImportantFromExpiry );
04399 connect( mExcludeImportantFromExpiry, SIGNAL( stateChanged( int ) ),
04400 this, SLOT( slotEmitChanged( void ) ) );
04401
04402
04403 hlay = new QHBoxLayout( vlay );
04404 mLoopOnGotoUnread = new QComboBox( false, this );
04405 label = new QLabel( mLoopOnGotoUnread,
04406 i18n("to be continued with \"do not loop\", \"loop in current folder\", "
04407 "and \"loop in all folders\".",
04408 "When trying to find unread messages:"), this );
04409 mLoopOnGotoUnread->insertStringList( QStringList()
04410 << i18n("continuation of \"When trying to find unread messages:\"",
04411 "Do not Loop")
04412 << i18n("continuation of \"When trying to find unread messages:\"",
04413 "Loop in Current Folder")
04414 << i18n("continuation of \"When trying to find unread messages:\"",
04415 "Loop in All Folders"));
04416 hlay->addWidget( label );
04417 hlay->addWidget( mLoopOnGotoUnread, 1 );
04418 connect( mLoopOnGotoUnread, SIGNAL( activated( int ) ),
04419 this, SLOT( slotEmitChanged( void ) ) );
04420
04421
04422 hlay = new QHBoxLayout( vlay );
04423 mActionEnterFolder = new QComboBox( false, this );
04424 label = new QLabel( mActionEnterFolder,
04425 i18n("to be continued with \"jump to first new message\", "
04426 "\"jump to first unread or new message\","
04427 "and \"jump to last selected message\".",
04428 "When entering a folder:"), this );
04429 mActionEnterFolder->insertStringList( QStringList()
04430 << i18n("continuation of \"When entering a folder:\"",
04431 "Jump to First New Message")
04432 << i18n("continuation of \"When entering a folder:\"",
04433 "Jump to First Unread or New Message")
04434 << i18n("continuation of \"When entering a folder:\"",
04435 "Jump to Last Selected Message"));
04436 hlay->addWidget( label );
04437 hlay->addWidget( mActionEnterFolder, 1 );
04438 connect( mActionEnterFolder, SIGNAL( activated( int ) ),
04439 this, SLOT( slotEmitChanged( void ) ) );
04440
04441 hlay = new QHBoxLayout( vlay );
04442 mDelayedMarkAsRead = new QCheckBox( i18n("Mar&k selected message as read after"), this );
04443 hlay->addWidget( mDelayedMarkAsRead );
04444 mDelayedMarkTime = new KIntSpinBox( 0 , 60 , 1,
04445 0 , 10 , this);
04446 mDelayedMarkTime->setSuffix( i18n(" sec") );
04447 mDelayedMarkTime->setEnabled( false );
04448 hlay->addWidget( mDelayedMarkTime );
04449 hlay->addStretch( 1 );
04450 connect( mDelayedMarkTime, SIGNAL( valueChanged( int ) ),
04451 this, SLOT( slotEmitChanged( void ) ) );
04452 connect( mDelayedMarkAsRead, SIGNAL(toggled(bool)),
04453 mDelayedMarkTime, SLOT(setEnabled(bool)));
04454 connect( mDelayedMarkAsRead, SIGNAL(toggled(bool)),
04455 this , SLOT(slotEmitChanged( void )));
04456
04457
04458 mShowPopupAfterDnD =
04459 new QCheckBox( i18n("Ask for action after &dragging messages to another folder"), this );
04460 vlay->addWidget( mShowPopupAfterDnD );
04461 connect( mShowPopupAfterDnD, SIGNAL( stateChanged( int ) ),
04462 this, SLOT( slotEmitChanged( void ) ) );
04463
04464
04465 hlay = new QHBoxLayout( vlay );
04466 mMailboxPrefCombo = new QComboBox( false, this );
04467 label = new QLabel( mMailboxPrefCombo,
04468 i18n("to be continued with \"flat files\" and "
04469 "\"directories\", resp.",
04470 "By default, &message folders on disk are:"), this );
04471 mMailboxPrefCombo->insertStringList( QStringList()
04472 << i18n("continuation of \"By default, &message folders on disk are\"",
04473 "Flat Files (\"mbox\" format)")
04474 << i18n("continuation of \"By default, &message folders on disk are\"",
04475 "Directories (\"maildir\" format)") );
04476 hlay->addWidget( label );
04477 hlay->addWidget( mMailboxPrefCombo, 1 );
04478 connect( mMailboxPrefCombo, SIGNAL( activated( int ) ),
04479 this, SLOT( slotEmitChanged( void ) ) );
04480
04481
04482 hlay = new QHBoxLayout( vlay );
04483 mOnStartupOpenFolder = new FolderRequester( this,
04484 kmkernel->getKMMainWidget()->folderTree() );
04485 label = new QLabel( mOnStartupOpenFolder,
04486 i18n("Open this folder on startup:"), this );
04487 hlay->addWidget( label );
04488 hlay->addWidget( mOnStartupOpenFolder, 1 );
04489 connect( mOnStartupOpenFolder, SIGNAL( folderChanged( KMFolder* ) ),
04490 this, SLOT( slotEmitChanged( void ) ) );
04491
04492
04493 hlay = new QHBoxLayout( vlay );
04494 mEmptyTrashCheck = new QCheckBox( i18n("Empty local &trash folder on program exit"),
04495 this );
04496 hlay->addWidget( mEmptyTrashCheck );
04497 connect( mEmptyTrashCheck, SIGNAL( stateChanged( int ) ),
04498 this, SLOT( slotEmitChanged( void ) ) );
04499
04500 #ifdef HAVE_INDEXLIB
04501
04502 mIndexingEnabled = new QCheckBox( i18n("Enable full text &indexing"), this );
04503 vlay->addWidget( mIndexingEnabled );
04504 connect( mIndexingEnabled, SIGNAL( stateChanged( int ) ),
04505 this, SLOT( slotEmitChanged( void ) ) );
04506 #endif
04507
04508
04509 hlay = new QHBoxLayout( vlay );
04510 mQuotaCmbBox = new QComboBox( false, this );
04511 label = new QLabel( mQuotaCmbBox,
04512 i18n("Quota Units: "), this );
04513 mQuotaCmbBox->insertStringList( QStringList()
04514 << i18n("KB")
04515 << i18n("MB")
04516 << i18n("GB") );
04517 hlay->addWidget( label );
04518 hlay->addWidget( mQuotaCmbBox, 1 );
04519 connect( mQuotaCmbBox, SIGNAL( activated( int ) ), this, SLOT( slotEmitChanged( void ) ) );
04520
04521 vlay->addStretch( 1 );
04522
04523
04524 QString msg = i18n( "what's this help",
04525 "<qt><p>This selects which mailbox format will be "
04526 "the default for local folders:</p>"
04527 "<p><b>mbox:</b> KMail's mail "
04528 "folders are represented by a single file each. "
04529 "Individual messages are separated from each other by a "
04530 "line starting with \"From \". This saves space on "
04531 "disk, but may be less robust, e.g. when moving messages "
04532 "between folders.</p>"
04533 "<p><b>maildir:</b> KMail's mail folders are "
04534 "represented by real folders on disk. Individual messages "
04535 "are separate files. This may waste a bit of space on "
04536 "disk, but should be more robust, e.g. when moving "
04537 "messages between folders.</p></qt>");
04538 QWhatsThis::add( mMailboxPrefCombo, msg );
04539 QWhatsThis::add( label, msg );
04540
04541 msg = i18n( "what's this help",
04542 "<qt><p>When jumping to the next unread message, it may occur "
04543 "that no more unread messages are below the current message.</p>"
04544 "<p><b>Do not loop:</b> The search will stop at the last message in "
04545 "the current folder.</p>"
04546 "<p><b>Loop in current folder:</b> The search will continue at the "
04547 "top of the message list, but not go to another folder.</p>"
04548 "<p><b>Loop in all folders:</b> The search will continue at the top of "
04549 "the message list. If no unread messages are found it will then continue "
04550 "to the next folder.</p>"
04551 "<p>Similarly, when searching for the previous unread message, "
04552 "the search will start from the bottom of the message list and continue to "
04553 "the previous folder depending on which option is selected.</p></qt>" );
04554 QWhatsThis::add( mLoopOnGotoUnread, msg );
04555
04556 #ifdef HAVE_INDEXLIB
04557
04558 msg = i18n( "what's this help",
04559 "<qt><p>Full text indexing allows very fast searches on the content "
04560 "of your messages. When enabled, the search dialog will work very fast. "
04561 "Also, the search tool bar will select messages based on content.</p>"
04562 "<p>It takes up a certain amount of disk space "
04563 "(about half the disk space for the messages).</p>"
04564 "<p>After enabling, the index will need to be built, but you can continue to use KMail "
04565 "while this operation is running.</p>"
04566 "</qt>"
04567 );
04568
04569 QWhatsThis::add( mIndexingEnabled, msg );
04570 #endif
04571 }
04572
04573 void MiscPage::FolderTab::doLoadFromGlobalSettings() {
04574 mExcludeImportantFromExpiry->setChecked( GlobalSettings::self()->excludeImportantMailFromExpiry() );
04575
04576 mLoopOnGotoUnread->setCurrentItem( GlobalSettings::self()->loopOnGotoUnread() );
04577 mActionEnterFolder->setCurrentItem( GlobalSettings::self()->actionEnterFolder() );
04578 mDelayedMarkAsRead->setChecked( GlobalSettings::self()->delayedMarkAsRead() );
04579 mDelayedMarkTime->setValue( GlobalSettings::self()->delayedMarkTime() );
04580 mShowPopupAfterDnD->setChecked( GlobalSettings::self()->showPopupAfterDnD() );
04581 mQuotaCmbBox->setCurrentItem( GlobalSettings::self()->quotaUnit() );
04582 }
04583
04584 void MiscPage::FolderTab::doLoadOther() {
04585 KConfigGroup general( KMKernel::config(), "General" );
04586
04587 mEmptyTrashCheck->setChecked( general.readBoolEntry( "empty-trash-on-exit", false ) );
04588 mOnStartupOpenFolder->setFolder( general.readEntry( "startupFolder",
04589 kmkernel->inboxFolder()->idString() ) );
04590 mEmptyFolderConfirmCheck->setChecked( general.readBoolEntry( "confirm-before-empty", true ) );
04591
04592 int num = general.readNumEntry("default-mailbox-format", 1 );
04593 if ( num < 0 || num > 1 ) num = 1;
04594 mMailboxPrefCombo->setCurrentItem( num );
04595
04596 #ifdef HAVE_INDEXLIB
04597 mIndexingEnabled->setChecked( kmkernel->msgIndex() && kmkernel->msgIndex()->isEnabled() );
04598 #endif
04599 }
04600
04601 void MiscPage::FolderTab::save() {
04602 KConfigGroup general( KMKernel::config(), "General" );
04603
04604 general.writeEntry( "empty-trash-on-exit", mEmptyTrashCheck->isChecked() );
04605 general.writeEntry( "confirm-before-empty", mEmptyFolderConfirmCheck->isChecked() );
04606 general.writeEntry( "default-mailbox-format", mMailboxPrefCombo->currentItem() );
04607 general.writeEntry( "startupFolder", mOnStartupOpenFolder->folder() ?
04608 mOnStartupOpenFolder->folder()->idString() : QString::null );
04609
04610 GlobalSettings::self()->setDelayedMarkAsRead( mDelayedMarkAsRead->isChecked() );
04611 GlobalSettings::self()->setDelayedMarkTime( mDelayedMarkTime->value() );
04612 GlobalSettings::self()->setActionEnterFolder( mActionEnterFolder->currentItem() );
04613 GlobalSettings::self()->setLoopOnGotoUnread( mLoopOnGotoUnread->currentItem() );
04614 GlobalSettings::self()->setShowPopupAfterDnD( mShowPopupAfterDnD->isChecked() );
04615 GlobalSettings::self()->setExcludeImportantMailFromExpiry(
04616 mExcludeImportantFromExpiry->isChecked() );
04617 GlobalSettings::self()->setQuotaUnit( mQuotaCmbBox->currentItem() );
04618 #ifdef HAVE_INDEXLIB
04619 if ( kmkernel->msgIndex() ) kmkernel->msgIndex()->setEnabled( mIndexingEnabled->isChecked() );
04620 #endif
04621 }
04622
04623 QString MiscPage::GroupwareTab::helpAnchor() const {
04624 return QString::fromLatin1("configure-misc-groupware");
04625 }
04626
04627 MiscPageGroupwareTab::MiscPageGroupwareTab( QWidget* parent, const char* name )
04628 : ConfigModuleTab( parent, name )
04629 {
04630 QBoxLayout* vlay = new QVBoxLayout( this, KDialog::marginHint(),
04631 KDialog::spacingHint() );
04632 vlay->setAutoAdd( true );
04633
04634
04635 QVGroupBox* b1 = new QVGroupBox( i18n("&IMAP Resource Folder Options"),
04636 this );
04637
04638 mEnableImapResCB =
04639 new QCheckBox( i18n("&Enable IMAP resource functionality"), b1 );
04640 QToolTip::add( mEnableImapResCB, i18n( "This enables the IMAP storage for "
04641 "the Kontact applications" ) );
04642 QWhatsThis::add( mEnableImapResCB,
04643 i18n( GlobalSettings::self()->theIMAPResourceEnabledItem()->whatsThis().utf8() ) );
04644 connect( mEnableImapResCB, SIGNAL( stateChanged( int ) ),
04645 this, SLOT( slotEmitChanged( void ) ) );
04646
04647 mBox = new QWidget( b1 );
04648 QGridLayout* grid = new QGridLayout( mBox, 4, 2, 0, KDialog::spacingHint() );
04649 grid->setColStretch( 1, 1 );
04650 connect( mEnableImapResCB, SIGNAL( toggled(bool) ),
04651 mBox, SLOT( setEnabled(bool) ) );
04652
04653 QLabel* storageFormatLA = new QLabel( i18n("&Format used for the groupware folders:"),
04654 mBox );
04655 QString toolTip = i18n( "Choose the format to use to store the contents of the groupware folders." );
04656 QString whatsThis = i18n( GlobalSettings::self()
04657 ->theIMAPResourceStorageFormatItem()->whatsThis().utf8() );
04658 grid->addWidget( storageFormatLA, 0, 0 );
04659 QToolTip::add( storageFormatLA, toolTip );
04660 QWhatsThis::add( storageFormatLA, whatsThis );
04661 mStorageFormatCombo = new QComboBox( false, mBox );
04662 storageFormatLA->setBuddy( mStorageFormatCombo );
04663 QStringList formatLst;
04664 formatLst << i18n("Standard (Ical / Vcard)") << i18n("Kolab (XML)");
04665 mStorageFormatCombo->insertStringList( formatLst );
04666 grid->addWidget( mStorageFormatCombo, 0, 1 );
04667 QToolTip::add( mStorageFormatCombo, toolTip );
04668 QWhatsThis::add( mStorageFormatCombo, whatsThis );
04669 connect( mStorageFormatCombo, SIGNAL( activated( int ) ),
04670 this, SLOT( slotStorageFormatChanged( int ) ) );
04671
04672 QLabel* languageLA = new QLabel( i18n("&Language of the groupware folders:"),
04673 mBox );
04674
04675 toolTip = i18n( "Set the language of the folder names" );
04676 whatsThis = i18n( GlobalSettings::self()
04677 ->theIMAPResourceFolderLanguageItem()->whatsThis().utf8() );
04678 grid->addWidget( languageLA, 1, 0 );
04679 QToolTip::add( languageLA, toolTip );
04680 QWhatsThis::add( languageLA, whatsThis );
04681 mLanguageCombo = new QComboBox( false, mBox );
04682 languageLA->setBuddy( mLanguageCombo );
04683 QStringList lst;
04684 lst << i18n("English") << i18n("German") << i18n("French") << i18n("Dutch");
04685 mLanguageCombo->insertStringList( lst );
04686 grid->addWidget( mLanguageCombo, 1, 1 );
04687 QToolTip::add( mLanguageCombo, toolTip );
04688 QWhatsThis::add( mLanguageCombo, whatsThis );
04689 connect( mLanguageCombo, SIGNAL( activated( int ) ),
04690 this, SLOT( slotEmitChanged( void ) ) );
04691
04692 mFolderComboLabel = new QLabel( mBox );
04693 toolTip = i18n( "Set the parent of the resource folders" );
04694 whatsThis = i18n( GlobalSettings::self()->theIMAPResourceFolderParentItem()->whatsThis().utf8() );
04695 QToolTip::add( mFolderComboLabel, toolTip );
04696 QWhatsThis::add( mFolderComboLabel, whatsThis );
04697 grid->addWidget( mFolderComboLabel, 2, 0 );
04698
04699 mFolderComboStack = new QWidgetStack( mBox );
04700 grid->addWidget( mFolderComboStack, 2, 1 );
04701
04702
04703
04704 mFolderCombo = new FolderRequester( mBox,
04705 kmkernel->getKMMainWidget()->folderTree() );
04706 mFolderComboStack->addWidget( mFolderCombo, 0 );
04707 QToolTip::add( mFolderCombo, toolTip );
04708 QWhatsThis::add( mFolderCombo, whatsThis );
04709 connect( mFolderCombo, SIGNAL( folderChanged( KMFolder* ) ),
04710 this, SLOT( slotEmitChanged() ) );
04711
04712
04713
04714
04715 mAccountCombo = new KMail::AccountComboBox( mBox );
04716 mFolderComboStack->addWidget( mAccountCombo, 1 );
04717 QToolTip::add( mAccountCombo, toolTip );
04718 QWhatsThis::add( mAccountCombo, whatsThis );
04719 connect( mAccountCombo, SIGNAL( activated( int ) ),
04720 this, SLOT( slotEmitChanged() ) );
04721
04722 mHideGroupwareFolders = new QCheckBox( i18n( "&Hide groupware folders" ),
04723 mBox, "HideGroupwareFoldersBox" );
04724 grid->addMultiCellWidget( mHideGroupwareFolders, 3, 3, 0, 1 );
04725 QToolTip::add( mHideGroupwareFolders,
04726 i18n( "When this is checked, you will not see the IMAP "
04727 "resource folders in the folder tree." ) );
04728 QWhatsThis::add( mHideGroupwareFolders, i18n( GlobalSettings::self()
04729 ->hideGroupwareFoldersItem()->whatsThis().utf8() ) );
04730 connect( mHideGroupwareFolders, SIGNAL( toggled( bool ) ),
04731 this, SLOT( slotEmitChanged() ) );
04732
04733
04734 b1 = new QVGroupBox( i18n("Groupware Compatibility && Legacy Options"), this );
04735
04736 gBox = new QVBox( b1 );
04737 #if 0
04738
04739 mEnableGwCB = new QCheckBox( i18n("&Enable groupware functionality"), b1 );
04740 gBox->setSpacing( KDialog::spacingHint() );
04741 connect( mEnableGwCB, SIGNAL( toggled(bool) ),
04742 gBox, SLOT( setEnabled(bool) ) );
04743 connect( mEnableGwCB, SIGNAL( stateChanged( int ) ),
04744 this, SLOT( slotEmitChanged( void ) ) );
04745 #endif
04746 mEnableGwCB = 0;
04747 mLegacyMangleFromTo = new QCheckBox( i18n( "Mangle From:/To: headers in replies to invitations" ), gBox );
04748 QToolTip::add( mLegacyMangleFromTo, i18n( "Turn this option on in order to make Outlook(tm) understand your answers to invitation replies" ) );
04749 QWhatsThis::add( mLegacyMangleFromTo, i18n( GlobalSettings::self()->
04750 legacyMangleFromToHeadersItem()->whatsThis().utf8() ) );
04751 connect( mLegacyMangleFromTo, SIGNAL( stateChanged( int ) ),
04752 this, SLOT( slotEmitChanged( void ) ) );
04753 mLegacyBodyInvites = new QCheckBox( i18n( "Send invitations in the mail body" ), gBox );
04754 QToolTip::add( mLegacyBodyInvites, i18n( "Turn this option on in order to make Outlook(tm) understand your answers to invitations" ) );
04755 QWhatsThis::add( mLegacyMangleFromTo, i18n( GlobalSettings::self()->
04756 legacyBodyInvitesItem()->whatsThis().utf8() ) );
04757 connect( mLegacyBodyInvites, SIGNAL( toggled( bool ) ),
04758 this, SLOT( slotLegacyBodyInvitesToggled( bool ) ) );
04759 connect( mLegacyBodyInvites, SIGNAL( stateChanged( int ) ),
04760 this, SLOT( slotEmitChanged( void ) ) );
04761 mAutomaticSending = new QCheckBox( i18n( "Automatic invitation sending" ), gBox );
04762 QToolTip::add( mAutomaticSending, i18n( "When this is on, the user will not see the mail composer window. Invitation mails are sent automatically" ) );
04763 QWhatsThis::add( mAutomaticSending, i18n( GlobalSettings::self()->
04764 automaticSendingItem()->whatsThis().utf8() ) );
04765 connect( mAutomaticSending, SIGNAL( stateChanged( int ) ),
04766 this, SLOT( slotEmitChanged( void ) ) );
04767
04768
04769 new QLabel( this );
04770 }
04771
04772 void MiscPageGroupwareTab::slotLegacyBodyInvitesToggled( bool on )
04773 {
04774 if ( on ) {
04775 QString txt = i18n( "<qt>Invitations are normally sent as attachments to "
04776 "a mail. This switch changes the invitation mails to "
04777 "be sent in the text of the mail instead; this is "
04778 "necessary to send invitations and replies to "
04779 "Microsoft Outlook.<br>But, when you do this, you no "
04780 "longer get descriptive text that mail programs "
04781 "can read; so, to people who have email programs "
04782 "that do not understand the invitations, the "
04783 "resulting messages look very odd.<br>People that have email "
04784 "programs that do understand invitations will still "
04785 "be able to work with this.</qt>" );
04786 KMessageBox::information( this, txt, QString::null,
04787 "LegacyBodyInvitesWarning" );
04788 }
04789
04790
04791 mAutomaticSending->setEnabled( !mLegacyBodyInvites->isChecked() );
04792 }
04793
04794 void MiscPage::GroupwareTab::doLoadFromGlobalSettings() {
04795
04796 if ( mEnableGwCB ) {
04797 mEnableGwCB->setChecked( GlobalSettings::self()->groupwareEnabled() );
04798 gBox->setEnabled( mEnableGwCB->isChecked() );
04799 }
04800 mLegacyMangleFromTo->setChecked( GlobalSettings::self()->legacyMangleFromToHeaders() );
04801 mLegacyBodyInvites->blockSignals( true );
04802 mLegacyBodyInvites->setChecked( GlobalSettings::self()->legacyBodyInvites() );
04803 mLegacyBodyInvites->blockSignals( false );
04804 mAutomaticSending->setChecked( GlobalSettings::self()->automaticSending() );
04805 mAutomaticSending->setEnabled( !mLegacyBodyInvites->isChecked() );
04806
04807
04808 mEnableImapResCB->setChecked( GlobalSettings::self()->theIMAPResourceEnabled() );
04809 mBox->setEnabled( mEnableImapResCB->isChecked() );
04810
04811 mHideGroupwareFolders->setChecked( GlobalSettings::self()->hideGroupwareFolders() );
04812 int i = GlobalSettings::self()->theIMAPResourceFolderLanguage();
04813 mLanguageCombo->setCurrentItem(i);
04814 i = GlobalSettings::self()->theIMAPResourceStorageFormat();
04815 mStorageFormatCombo->setCurrentItem(i);
04816 slotStorageFormatChanged( i );
04817
04818 QString folderId( GlobalSettings::self()->theIMAPResourceFolderParent() );
04819 if( !folderId.isNull() && kmkernel->findFolderById( folderId ) ) {
04820 mFolderCombo->setFolder( folderId );
04821 } else {
04822
04823 mFolderCombo->setFolder( i18n( "<Choose a Folder>" ) );
04824 }
04825
04826 KMAccount* selectedAccount = 0;
04827 int accountId = GlobalSettings::self()->theIMAPResourceAccount();
04828 if ( accountId )
04829 selectedAccount = kmkernel->acctMgr()->find( accountId );
04830 else {
04831
04832 for( KMAccount *a = kmkernel->acctMgr()->first(); a!=0;
04833 a = kmkernel->acctMgr()->next() ) {
04834 if( a->folder() && a->folder()->child() ) {
04835
04836 KMFolderNode *node;
04837 for (node = a->folder()->child()->first(); node; node = a->folder()->child()->next())
04838 if (!node->isDir() && node->name() == "INBOX") break;
04839
04840 if ( node && static_cast<KMFolder*>(node)->idString() == folderId ) {
04841 selectedAccount = a;
04842 break;
04843 }
04844 }
04845 }
04846 }
04847 if ( selectedAccount )
04848 mAccountCombo->setCurrentAccount( selectedAccount );
04849 else if ( GlobalSettings::self()->theIMAPResourceStorageFormat() == 1 )
04850 kdDebug(5006) << "Folder " << folderId << " not found as an account's inbox" << endl;
04851 }
04852
04853 void MiscPage::GroupwareTab::save() {
04854
04855 if ( mEnableGwCB )
04856 GlobalSettings::self()->setGroupwareEnabled( mEnableGwCB->isChecked() );
04857 GlobalSettings::self()->setLegacyMangleFromToHeaders( mLegacyMangleFromTo->isChecked() );
04858 GlobalSettings::self()->setLegacyBodyInvites( mLegacyBodyInvites->isChecked() );
04859 GlobalSettings::self()->setAutomaticSending( mAutomaticSending->isChecked() );
04860
04861 int format = mStorageFormatCombo->currentItem();
04862 GlobalSettings::self()->setTheIMAPResourceStorageFormat( format );
04863
04864
04865 GlobalSettings::self()->setHideGroupwareFolders( mHideGroupwareFolders->isChecked() );
04866
04867
04868
04869 QString folderId;
04870 if ( format == 0 ) {
04871 KMFolder* folder = mFolderCombo->folder();
04872 if ( folder )
04873 folderId = folder->idString();
04874 } else {
04875
04876 KMAccount* acct = mAccountCombo->currentAccount();
04877 if ( acct ) {
04878 folderId = QString( ".%1.directory/INBOX" ).arg( acct->id() );
04879 GlobalSettings::self()->setTheIMAPResourceAccount( acct->id() );
04880 }
04881 }
04882
04883 bool enabled = mEnableImapResCB->isChecked() && !folderId.isEmpty();
04884 GlobalSettings::self()->setTheIMAPResourceEnabled( enabled );
04885 GlobalSettings::self()->setTheIMAPResourceFolderLanguage( mLanguageCombo->currentItem() );
04886 GlobalSettings::self()->setTheIMAPResourceFolderParent( folderId );
04887 }
04888
04889 void MiscPage::GroupwareTab::slotStorageFormatChanged( int format )
04890 {
04891 mLanguageCombo->setEnabled( format == 0 );
04892 mFolderComboStack->raiseWidget( format );
04893 if ( format == 0 ) {
04894 mFolderComboLabel->setText( i18n("&Resource folders are subfolders of:") );
04895 mFolderComboLabel->setBuddy( mFolderCombo );
04896 } else {
04897 mFolderComboLabel->setText( i18n("&Resource folders are in account:") );
04898 mFolderComboLabel->setBuddy( mAccountCombo );
04899 }
04900 slotEmitChanged();
04901 }
04902
04903
04904
04905
04906
04907
04908
04909 AccountUpdater::AccountUpdater(ImapAccountBase *account)
04910 : QObject()
04911 {
04912 mAccount = account;
04913 }
04914
04915 void AccountUpdater::update()
04916 {
04917 connect( mAccount, SIGNAL( connectionResult(int, const QString&) ),
04918 this, SLOT( namespacesFetched() ) );
04919 mAccount->makeConnection();
04920 }
04921
04922 void AccountUpdater::namespacesFetched()
04923 {
04924 mAccount->setCheckingMail( true );
04925 mAccount->processNewMail( false );
04926 deleteLater();
04927 }
04928
04929 #undef DIM
04930
04931
04932 #include "configuredialog.moc"