kmail

kmfolderdia.cpp

00001 // -*- mode: C++; c-file-style: "gnu" -*-
00033 #include <config.h>
00034 
00035 #include "kmfolderdia.h"
00036 #include "kmacctfolder.h"
00037 #include "kmfoldermgr.h"
00038 #include <libkpimidentities/identitycombo.h>
00039 #include "kmfolderimap.h"
00040 #include "kmfoldercachedimap.h"
00041 #include "kmfolder.h"
00042 #include "kmheaders.h"
00043 #include "kmcommands.h"
00044 #include "kmfoldertree.h"
00045 #include "folderdiaacltab.h"
00046 #include "folderdiaquotatab.h"
00047 #include "kmailicalifaceimpl.h"
00048 #include "globalsettings.h"
00049 #include "folderrequester.h"
00050 
00051 #include <keditlistbox.h>
00052 #include <klineedit.h>
00053 #include <klocale.h>
00054 #include <knuminput.h>
00055 #include <kmessagebox.h>
00056 #include <kicondialog.h>
00057 #include <kconfig.h>
00058 #include <kdebug.h>
00059 #include <klistview.h>
00060 #include <kpushbutton.h>
00061 
00062 #include <qcheckbox.h>
00063 #include <qlayout.h>
00064 #include <qgroupbox.h>
00065 #include <qregexp.h>
00066 #include <qlabel.h>
00067 #include <qvbox.h>
00068 #include <qtooltip.h>
00069 #include <qwhatsthis.h>
00070 
00071 #include <assert.h>
00072 #include <qhbuttongroup.h>
00073 #include <qradiobutton.h>
00074 #include <qtextedit.h>
00075 
00076 #include "templatesconfiguration.h"
00077 #include "templatesconfiguration_kfg.h"
00078 
00079 #include "kmfolderdia.moc"
00080 
00081 using namespace KMail;
00082 
00083 static QString inCaseWeDecideToRenameTheTab( I18N_NOOP( "Permissions (ACL)" ) );
00084 
00085 //-----------------------------------------------------------------------------
00086 KMFolderDialog::KMFolderDialog(KMFolder *aFolder, KMFolderDir *aFolderDir,
00087                    KMFolderTree* aParent, const QString& aCap,
00088                    const QString& aName):
00089   KDialogBase( KDialogBase::Tabbed,
00090                aCap, KDialogBase::Ok|KDialogBase::Cancel,
00091                KDialogBase::Ok, aParent, "KMFolderDialog", TRUE ),
00092   mFolder( aFolder ),
00093   mFolderDir( aFolderDir ),
00094   mParentFolder( 0 ),
00095   mIsNewFolder( aFolder == 0 ),
00096   mFolderTree( aParent )
00097 {
00098   kdDebug(5006)<<"KMFolderDialog::KMFolderDialog()" << endl;
00099 
00100   QStringList folderNames;
00101   QValueList<QGuardedPtr<KMFolder> > folders;
00102   // get all folders but search and folders that can not have children
00103   aParent->createFolderList(&folderNames, &folders, true, true,
00104                             true, false, true, false);
00105 
00106   if( mFolderDir ) {
00107     // search the parent folder of the folder
00108     FolderList::ConstIterator it;
00109     int i = 1;
00110     for( it = folders.begin(); it != folders.end(); ++it, ++i ) {
00111       if( (*it)->child() == mFolderDir ) {
00112         mParentFolder = *it;
00113         break;
00114       }
00115     }
00116   }
00117 
00118   FolderDiaTab* tab;
00119   QVBox* box;
00120 
00121   box = addVBoxPage( i18n("General") );
00122   tab = new FolderDiaGeneralTab( this, aName, box );
00123   addTab( tab );
00124   box = addVBoxPage( i18n("Templates") );
00125   tab = new FolderDiaTemplatesTab( this, box );
00126   addTab( tab );
00127 
00128   KMFolder* refFolder = mFolder ? mFolder : mParentFolder;
00129   KMFolderType folderType = refFolder ? refFolder->folderType() : KMFolderTypeUnknown;
00130   bool noContent = mFolder ? mFolder->storage()->noContent() : false;
00131   if ( !noContent && refFolder && ( folderType == KMFolderTypeImap || folderType == KMFolderTypeCachedImap ) ) {
00132     if ( FolderDiaACLTab::supports( refFolder ) ) {
00133       box = addVBoxPage( i18n("Access Control") );
00134       tab = new FolderDiaACLTab( this, box );
00135       addTab( tab );
00136     }
00137   }
00138   if ( !noContent && refFolder && ( folderType == KMFolderTypeImap || folderType == KMFolderTypeCachedImap ) ) {
00139     if ( FolderDiaQuotaTab::supports( refFolder ) ) {
00140       box = addVBoxPage( i18n("Quota") );
00141       tab = new FolderDiaQuotaTab( this, box );
00142       addTab( tab );
00143     }
00144   }
00145 
00146   for ( unsigned int i = 0 ; i < mTabs.count() ; ++i )
00147     mTabs[i]->load();
00148 }
00149 
00150 void KMFolderDialog::addTab( FolderDiaTab* tab )
00151 {
00152   connect( tab, SIGNAL( readyForAccept() ),
00153            this, SLOT( slotReadyForAccept() ) );
00154   connect( tab, SIGNAL( cancelAccept() ),
00155            this, SLOT( slotCancelAccept() ) );
00156   //connect( tab, SIGNAL(changed( bool )),
00157   //         this, SLOT(slotChanged( bool )) );
00158   mTabs.append( tab );
00159 }
00160 
00161 // Not used yet (no button), but ready to be used :)
00162 void KMFolderDialog::slotApply()
00163 {
00164   if ( mFolder.isNull() && !mIsNewFolder ) { // deleted meanwhile?
00165     KDialogBase::slotApply();
00166     return;
00167   }
00168   for ( unsigned int i = 0 ; i < mTabs.count() ; ++i )
00169     mTabs[i]->save();
00170   if ( !mFolder.isNull() && mIsNewFolder ) // we just created it
00171     mIsNewFolder = false; // so it's not new anymore :)
00172   KDialogBase::slotApply();
00173 }
00174 
00175 // Called when pressing Ok
00176 // We want to apply the changes first (which is async), before closing the dialog,
00177 // in case of errors during the upload.
00178 void KMFolderDialog::slotOk()
00179 {
00180   if ( mFolder.isNull() && !mIsNewFolder ) { // deleted meanwhile?
00181     KDialogBase::slotOk();
00182     return;
00183   }
00184 
00185   mDelayedSavingTabs = 0; // number of tabs which need delayed saving
00186   for ( unsigned int i = 0 ; i < mTabs.count() ; ++i ) {
00187     FolderDiaTab::AcceptStatus s = mTabs[i]->accept();
00188     if ( s == FolderDiaTab::Canceled ) {
00189       slotCancelAccept();
00190       return;
00191     }
00192     else if ( s == FolderDiaTab::Delayed )
00193       ++mDelayedSavingTabs;
00194   }
00195 
00196   if ( mDelayedSavingTabs )
00197     enableButtonOK( false );
00198   else
00199     KDialogBase::slotOk();
00200 }
00201 
00202 void KMFolderDialog::slotReadyForAccept()
00203 {
00204   --mDelayedSavingTabs;
00205   if ( mDelayedSavingTabs == 0 )
00206     KDialogBase::slotOk();
00207 }
00208 
00209 void KMFolderDialog::slotCancelAccept()
00210 {
00211   mDelayedSavingTabs = -1;
00212   enableButtonOK( true );
00213   // Don't try to create it twice
00214   if ( !mFolder.isNull() )
00215     mIsNewFolder = false;
00216 
00217   // Other tabs might call slotReadyForAccept. -1 ensures that it won't close the dialog,
00218   // but the OK button being enabled means that people might succeed in running
00219   // the same job from save more than once.
00220   // Solution: mAcceptCanceled = true instead of -1.
00221   // Bah for now we only have one tab which can delay saving -> later.
00222 }
00223 
00224 void KMFolderDialog::slotChanged( bool )
00225 {
00226   // TODO, support for 'changed', and Apply button.
00227   // sample code for here: KCMultiDialog calls bool changed() on every KCModuleProxy...
00228 }
00229 
00230 void KMFolderDialog::setFolder( KMFolder* folder )
00231 {
00232   Q_ASSERT( mFolder.isNull() );
00233   mFolder = folder;
00234 }
00235 
00236 static void addLine( QWidget *parent, QVBoxLayout* layout )
00237 {
00238    QFrame *line = new QFrame( parent, "line" );
00239    line->setGeometry( QRect( 80, 150, 250, 20 ) );
00240    line->setFrameShape( QFrame::HLine );
00241    line->setFrameShadow( QFrame::Sunken );
00242    line->setFrameShape( QFrame::HLine );
00243    layout->addWidget( line );
00244 }
00245 
00246 //----------------------------------------------------------------------------
00247 KMail::FolderDiaGeneralTab::FolderDiaGeneralTab( KMFolderDialog* dlg,
00248                                                  const QString& aName,
00249                                                  QWidget* parent, const char* name )
00250   : FolderDiaTab( parent, name ),
00251   mSharedSeenFlagsCheckBox( 0 ),
00252   mDlg( dlg )
00253 {
00254 
00255   mIsLocalSystemFolder = mDlg->folder()->isSystemFolder();
00256   mIsResourceFolder = kmkernel->iCalIface().isStandardResourceFolder( mDlg->folder() );
00257 
00258   QLabel *label;
00259 
00260   QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00261 
00262   // Musn't be able to edit details for a non-resource, system folder.
00263   if ( !mIsLocalSystemFolder || mIsResourceFolder ) {
00264 
00265     QHBoxLayout *hl = new QHBoxLayout( topLayout );
00266     hl->setSpacing( KDialog::spacingHint() );
00267 
00268     label = new QLabel( i18n("&Name:"), this );
00269     hl->addWidget( label );
00270 
00271     mNameEdit = new KLineEdit( this );
00272     if( !mDlg->folder() )
00273       mNameEdit->setFocus();
00274     mNameEdit->setText( mDlg->folder() ? mDlg->folder()->label() : i18n("unnamed") );
00275     if (!aName.isEmpty())
00276             mNameEdit->setText(aName);
00277     mNameEdit->setMinimumSize(mNameEdit->sizeHint());
00278     // prevent renaming of IMAP inbox
00279     if ( mDlg->folder() && mDlg->folder()->isSystemFolder() ) {
00280       QString imapPath;
00281       if ( mDlg->folder()->folderType() == KMFolderTypeImap )
00282         imapPath = static_cast<KMFolderImap*>( mDlg->folder()->storage() )->imapPath();
00283       if ( mDlg->folder()->folderType() == KMFolderTypeCachedImap )
00284         imapPath = static_cast<KMFolderCachedImap*>( mDlg->folder()->storage() )->imapPath();
00285       if ( imapPath == "/INBOX/" )
00286         mNameEdit->setEnabled( false );
00287     }
00288     label->setBuddy( mNameEdit );
00289     hl->addWidget( mNameEdit );
00290     connect( mNameEdit, SIGNAL( textChanged( const QString & ) ),
00291                     this, SLOT( slotFolderNameChanged( const QString & ) ) );
00292 
00293 
00294     //start icons group
00295     QVBoxLayout *ivl = new QVBoxLayout( topLayout );
00296     ivl->setSpacing( KDialog::spacingHint() );
00297 
00298     QHBoxLayout *ihl = new QHBoxLayout( ivl );
00299     mIconsCheckBox = new QCheckBox( i18n("Use custom &icons"), this );
00300     mIconsCheckBox->setChecked( false );
00301     ihl->addWidget( mIconsCheckBox );
00302     ihl->addStretch( 2 );
00303 
00304     mNormalIconLabel = new QLabel( i18n("&Normal:"), this );
00305     mNormalIconLabel->setEnabled( false );
00306     ihl->addWidget( mNormalIconLabel );
00307 
00308     mNormalIconButton = new KIconButton( this );
00309     mNormalIconLabel->setBuddy( mNormalIconButton );
00310     mNormalIconButton->setIconType( KIcon::NoGroup , KIcon::Any, true );
00311     mNormalIconButton->setIconSize( 16 );
00312     mNormalIconButton->setStrictIconSize( true );
00313     mNormalIconButton->setFixedSize( 28, 28 );
00314     // Can't use iconset here
00315     mNormalIconButton->setIcon( "folder" );
00316     mNormalIconButton->setEnabled( false );
00317     ihl->addWidget( mNormalIconButton );
00318 
00319     mUnreadIconLabel = new QLabel( i18n("&Unread:"), this );
00320     mUnreadIconLabel->setEnabled( false );
00321     ihl->addWidget( mUnreadIconLabel );
00322 
00323     mUnreadIconButton = new KIconButton( this );
00324     mUnreadIconLabel->setBuddy( mUnreadIconButton );
00325     mUnreadIconButton->setIconType( KIcon::NoGroup, KIcon::Any, true );
00326     mUnreadIconButton->setIconSize( 16 );
00327     mUnreadIconButton->setStrictIconSize( true );
00328     mUnreadIconButton->setFixedSize( 28, 28 );
00329     // Can't use iconset here
00330     mUnreadIconButton->setIcon( "folder_open" );
00331     mUnreadIconButton->setEnabled( false );
00332     ihl->addWidget( mUnreadIconButton );
00333     ihl->addStretch( 1 );
00334 
00335     connect( mIconsCheckBox, SIGNAL(toggled(bool)),
00336                     mNormalIconButton, SLOT(setEnabled(bool)) );
00337     connect( mIconsCheckBox, SIGNAL(toggled(bool)),
00338                     mUnreadIconButton, SLOT(setEnabled(bool)) );
00339     connect( mIconsCheckBox, SIGNAL(toggled(bool)),
00340                     mNormalIconLabel, SLOT(setEnabled(bool)) );
00341     connect( mIconsCheckBox, SIGNAL(toggled(bool)),
00342                     mUnreadIconLabel, SLOT(setEnabled(bool)) );
00343 
00344     connect( mNormalIconButton, SIGNAL(iconChanged(QString)),
00345                     this, SLOT(slotChangeIcon(QString)) );
00346 
00347     //end icons group
00348     addLine( this, topLayout);
00349   }
00350 
00351 
00352   // should new mail in this folder be ignored?
00353   QHBoxLayout *hbl = new QHBoxLayout( topLayout );
00354   hbl->setSpacing( KDialog::spacingHint() );
00355   mNotifyOnNewMailCheckBox =
00356     new QCheckBox( i18n("Act on new/unread mail in this folder" ), this );
00357   QWhatsThis::add( mNotifyOnNewMailCheckBox,
00358       i18n( "<qt><p>If this option is enabled then you will be notified about "
00359             "new/unread mail in this folder. Moreover, going to the "
00360             "next/previous folder with unread messages will stop at this "
00361             "folder.</p>"
00362             "<p>Uncheck this option if you do not want to be notified about "
00363             "new/unread mail in this folder and if you want this folder to "
00364             "be skipped when going to the next/previous folder with unread "
00365             "messages. This is useful for ignoring any new/unread mail in "
00366             "your trash and spam folder.</p></qt>" ) );
00367   hbl->addWidget( mNotifyOnNewMailCheckBox );
00368 
00369   if ( mDlg->folder()->folderType() == KMFolderTypeImap ) {
00370     // should this folder be included in new-mail-checks?
00371 
00372     QHBoxLayout *nml = new QHBoxLayout( topLayout );
00373     nml->setSpacing( KDialog::spacingHint() );
00374     mNewMailCheckBox = new QCheckBox( i18n("Include this folder in mail checks"), this );
00375     // default is on
00376     mNewMailCheckBox->setChecked(true);
00377     nml->addWidget( mNewMailCheckBox );
00378     nml->addStretch( 1 );
00379   }
00380 
00381   // should replies to mails in this folder be kept in this same folder?
00382   hbl = new QHBoxLayout( topLayout );
00383   hbl->setSpacing( KDialog::spacingHint() );
00384   mKeepRepliesInSameFolderCheckBox =
00385     new QCheckBox( i18n("Keep replies in this folder" ), this );
00386   QWhatsThis::add( mKeepRepliesInSameFolderCheckBox,
00387                    i18n( "Check this option if you want replies you write "
00388                          "to mails in this folder to be put in this same folder "
00389                          "after sending, instead of in the configured sent-mail folder." ) );
00390   hbl->addWidget( mKeepRepliesInSameFolderCheckBox );
00391   hbl->addStretch( 1 );
00392 
00393   addLine( this, topLayout );
00394 
00395   // use grid layout for the following combobox settings
00396   QGridLayout *gl = new QGridLayout( topLayout, 3, 2, KDialog::spacingHint() );
00397   gl->setColStretch( 1, 100 ); // make the second column use all available space
00398   int row = -1;
00399 
00400   // sender or receiver column?
00401   ++row;
00402   QString tip = i18n("Show Sender/Receiver Column in List of Messages");
00403 
00404   QLabel *sender_label = new QLabel( i18n("Sho&w column:" ), this );
00405   gl->addWidget( sender_label, row, 0 );
00406   mShowSenderReceiverComboBox = new QComboBox( this );
00407   QToolTip::add( mShowSenderReceiverComboBox, tip );
00408   sender_label->setBuddy(mShowSenderReceiverComboBox);
00409   gl->addWidget( mShowSenderReceiverComboBox, row, 1 );
00410   mShowSenderReceiverComboBox->insertItem(i18n("Default"), 0);
00411   mShowSenderReceiverComboBox->insertItem(i18n("Sender"), 1);
00412   mShowSenderReceiverComboBox->insertItem(i18n("Receiver"), 2);
00413 
00414   QString whoField;
00415   if (mDlg->folder()) whoField = mDlg->folder()->userWhoField();
00416   if (whoField.isEmpty()) mShowSenderReceiverComboBox->setCurrentItem(0);
00417   else if (whoField == "From") mShowSenderReceiverComboBox->setCurrentItem(1);
00418   else if (whoField == "To") mShowSenderReceiverComboBox->setCurrentItem(2);
00419 
00420 
00421   // sender identity
00422   ++row;
00423   label = new QLabel( i18n("&Sender identity:"), this );
00424   gl->addWidget( label, row, 0 );
00425   mIdentityComboBox = new KPIM::IdentityCombo( kmkernel->identityManager(), this );
00426   label->setBuddy( mIdentityComboBox );
00427   gl->addWidget( mIdentityComboBox, row, 1 );
00428   QWhatsThis::add( mIdentityComboBox,
00429       i18n( "Select the sender identity to be used when writing new mail "
00430         "or replying to mail in this folder. This means that if you are in "
00431         "one of your work folders, you can make KMail use the corresponding "
00432         "sender email address, signature and signing or encryption keys "
00433         "automatically. Identities can be set up in the main configuration "
00434         "dialog. (Settings -> Configure KMail)") );
00435 
00436   // folder contents
00437   if ( ( !mIsLocalSystemFolder || mIsResourceFolder ) &&
00438        kmkernel->iCalIface().isEnabled() &&
00439        mDlg->folder() && mDlg->folder()->folderType() != KMFolderTypeImap ) {
00440     // Only do make this settable, if the IMAP resource is enabled
00441     // and it's not the personal folders (those must not be changed)
00442     ++row;
00443     label = new QLabel( i18n("&Folder contents:"), this );
00444     gl->addWidget( label, row, 0 );
00445     mContentsComboBox = new QComboBox( this );
00446     label->setBuddy( mContentsComboBox );
00447     gl->addWidget( mContentsComboBox, row, 1 );
00448 
00449     mContentsComboBox->insertItem( i18n( "Mail" ) );
00450     mContentsComboBox->insertItem( i18n( "Calendar" ) );
00451     mContentsComboBox->insertItem( i18n( "Contacts" ) );
00452     mContentsComboBox->insertItem( i18n( "Notes" ) );
00453     mContentsComboBox->insertItem( i18n( "Tasks" ) );
00454     mContentsComboBox->insertItem( i18n( "Journal" ) );
00455     if ( mDlg->folder() )
00456       mContentsComboBox->setCurrentItem( mDlg->folder()->storage()->contentsType() );
00457     connect ( mContentsComboBox, SIGNAL ( activated( int ) ),
00458               this, SLOT( slotFolderContentsSelectionChanged( int ) ) );
00459     if ( mDlg->folder()->isReadOnly() || mIsResourceFolder )
00460       mContentsComboBox->setEnabled( false );
00461   } else {
00462     mContentsComboBox = 0;
00463   }
00464 
00465   mIncidencesForComboBox = 0;
00466   mAlarmsBlockedCheckBox = 0;
00467 
00468   // Kolab incidences-for annotation.
00469   // Show incidences-for combobox if the contents type can be changed (new folder),
00470   // or if it's set to calendar or task (existing folder)
00471   if ( ( GlobalSettings::self()->theIMAPResourceStorageFormat() ==
00472          GlobalSettings::EnumTheIMAPResourceStorageFormat::XML ) &&
00473       mContentsComboBox ) {
00474     ++row;
00475 
00476     QLabel* label = new QLabel( i18n( "Generate free/&busy and activate alarms for:" ), this );
00477     gl->addWidget( label, row, 0 );
00478     mIncidencesForComboBox = new QComboBox( this );
00479     label->setBuddy( mIncidencesForComboBox );
00480     gl->addWidget( mIncidencesForComboBox, row, 1 );
00481 
00482     const QString whatsThisForMyOwnFolders =
00483       i18n( "This setting defines which users sharing "
00484           "this folder should get \"busy\" periods in their freebusy lists "
00485           "and should see the alarms for the events or tasks in this folder. "
00486           "The setting applies to Calendar and Task folders only "
00487           "(for tasks, this setting is only used for alarms).\n\n"
00488           "Example use cases: if the boss shares a folder with his secretary, "
00489           "only the boss should be marked as busy for his meetings, so he should "
00490           "select \"Admins\", since the secretary has no admin rights on the folder.\n"
00491           "On the other hand if a working group shares a Calendar for "
00492           "group meetings, all readers of the folders should be marked "
00493           "as busy for meetings.\n"
00494           "A company-wide folder with optional events in it would use \"Nobody\" "
00495           "since it is not known who will go to those events." );
00496 
00497     QWhatsThis::add( mIncidencesForComboBox, whatsThisForMyOwnFolders );
00498     mIncidencesForComboBox->insertItem( i18n( "Nobody" ) );
00499     mIncidencesForComboBox->insertItem( i18n( "Admins of This Folder" ) );
00500     mIncidencesForComboBox->insertItem( i18n( "All Readers of This Folder" ) );
00501     ++row;
00502     const QString whatsThisForReadOnlyFolders =
00503       i18n( "This setting allows you to disable alarms for folders shared by others. ");
00504     mAlarmsBlockedCheckBox = new QCheckBox( this );
00505     mAlarmsBlockedCheckBox->setText( i18n( "Block alarms locally" ) );
00506     gl->addMultiCellWidget( mAlarmsBlockedCheckBox, row, row, 0, 1);
00507     QWhatsThis::add( mAlarmsBlockedCheckBox, whatsThisForReadOnlyFolders );
00508 
00509     if ( mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeCalendar
00510       && mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeTask ) {
00511         mIncidencesForComboBox->setEnabled( false );
00512         mAlarmsBlockedCheckBox->setEnabled( false );
00513     }
00514   }
00515 
00516   if ( mDlg->folder()->folderType() == KMFolderTypeCachedImap ) {
00517     kdDebug() << k_funcinfo << mDlg->folder()->folderType() << endl;
00518     mSharedSeenFlagsCheckBox = new QCheckBox( this );
00519     mSharedSeenFlagsCheckBox->setText( i18n( "Share unread state with all users" ) );
00520     ++row;
00521     gl->addMultiCellWidget( mSharedSeenFlagsCheckBox, row, row, 0, 1 );
00522     QWhatsThis::add( mSharedSeenFlagsCheckBox, i18n( "If enabled, the unread state of messages in this folder will be the same "
00523         "for all users having access to this folders. If disabled (the default), every user with access to this folder has her "
00524         "own unread state." ) );
00525   }
00526   topLayout->addStretch( 100 ); // eat all superfluous space
00527 
00528   initializeWithValuesFromFolder( mDlg->folder() );
00529 }
00530 
00531 void FolderDiaGeneralTab::load()
00532 {
00533   // Nothing here, all is done in the ctor
00534 }
00535 
00536 void FolderDiaGeneralTab::initializeWithValuesFromFolder( KMFolder* folder ) {
00537   if ( !folder )
00538     return;
00539 
00540   if ( !mIsLocalSystemFolder ) {
00541     // folder icons
00542     mIconsCheckBox->setChecked( folder->useCustomIcons() );
00543     mNormalIconLabel->setEnabled( folder->useCustomIcons() );
00544     mNormalIconButton->setEnabled( folder->useCustomIcons() );
00545     mUnreadIconLabel->setEnabled( folder->useCustomIcons() );
00546     mUnreadIconButton->setEnabled( folder->useCustomIcons() );
00547     QString iconPath = folder->normalIconPath();
00548     if ( !iconPath.isEmpty() )
00549       mNormalIconButton->setIcon( iconPath );
00550     iconPath = folder->unreadIconPath();
00551     if ( !iconPath.isEmpty() )
00552       mUnreadIconButton->setIcon( iconPath );
00553   }
00554 
00555   // folder identity
00556   mIdentityComboBox->setCurrentIdentity( folder->identity() );
00557   // ignore new mail
00558   mNotifyOnNewMailCheckBox->setChecked( !folder->ignoreNewMail() );
00559 
00560   const bool keepInFolder = !folder->isReadOnly() && folder->putRepliesInSameFolder();
00561   mKeepRepliesInSameFolderCheckBox->setChecked( keepInFolder );
00562   mKeepRepliesInSameFolderCheckBox->setDisabled( folder->isReadOnly() );
00563 
00564   if (folder->folderType() == KMFolderTypeImap)
00565   {
00566     KMFolderImap* imapFolder = static_cast<KMFolderImap*>(folder->storage());
00567     bool checked = imapFolder->includeInMailCheck();
00568     mNewMailCheckBox->setChecked(checked);
00569   }
00570 
00571   if ( mIncidencesForComboBox ) {
00572     KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( folder->storage() );
00573     mIncidencesForComboBox->setCurrentItem( dimap->incidencesFor() );
00574     mIncidencesForComboBox->setDisabled( mDlg->folder()->isReadOnly() );
00575   }
00576   if ( mAlarmsBlockedCheckBox ) {
00577     KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( folder->storage() );
00578     mAlarmsBlockedCheckBox->setChecked( dimap->alarmsBlocked() );
00579   }
00580   if ( mSharedSeenFlagsCheckBox ) {
00581     KMFolderCachedImap *dimap = static_cast<KMFolderCachedImap*>( folder->storage() );
00582     ImapAccountBase *account = dynamic_cast<ImapAccountBase*>( dimap->account() );
00583     mSharedSeenFlagsCheckBox->setChecked( dimap->sharedSeenFlags() );
00584     mSharedSeenFlagsCheckBox->setDisabled( folder->isReadOnly() );
00585     if ( account && account->hasCapability( "x-kmail-sharedseen" ) )
00586       mSharedSeenFlagsCheckBox->show();
00587     else
00588       mSharedSeenFlagsCheckBox->hide();
00589   }
00590 }
00591 
00592 //-----------------------------------------------------------------------------
00593 void FolderDiaGeneralTab::slotFolderNameChanged( const QString& str )
00594 {
00595   mDlg->enableButtonOK( !str.isEmpty() );
00596 }
00597 
00598 //-----------------------------------------------------------------------------
00599 void FolderDiaGeneralTab::slotFolderContentsSelectionChanged( int )
00600 {
00601   KMail::FolderContentsType type =
00602     static_cast<KMail::FolderContentsType>( mContentsComboBox->currentItem() );
00603   if( type != KMail::ContentsTypeMail && GlobalSettings::self()->hideGroupwareFolders() ) {
00604     QString message = i18n("You have configured this folder to contain groupware information "
00605         "and the general configuration option to hide groupware folders is "
00606         "set. That means that this folder will disappear once the configuration "
00607         "dialog is closed. If you want to remove the folder again, you will need "
00608         "to temporarily disable hiding of groupware folders to be able to see it.");
00609     KMessageBox::information( this, message );
00610   }
00611   const bool enable = type == KMail::ContentsTypeCalendar ||
00612                                           type == KMail::ContentsTypeTask;
00613   if ( mIncidencesForComboBox )
00614       mIncidencesForComboBox->setEnabled( enable );
00615   if ( mAlarmsBlockedCheckBox )
00616       mAlarmsBlockedCheckBox->setEnabled( enable );
00617 }
00618 
00619 //-----------------------------------------------------------------------------
00620 bool FolderDiaGeneralTab::save()
00621 {
00622   KMFolder* folder = mDlg->folder();
00623   folder->setIdentity( mIdentityComboBox->currentIdentity() );
00624   // set whoField
00625   if (mShowSenderReceiverComboBox->currentItem() == 1)
00626     folder->setUserWhoField("From");
00627   else if (mShowSenderReceiverComboBox->currentItem() == 2)
00628     folder->setUserWhoField("To");
00629   else
00630     folder->setUserWhoField("");
00631 
00632   folder->setIgnoreNewMail( !mNotifyOnNewMailCheckBox->isChecked() );
00633   folder->setPutRepliesInSameFolder( mKeepRepliesInSameFolderCheckBox->isChecked() );
00634 
00635   QString fldName, oldFldName;
00636   KMFolderCachedImap* dimap = 0;
00637   if ( folder->folderType() == KMFolderTypeCachedImap )
00638     dimap = static_cast<KMFolderCachedImap *>( mDlg->folder()->storage() );
00639 
00640   if ( !mIsLocalSystemFolder || mIsResourceFolder )
00641   {
00642     oldFldName = mDlg->folder()->name();
00643     if (!mNameEdit->text().isEmpty())
00644       fldName = mNameEdit->text();
00645     else
00646       fldName = oldFldName;
00647 
00648     if ( mDlg->parentFolder() &&
00649          mDlg->parentFolder()->folderType() != KMFolderTypeImap &&
00650          mDlg->parentFolder()->folderType() != KMFolderTypeCachedImap )
00651       fldName.remove('/');
00652     fldName.remove(QRegExp("^\\.*"));
00653     if (fldName.isEmpty()) fldName = i18n("unnamed");
00654 
00655 
00656     // Update the tree iff new icon paths are different and not empty or if
00657     // useCustomIcons changed.
00658     if ( folder->useCustomIcons() != mIconsCheckBox->isChecked() ) {
00659       folder->setUseCustomIcons( mIconsCheckBox->isChecked() );
00660       // Reset icons, useCustomIcons was turned off.
00661       if ( !folder->useCustomIcons() ) {
00662         folder->setIconPaths( "", "" );
00663       }
00664     }
00665     if ( folder->useCustomIcons() && (
00666         (( mNormalIconButton->icon() != folder->normalIconPath() ) &&
00667          ( !mNormalIconButton->icon().isEmpty())) ||
00668         (( mUnreadIconButton->icon() != folder->unreadIconPath() ) &&
00669          ( !mUnreadIconButton->icon().isEmpty())) ) ) {
00670       folder->setIconPaths( mNormalIconButton->icon(), mUnreadIconButton->icon() );
00671     }
00672 
00673     // Set type field
00674     if ( mContentsComboBox ) {
00675       KMail::FolderContentsType type =
00676         static_cast<KMail::FolderContentsType>( mContentsComboBox->currentItem() );
00677       folder->storage()->setContentsType( type );
00678     }
00679 
00680     if ( dimap ) {
00681       if ( mIncidencesForComboBox ) {
00682         KMFolderCachedImap::IncidencesFor incfor = KMFolderCachedImap::IncForAdmins;
00683         incfor = static_cast<KMFolderCachedImap::IncidencesFor>( mIncidencesForComboBox->currentItem() );
00684         if ( dimap->incidencesFor() != incfor ) {
00685           dimap->setIncidencesFor( incfor );
00686           dimap->writeConfig();
00687         }
00688       }
00689       if ( mAlarmsBlockedCheckBox && mAlarmsBlockedCheckBox->isChecked() != dimap->alarmsBlocked() ) {
00690         dimap->setAlarmsBlocked( mAlarmsBlockedCheckBox->isChecked() );
00691         dimap->writeConfig();
00692       }
00693     }
00694 
00695     if( folder->folderType() == KMFolderTypeImap )
00696     {
00697       KMFolderImap* imapFolder = static_cast<KMFolderImap*>( folder->storage() );
00698       imapFolder->setIncludeInMailCheck(
00699           mNewMailCheckBox->isChecked() );
00700     }
00701   }
00702 
00703   if ( dimap && mSharedSeenFlagsCheckBox &&
00704        mSharedSeenFlagsCheckBox->isChecked() != dimap->sharedSeenFlags() ) {
00705     dimap->setSharedSeenFlags( mSharedSeenFlagsCheckBox->isChecked() );
00706     dimap->writeConfig();
00707   }
00708 
00709   // make sure everything is on disk, connected slots will call readConfig()
00710   // when creating a new folder.
00711   folder->storage()->writeConfig();
00712 
00713   QString msg;
00714   if ( !folder->isValidName( fldName, msg ) ) {
00715     KMessageBox::sorry( this, msg );
00716     return false;
00717   } else {
00718     // Renamed an existing folder? We don't check for oldName == newName on
00719     // purpose here. The folder might be pending renaming on the next dimap
00720     // sync already, in which case the old name would still be around and
00721     // something like Calendar -> CalendarFoo -> Calendar inbetween syncs would
00722     // fail. Therefor let the folder sort it out itself, whether the rename is
00723     // a noop or not.
00724     if ( !oldFldName.isEmpty() )
00725     {
00726       kmkernel->folderMgr()->renameFolder( folder, fldName );
00727     } else {
00728       kmkernel->folderMgr()->contentsChanged();
00729     }
00730   }
00731 
00732   return true;
00733 }
00734 
00735 void FolderDiaGeneralTab::slotChangeIcon( QString icon ) // can't use a const-ref here, due to KIconButton's signal
00736 {
00737     mUnreadIconButton->setIcon( icon );
00738 }
00739 
00740 //----------------------------------------------------------------------------
00741 KMail::FolderDiaTemplatesTab::FolderDiaTemplatesTab( KMFolderDialog* dlg,
00742                                                      QWidget* parent )
00743   : FolderDiaTab( parent, 0 ), mDlg( dlg )
00744 {
00745 
00746   mIsLocalSystemFolder = mDlg->folder()->isSystemFolder();
00747 
00748 
00749   QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00750 
00751   mCustom = new QCheckBox( i18n("&Use custom message templates"), this );
00752   topLayout->addWidget( mCustom );
00753 
00754   mWidget = new TemplatesConfiguration( this , "folder-templates" );
00755   mWidget->setEnabled( false );
00756   topLayout->addWidget( mWidget );
00757 
00758   QHBoxLayout *btns = new QHBoxLayout( topLayout, KDialog::spacingHint() );
00759   mCopyGlobal = new KPushButton( i18n("&Copy global templates"), this );
00760   mCopyGlobal->setEnabled( false );
00761   btns->addWidget( mCopyGlobal );
00762 
00763   connect( mCustom, SIGNAL(toggled(bool)),
00764         mWidget, SLOT(setEnabled(bool)) );
00765   connect( mCustom, SIGNAL(toggled(bool)),
00766         mCopyGlobal, SLOT(setEnabled(bool)) );
00767 
00768   connect( mCopyGlobal, SIGNAL(clicked()),
00769         this, SLOT(slotCopyGlobal()) );
00770 
00771   initializeWithValuesFromFolder( mDlg->folder() );
00772 
00773   connect( mWidget, SIGNAL( changed() ),
00774            this, SLOT( slotEmitChanged( void ) ) );
00775 }
00776 
00777 void FolderDiaTemplatesTab::load()
00778 {
00779 
00780 }
00781 
00782 void FolderDiaTemplatesTab::initializeWithValuesFromFolder( KMFolder* folder ) {
00783   if ( !folder )
00784     return;
00785 
00786   mFolder = folder;
00787 
00788   QString fid = folder->idString();
00789 
00790   Templates t( fid );
00791 
00792   mCustom->setChecked(t.useCustomTemplates());
00793 
00794   mIdentity = folder->identity();
00795 
00796   mWidget->loadFromFolder( fid, mIdentity );
00797 }
00798 
00799 //-----------------------------------------------------------------------------
00800 bool FolderDiaTemplatesTab::save()
00801 {
00802   KMFolder* folder = mDlg->folder();
00803 
00804   QString fid = folder->idString();
00805   Templates t(fid);
00806 
00807   kdDebug() << "use custom templates for folder " << fid << ": " << mCustom->isChecked() << endl;
00808   t.setUseCustomTemplates(mCustom->isChecked());
00809   t.writeConfig();
00810 
00811   mWidget->saveToFolder(fid);
00812 
00813   return true;
00814 }
00815 
00816 
00817 void FolderDiaTemplatesTab::slotEmitChanged() {}
00818 
00819 void FolderDiaTemplatesTab::slotCopyGlobal() {
00820   if ( mIdentity ) {
00821     mWidget->loadFromIdentity( mIdentity );
00822   }
00823   else {
00824     mWidget->loadFromGlobal();
00825   }
00826 }
KDE Home | KDE Accessibility Home | Description of Access Keys