diff options
Diffstat (limited to 'kmail/kmfolderdia.cpp')
-rw-r--r-- | kmail/kmfolderdia.cpp | 792 |
1 files changed, 792 insertions, 0 deletions
diff --git a/kmail/kmfolderdia.cpp b/kmail/kmfolderdia.cpp new file mode 100644 index 000000000..2e4044ab0 --- /dev/null +++ b/kmail/kmfolderdia.cpp @@ -0,0 +1,792 @@ +// -*- mode: C++; c-file-style: "gnu" -*- +/** + * kmfolderdia.cpp + * + * Copyright (c) 1997-2004 KMail Developers + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of this program with any edition of + * the Qt library by Trolltech AS, Norway (or with modified versions + * of Qt that use the same license as Qt), and distribute linked + * combinations including the two. You must obey the GNU General + * Public License in all respects for all of the code used other than + * Qt. If you modify this file, you may extend this exception to + * your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from + * your version. + */ + +#include <config.h> + +#include "kmfolderdia.h" +#include "kmacctfolder.h" +#include "kmfoldermgr.h" +#include <libkpimidentities/identitycombo.h> +#include "kmfolderimap.h" +#include "kmfoldercachedimap.h" +#include "kmfolder.h" +#include "kmheaders.h" +#include "kmcommands.h" +#include "kmfoldertree.h" +#include "folderdiaacltab.h" +#include "folderdiaquotatab.h" +#include "kmailicalifaceimpl.h" +#include "globalsettings.h" +#include "folderrequester.h" + +#include <keditlistbox.h> +#include <klineedit.h> +#include <klocale.h> +#include <knuminput.h> +#include <kmessagebox.h> +#include <kicondialog.h> +#include <kconfig.h> +#include <kdebug.h> +#include <klistview.h> +#include <kpushbutton.h> + +#include <qcheckbox.h> +#include <qlayout.h> +#include <qgroupbox.h> +#include <qregexp.h> +#include <qlabel.h> +#include <qvbox.h> +#include <qtooltip.h> +#include <qwhatsthis.h> + +#include <assert.h> +#include <qhbuttongroup.h> +#include <qradiobutton.h> +#include <qtextedit.h> + +#include "templatesconfiguration.h" +#include "templatesconfiguration_kfg.h" + +#include "kmfolderdia.moc" + +using namespace KMail; + +static QString inCaseWeDecideToRenameTheTab( I18N_NOOP( "Permissions (ACL)" ) ); + +//----------------------------------------------------------------------------- +KMFolderDialog::KMFolderDialog(KMFolder *aFolder, KMFolderDir *aFolderDir, + KMFolderTree* aParent, const QString& aCap, + const QString& aName): + KDialogBase( KDialogBase::Tabbed, + aCap, KDialogBase::Ok|KDialogBase::Cancel, + KDialogBase::Ok, aParent, "KMFolderDialog", TRUE ), + mFolder( aFolder ), + mFolderDir( aFolderDir ), + mParentFolder( 0 ), + mIsNewFolder( aFolder == 0 ), + mFolderTree( aParent ) +{ + kdDebug(5006)<<"KMFolderDialog::KMFolderDialog()" << endl; + + QStringList folderNames; + QValueList<QGuardedPtr<KMFolder> > folders; + // get all folders but search and folders that can not have children + aParent->createFolderList(&folderNames, &folders, true, true, + true, false, true, false); + + if( mFolderDir ) { + // search the parent folder of the folder + FolderList::ConstIterator it; + int i = 1; + for( it = folders.begin(); it != folders.end(); ++it, ++i ) { + if( (*it)->child() == mFolderDir ) { + mParentFolder = *it; + break; + } + } + } + + FolderDiaTab* tab; + QVBox* box; + + box = addVBoxPage( i18n("General") ); + tab = new FolderDiaGeneralTab( this, aName, box ); + addTab( tab ); + box = addVBoxPage( i18n("Templates") ); + tab = new FolderDiaTemplatesTab( this, box ); + addTab( tab ); + + KMFolder* refFolder = mFolder ? mFolder : mParentFolder; + KMFolderType folderType = refFolder ? refFolder->folderType() : KMFolderTypeUnknown; + bool noContent = mFolder ? mFolder->storage()->noContent() : false; + if ( !noContent && refFolder && ( folderType == KMFolderTypeImap || folderType == KMFolderTypeCachedImap ) ) { + if ( FolderDiaACLTab::supports( refFolder ) ) { + box = addVBoxPage( i18n("Access Control") ); + tab = new FolderDiaACLTab( this, box ); + addTab( tab ); + } + } + if ( !noContent && refFolder && ( folderType == KMFolderTypeImap || folderType == KMFolderTypeCachedImap ) ) { + if ( FolderDiaQuotaTab::supports( refFolder ) ) { + box = addVBoxPage( i18n("Quota") ); + tab = new FolderDiaQuotaTab( this, box ); + addTab( tab ); + } + } + + for ( unsigned int i = 0 ; i < mTabs.count() ; ++i ) + mTabs[i]->load(); +} + +void KMFolderDialog::addTab( FolderDiaTab* tab ) +{ + connect( tab, SIGNAL( readyForAccept() ), + this, SLOT( slotReadyForAccept() ) ); + connect( tab, SIGNAL( cancelAccept() ), + this, SLOT( slotCancelAccept() ) ); + //connect( tab, SIGNAL(changed( bool )), + // this, SLOT(slotChanged( bool )) ); + mTabs.append( tab ); +} + +// Not used yet (no button), but ready to be used :) +void KMFolderDialog::slotApply() +{ + if ( mFolder.isNull() && !mIsNewFolder ) { // deleted meanwhile? + KDialogBase::slotApply(); + return; + } + for ( unsigned int i = 0 ; i < mTabs.count() ; ++i ) + mTabs[i]->save(); + if ( !mFolder.isNull() && mIsNewFolder ) // we just created it + mIsNewFolder = false; // so it's not new anymore :) + KDialogBase::slotApply(); +} + +// Called when pressing Ok +// We want to apply the changes first (which is async), before closing the dialog, +// in case of errors during the upload. +void KMFolderDialog::slotOk() +{ + if ( mFolder.isNull() && !mIsNewFolder ) { // deleted meanwhile? + KDialogBase::slotOk(); + return; + } + + mDelayedSavingTabs = 0; // number of tabs which need delayed saving + for ( unsigned int i = 0 ; i < mTabs.count() ; ++i ) { + FolderDiaTab::AcceptStatus s = mTabs[i]->accept(); + if ( s == FolderDiaTab::Canceled ) { + slotCancelAccept(); + return; + } + else if ( s == FolderDiaTab::Delayed ) + ++mDelayedSavingTabs; + } + + if ( mDelayedSavingTabs ) + enableButtonOK( false ); + else + KDialogBase::slotOk(); +} + +void KMFolderDialog::slotReadyForAccept() +{ + --mDelayedSavingTabs; + if ( mDelayedSavingTabs == 0 ) + KDialogBase::slotOk(); +} + +void KMFolderDialog::slotCancelAccept() +{ + mDelayedSavingTabs = -1; + enableButtonOK( true ); + // Don't try to create it twice + if ( !mFolder.isNull() ) + mIsNewFolder = false; + + // Other tabs might call slotReadyForAccept. -1 ensures that it won't close the dialog, + // but the OK button being enabled means that people might succeed in running + // the same job from save more than once. + // Solution: mAcceptCanceled = true instead of -1. + // Bah for now we only have one tab which can delay saving -> later. +} + +void KMFolderDialog::slotChanged( bool ) +{ + // TODO, support for 'changed', and Apply button. + // sample code for here: KCMultiDialog calls bool changed() on every KCModuleProxy... +} + +void KMFolderDialog::setFolder( KMFolder* folder ) +{ + Q_ASSERT( mFolder.isNull() ); + mFolder = folder; +} + +static void addLine( QWidget *parent, QVBoxLayout* layout ) +{ + QFrame *line = new QFrame( parent, "line" ); + line->setGeometry( QRect( 80, 150, 250, 20 ) ); + line->setFrameShape( QFrame::HLine ); + line->setFrameShadow( QFrame::Sunken ); + line->setFrameShape( QFrame::HLine ); + layout->addWidget( line ); +} + +//---------------------------------------------------------------------------- +KMail::FolderDiaGeneralTab::FolderDiaGeneralTab( KMFolderDialog* dlg, + const QString& aName, + QWidget* parent, const char* name ) + : FolderDiaTab( parent, name ), mDlg( dlg ) +{ + + + mIsLocalSystemFolder = mDlg->folder()->isSystemFolder() && + mDlg->folder()->folderType() != KMFolderTypeImap && + mDlg->folder()->folderType() != KMFolderTypeCachedImap; + + QLabel *label; + + QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() ); + + // Musn't be able to edit details for a system folder. + if ( !mIsLocalSystemFolder ) { + + QHBoxLayout *hl = new QHBoxLayout( topLayout ); + hl->setSpacing( KDialog::spacingHint() ); + + label = new QLabel( i18n("&Name:"), this ); + hl->addWidget( label ); + + mNameEdit = new KLineEdit( this ); + if( !mDlg->folder() ) + mNameEdit->setFocus(); + mNameEdit->setText( mDlg->folder() ? mDlg->folder()->label() : i18n("unnamed") ); + if (!aName.isEmpty()) + mNameEdit->setText(aName); + mNameEdit->setMinimumSize(mNameEdit->sizeHint()); + // prevent renaming of IMAP inbox + if ( mDlg->folder() && mDlg->folder()->isSystemFolder() ) { + QString imapPath; + if ( mDlg->folder()->folderType() == KMFolderTypeImap ) + imapPath = static_cast<KMFolderImap*>( mDlg->folder()->storage() )->imapPath(); + if ( mDlg->folder()->folderType() == KMFolderTypeCachedImap ) + imapPath = static_cast<KMFolderCachedImap*>( mDlg->folder()->storage() )->imapPath(); + if ( imapPath == "/INBOX/" ) + mNameEdit->setEnabled( false ); + } + label->setBuddy( mNameEdit ); + hl->addWidget( mNameEdit ); + connect( mNameEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( slotFolderNameChanged( const QString & ) ) ); + + + //start icons group + QVBoxLayout *ivl = new QVBoxLayout( topLayout ); + ivl->setSpacing( KDialog::spacingHint() ); + + QHBoxLayout *ihl = new QHBoxLayout( ivl ); + mIconsCheckBox = new QCheckBox( i18n("Use custom &icons"), this ); + mIconsCheckBox->setChecked( false ); + ihl->addWidget( mIconsCheckBox ); + ihl->addStretch( 2 ); + + mNormalIconLabel = new QLabel( i18n("&Normal:"), this ); + mNormalIconLabel->setEnabled( false ); + ihl->addWidget( mNormalIconLabel ); + + mNormalIconButton = new KIconButton( this ); + mNormalIconLabel->setBuddy( mNormalIconButton ); + mNormalIconButton->setIconType( KIcon::NoGroup , KIcon::Any, true ); + mNormalIconButton->setIconSize( 16 ); + mNormalIconButton->setStrictIconSize( true ); + mNormalIconButton->setFixedSize( 28, 28 ); + // Can't use iconset here + mNormalIconButton->setIcon( "folder" ); + mNormalIconButton->setEnabled( false ); + ihl->addWidget( mNormalIconButton ); + + mUnreadIconLabel = new QLabel( i18n("&Unread:"), this ); + mUnreadIconLabel->setEnabled( false ); + ihl->addWidget( mUnreadIconLabel ); + + mUnreadIconButton = new KIconButton( this ); + mUnreadIconLabel->setBuddy( mUnreadIconButton ); + mUnreadIconButton->setIconType( KIcon::NoGroup, KIcon::Any, true ); + mUnreadIconButton->setIconSize( 16 ); + mUnreadIconButton->setStrictIconSize( true ); + mUnreadIconButton->setFixedSize( 28, 28 ); + // Can't use iconset here + mUnreadIconButton->setIcon( "folder_open" ); + mUnreadIconButton->setEnabled( false ); + ihl->addWidget( mUnreadIconButton ); + ihl->addStretch( 1 ); + + connect( mIconsCheckBox, SIGNAL(toggled(bool)), + mNormalIconButton, SLOT(setEnabled(bool)) ); + connect( mIconsCheckBox, SIGNAL(toggled(bool)), + mUnreadIconButton, SLOT(setEnabled(bool)) ); + connect( mIconsCheckBox, SIGNAL(toggled(bool)), + mNormalIconLabel, SLOT(setEnabled(bool)) ); + connect( mIconsCheckBox, SIGNAL(toggled(bool)), + mUnreadIconLabel, SLOT(setEnabled(bool)) ); + + connect( mNormalIconButton, SIGNAL(iconChanged(QString)), + this, SLOT(slotChangeIcon(QString)) ); + + //end icons group + addLine( this, topLayout); + } + + + // should new mail in this folder be ignored? + QHBoxLayout *hbl = new QHBoxLayout( topLayout ); + hbl->setSpacing( KDialog::spacingHint() ); + mNotifyOnNewMailCheckBox = + new QCheckBox( i18n("Act on new/unread mail in this folder" ), this ); + QWhatsThis::add( mNotifyOnNewMailCheckBox, + i18n( "<qt><p>If this option is enabled then you will be notified about " + "new/unread mail in this folder. Moreover, going to the " + "next/previous folder with unread messages will stop at this " + "folder.</p>" + "<p>Uncheck this option if you do not want to be notified about " + "new/unread mail in this folder and if you want this folder to " + "be skipped when going to the next/previous folder with unread " + "messages. This is useful for ignoring any new/unread mail in " + "your trash and spam folder.</p></qt>" ) ); + hbl->addWidget( mNotifyOnNewMailCheckBox ); + + if ( mDlg->folder()->folderType() == KMFolderTypeImap ) { + // should this folder be included in new-mail-checks? + + QHBoxLayout *nml = new QHBoxLayout( topLayout ); + nml->setSpacing( KDialog::spacingHint() ); + mNewMailCheckBox = new QCheckBox( i18n("Include this folder in mail checks"), this ); + // default is on + mNewMailCheckBox->setChecked(true); + nml->addWidget( mNewMailCheckBox ); + nml->addStretch( 1 ); + } + + // should replies to mails in this folder be kept in this same folder? + hbl = new QHBoxLayout( topLayout ); + hbl->setSpacing( KDialog::spacingHint() ); + mKeepRepliesInSameFolderCheckBox = + new QCheckBox( i18n("Keep replies in this folder" ), this ); + QWhatsThis::add( mKeepRepliesInSameFolderCheckBox, + i18n( "Check this option if you want replies you write " + "to mails in this folder to be put in this same folder " + "after sending, instead of in the configured sent-mail folder." ) ); + hbl->addWidget( mKeepRepliesInSameFolderCheckBox ); + hbl->addStretch( 1 ); + + addLine( this, topLayout ); + + // use grid layout for the following combobox settings + QGridLayout *gl = new QGridLayout( topLayout, 3, 2, KDialog::spacingHint() ); + gl->setColStretch( 1, 100 ); // make the second column use all available space + int row = -1; + + // sender or receiver column? + ++row; + QString tip = i18n("Show Sender/Receiver Column in List of Messages"); + + QLabel *sender_label = new QLabel( i18n("Sho&w column:" ), this ); + gl->addWidget( sender_label, row, 0 ); + mShowSenderReceiverComboBox = new QComboBox( this ); + QToolTip::add( mShowSenderReceiverComboBox, tip ); + sender_label->setBuddy(mShowSenderReceiverComboBox); + gl->addWidget( mShowSenderReceiverComboBox, row, 1 ); + mShowSenderReceiverComboBox->insertItem(i18n("Default"), 0); + mShowSenderReceiverComboBox->insertItem(i18n("Sender"), 1); + mShowSenderReceiverComboBox->insertItem(i18n("Receiver"), 2); + + QString whoField; + if (mDlg->folder()) whoField = mDlg->folder()->userWhoField(); + if (whoField.isEmpty()) mShowSenderReceiverComboBox->setCurrentItem(0); + else if (whoField == "From") mShowSenderReceiverComboBox->setCurrentItem(1); + else if (whoField == "To") mShowSenderReceiverComboBox->setCurrentItem(2); + + + // sender identity + ++row; + label = new QLabel( i18n("&Sender identity:"), this ); + gl->addWidget( label, row, 0 ); + mIdentityComboBox = new KPIM::IdentityCombo( kmkernel->identityManager(), this ); + label->setBuddy( mIdentityComboBox ); + gl->addWidget( mIdentityComboBox, row, 1 ); + QWhatsThis::add( mIdentityComboBox, + i18n( "Select the sender identity to be used when writing new mail " + "or replying to mail in this folder. This means that if you are in " + "one of your work folders, you can make KMail use the corresponding " + "sender email address, signature and signing or encryption keys " + "automatically. Identities can be set up in the main configuration " + "dialog. (Settings -> Configure KMail)") ); + + + // folder contents + if ( !mIsLocalSystemFolder && kmkernel->iCalIface().isEnabled() ) { + // Only do make this settable, if the IMAP resource is enabled + // and it's not the personal folders (those must not be changed) + ++row; + label = new QLabel( i18n("&Folder contents:"), this ); + gl->addWidget( label, row, 0 ); + mContentsComboBox = new QComboBox( this ); + label->setBuddy( mContentsComboBox ); + gl->addWidget( mContentsComboBox, row, 1 ); + + mContentsComboBox->insertItem( i18n( "Mail" ) ); + mContentsComboBox->insertItem( i18n( "Calendar" ) ); + mContentsComboBox->insertItem( i18n( "Contacts" ) ); + mContentsComboBox->insertItem( i18n( "Notes" ) ); + mContentsComboBox->insertItem( i18n( "Tasks" ) ); + mContentsComboBox->insertItem( i18n( "Journal" ) ); + if ( mDlg->folder() ) + mContentsComboBox->setCurrentItem( mDlg->folder()->storage()->contentsType() ); + connect ( mContentsComboBox, SIGNAL ( activated( int ) ), + this, SLOT( slotFolderContentsSelectionChanged( int ) ) ); + if ( mDlg->folder()->isReadOnly() ) + mContentsComboBox->setEnabled( false ); + } else { + mContentsComboBox = 0; + } + + mIncidencesForComboBox = 0; + mAlarmsBlockedCheckBox = 0; + + // Kolab incidences-for annotation. + // Show incidences-for combobox if the contents type can be changed (new folder), + // or if it's set to calendar or task (existing folder) + if ( ( GlobalSettings::self()->theIMAPResourceStorageFormat() == + GlobalSettings::EnumTheIMAPResourceStorageFormat::XML ) && + mContentsComboBox ) { + ++row; + + QLabel* label = new QLabel( i18n( "Generate free/&busy and activate alarms for:" ), this ); + gl->addWidget( label, row, 0 ); + mIncidencesForComboBox = new QComboBox( this ); + label->setBuddy( mIncidencesForComboBox ); + gl->addWidget( mIncidencesForComboBox, row, 1 ); + + const QString whatsThisForMyOwnFolders = + i18n( "This setting defines which users sharing " + "this folder should get \"busy\" periods in their freebusy lists " + "and should see the alarms for the events or tasks in this folder. " + "The setting applies to Calendar and Task folders only " + "(for tasks, this setting is only used for alarms).\n\n" + "Example use cases: if the boss shares a folder with his secretary, " + "only the boss should be marked as busy for his meetings, so he should " + "select \"Admins\", since the secretary has no admin rights on the folder.\n" + "On the other hand if a working group shares a Calendar for " + "group meetings, all readers of the folders should be marked " + "as busy for meetings.\n" + "A company-wide folder with optional events in it would use \"Nobody\" " + "since it is not known who will go to those events." ); + + QWhatsThis::add( mIncidencesForComboBox, whatsThisForMyOwnFolders ); + mIncidencesForComboBox->insertItem( i18n( "Nobody" ) ); + mIncidencesForComboBox->insertItem( i18n( "Admins of This Folder" ) ); + mIncidencesForComboBox->insertItem( i18n( "All Readers of This Folder" ) ); + ++row; + const QString whatsThisForReadOnlyFolders = + i18n( "This setting allows you to disable alarms for folders shared by " + "others. "); + mAlarmsBlockedCheckBox = new QCheckBox( this ); + gl->addWidget( mAlarmsBlockedCheckBox, row, 0 ); + label = new QLabel( i18n( "Block free/&busy and alarms locally" ), this ); + gl->addWidget( label, row, 1 ); + label->setBuddy( mAlarmsBlockedCheckBox ); + QWhatsThis::add( mAlarmsBlockedCheckBox, whatsThisForReadOnlyFolders ); + + if ( mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeCalendar + && mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeTask ) { + mIncidencesForComboBox->setEnabled( false ); + mAlarmsBlockedCheckBox->setEnabled( false ); + } + } + topLayout->addStretch( 100 ); // eat all superfluous space + + initializeWithValuesFromFolder( mDlg->folder() ); +} + +void FolderDiaGeneralTab::load() +{ + // Nothing here, all is done in the ctor +} + +void FolderDiaGeneralTab::initializeWithValuesFromFolder( KMFolder* folder ) { + if ( !folder ) + return; + + if ( !mIsLocalSystemFolder ) { + // folder icons + mIconsCheckBox->setChecked( folder->useCustomIcons() ); + mNormalIconLabel->setEnabled( folder->useCustomIcons() ); + mNormalIconButton->setEnabled( folder->useCustomIcons() ); + mUnreadIconLabel->setEnabled( folder->useCustomIcons() ); + mUnreadIconButton->setEnabled( folder->useCustomIcons() ); + QString iconPath = folder->normalIconPath(); + if ( !iconPath.isEmpty() ) + mNormalIconButton->setIcon( iconPath ); + iconPath = folder->unreadIconPath(); + if ( !iconPath.isEmpty() ) + mUnreadIconButton->setIcon( iconPath ); + } + + // folder identity + mIdentityComboBox->setCurrentIdentity( folder->identity() ); + // ignore new mail + mNotifyOnNewMailCheckBox->setChecked( !folder->ignoreNewMail() ); + + const bool keepInFolder = !folder->isReadOnly() && folder->putRepliesInSameFolder(); + mKeepRepliesInSameFolderCheckBox->setChecked( keepInFolder ); + mKeepRepliesInSameFolderCheckBox->setDisabled( folder->isReadOnly() ); + + if (folder->folderType() == KMFolderTypeImap) + { + KMFolderImap* imapFolder = static_cast<KMFolderImap*>(folder->storage()); + bool checked = imapFolder->includeInMailCheck(); + mNewMailCheckBox->setChecked(checked); + } + + if ( mIncidencesForComboBox ) { + KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( folder->storage() ); + mIncidencesForComboBox->setCurrentItem( dimap->incidencesFor() ); + mIncidencesForComboBox->setDisabled( mDlg->folder()->isReadOnly() ); + } + if ( mAlarmsBlockedCheckBox ) { + KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( folder->storage() ); + mAlarmsBlockedCheckBox->setChecked( dimap->alarmsBlocked() ); + } +} + +//----------------------------------------------------------------------------- +void FolderDiaGeneralTab::slotFolderNameChanged( const QString& str ) +{ + mDlg->enableButtonOK( !str.isEmpty() ); +} + +//----------------------------------------------------------------------------- +void FolderDiaGeneralTab::slotFolderContentsSelectionChanged( int ) +{ + KMail::FolderContentsType type = + static_cast<KMail::FolderContentsType>( mContentsComboBox->currentItem() ); + if( type != KMail::ContentsTypeMail && GlobalSettings::self()->hideGroupwareFolders() ) { + QString message = i18n("You have configured this folder to contain groupware information " + "and the general configuration option to hide groupware folders is " + "set. That means that this folder will disappear once the configuration " + "dialog is closed. If you want to remove the folder again, you will need " + "to temporarily disable hiding of groupware folders to be able to see it."); + KMessageBox::information( this, message ); + } + const bool enable = type == KMail::ContentsTypeCalendar || + type == KMail::ContentsTypeTask; + if ( mIncidencesForComboBox ) + mIncidencesForComboBox->setEnabled( enable ); + if ( mAlarmsBlockedCheckBox ) + mAlarmsBlockedCheckBox->setEnabled( enable ); +} + +//----------------------------------------------------------------------------- +bool FolderDiaGeneralTab::save() +{ + KMFolder* folder = mDlg->folder(); + folder->setIdentity( mIdentityComboBox->currentIdentity() ); + // set whoField + if (mShowSenderReceiverComboBox->currentItem() == 1) + folder->setUserWhoField("From"); + else if (mShowSenderReceiverComboBox->currentItem() == 2) + folder->setUserWhoField("To"); + else + folder->setUserWhoField(""); + + folder->setIgnoreNewMail( !mNotifyOnNewMailCheckBox->isChecked() ); + folder->setPutRepliesInSameFolder( mKeepRepliesInSameFolderCheckBox->isChecked() ); + + QString fldName, oldFldName; + if ( !mIsLocalSystemFolder ) + { + QString acctName; + oldFldName = mDlg->folder()->name(); + + if (!mNameEdit->text().isEmpty()) + fldName = mNameEdit->text(); + else + fldName = oldFldName; + + if ( mDlg->parentFolder() && + mDlg->parentFolder()->folderType() != KMFolderTypeImap && + mDlg->parentFolder()->folderType() != KMFolderTypeCachedImap ) + fldName.remove('/'); + fldName.remove(QRegExp("^\\.*")); + if (fldName.isEmpty()) fldName = i18n("unnamed"); + + + // Update the tree iff new icon paths are different and not empty or if + // useCustomIcons changed. + if ( folder->useCustomIcons() != mIconsCheckBox->isChecked() ) { + folder->setUseCustomIcons( mIconsCheckBox->isChecked() ); + // Reset icons, useCustomIcons was turned off. + if ( !folder->useCustomIcons() ) { + folder->setIconPaths( "", "" ); + } + } + if ( folder->useCustomIcons() && + (( mNormalIconButton->icon() != folder->normalIconPath() ) && + ( !mNormalIconButton->icon().isEmpty())) || + (( mUnreadIconButton->icon() != folder->unreadIconPath() ) && + ( !mUnreadIconButton->icon().isEmpty())) ) { + folder->setIconPaths( mNormalIconButton->icon(), mUnreadIconButton->icon() ); + } + + // Set type field + if ( mContentsComboBox ) { + KMail::FolderContentsType type = + static_cast<KMail::FolderContentsType>( mContentsComboBox->currentItem() ); + folder->storage()->setContentsType( type ); + } + + if ( folder->folderType() == KMFolderTypeCachedImap ) { + KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( mDlg->folder()->storage() ); + if ( mIncidencesForComboBox ) { + KMFolderCachedImap::IncidencesFor incfor = KMFolderCachedImap::IncForAdmins; + incfor = static_cast<KMFolderCachedImap::IncidencesFor>( mIncidencesForComboBox->currentItem() ); + if ( dimap->incidencesFor() != incfor ) { + dimap->setIncidencesFor( incfor ); + dimap->writeConfig(); + } + } + if ( mAlarmsBlockedCheckBox && mAlarmsBlockedCheckBox->isChecked() != dimap->alarmsBlocked() ) { + dimap->setAlarmsBlocked( mAlarmsBlockedCheckBox->isChecked() ); + dimap->writeConfig(); + } + } + + if( folder->folderType() == KMFolderTypeImap ) + { + KMFolderImap* imapFolder = static_cast<KMFolderImap*>( folder->storage() ); + imapFolder->setIncludeInMailCheck( + mNewMailCheckBox->isChecked() ); + } + // make sure everything is on disk, connected slots will call readConfig() + // when creating a new folder. + folder->storage()->writeConfig(); + // Renamed an existing folder? We don't check for oldName == newName on + // purpose here. The folder might be pending renaming on the next dimap + // sync already, in which case the old name would still be around and + // something like Calendar -> CalendarFoo -> Calendar inbetween syncs would + // fail. Therefor let the folder sort it out itself, whether the rename is + // a noop or not. + if ( !oldFldName.isEmpty() ) + { + kmkernel->folderMgr()->renameFolder( folder, fldName ); + } else { + kmkernel->folderMgr()->contentsChanged(); + } + } + return true; +} + +void FolderDiaGeneralTab::slotChangeIcon( QString icon ) // can't use a const-ref here, due to KIconButton's signal +{ + mUnreadIconButton->setIcon( icon ); +} + +//---------------------------------------------------------------------------- +KMail::FolderDiaTemplatesTab::FolderDiaTemplatesTab( KMFolderDialog* dlg, + QWidget* parent ) + : FolderDiaTab( parent, 0 ), mDlg( dlg ) +{ + + mIsLocalSystemFolder = mDlg->folder()->isSystemFolder() && + mDlg->folder()->folderType() != KMFolderTypeImap && + mDlg->folder()->folderType() != KMFolderTypeCachedImap; + + QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() ); + + mCustom = new QCheckBox( i18n("&Use custom message templates"), this ); + topLayout->addWidget( mCustom ); + + mWidget = new TemplatesConfiguration( this , "folder-templates" ); + mWidget->setEnabled( false ); + topLayout->addWidget( mWidget ); + + QHBoxLayout *btns = new QHBoxLayout( topLayout, KDialog::spacingHint() ); + mCopyGlobal = new KPushButton( i18n("&Copy global templates"), this ); + mCopyGlobal->setEnabled( false ); + btns->addWidget( mCopyGlobal ); + + connect( mCustom, SIGNAL(toggled(bool)), + mWidget, SLOT(setEnabled(bool)) ); + connect( mCustom, SIGNAL(toggled(bool)), + mCopyGlobal, SLOT(setEnabled(bool)) ); + + connect( mCopyGlobal, SIGNAL(clicked()), + this, SLOT(slotCopyGlobal()) ); + + initializeWithValuesFromFolder( mDlg->folder() ); + + connect( mWidget, SIGNAL( changed() ), + this, SLOT( slotEmitChanged( void ) ) ); +} + +void FolderDiaTemplatesTab::load() +{ + +} + +void FolderDiaTemplatesTab::initializeWithValuesFromFolder( KMFolder* folder ) { + if ( !folder ) + return; + + mFolder = folder; + + QString fid = folder->idString(); + + Templates t( fid ); + + mCustom->setChecked(t.useCustomTemplates()); + + mIdentity = folder->identity(); + + mWidget->loadFromFolder( fid, mIdentity ); +} + +//----------------------------------------------------------------------------- +bool FolderDiaTemplatesTab::save() +{ + KMFolder* folder = mDlg->folder(); + + QString fid = folder->idString(); + Templates t(fid); + + kdDebug() << "use custom templates for folder " << fid << ": " << mCustom->isChecked() << endl; + t.setUseCustomTemplates(mCustom->isChecked()); + t.writeConfig(); + + mWidget->saveToFolder(fid); + + return true; +} + + +void FolderDiaTemplatesTab::slotEmitChanged() {} + +void FolderDiaTemplatesTab::slotCopyGlobal() { + if ( mIdentity ) { + mWidget->loadFromIdentity( mIdentity ); + } + else { + mWidget->loadFromGlobal(); + } +} |