You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1460 lines
54 KiB
1460 lines
54 KiB
// -*- 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "kmkernel.h" |
|
#include "kmcommands.h" |
|
#include "mailinglist-magic.h" |
|
#include "kmfoldertree.h" |
|
#include "folderdiaacltab.h" |
|
#include "folderdiaquotatab.h" |
|
#include "kmailicalifaceimpl.h" |
|
#include "kmmainwidget.h" |
|
#include "globalsettings.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 <qcheckbox.h> |
|
#include <qlayout.h> |
|
#include <qgroupbox.h> |
|
#include <qregexp.h> |
|
#include <qlabel.h> |
|
#include <qvbox.h> |
|
#include <qwhatsthis.h> |
|
|
|
#include <assert.h> |
|
#include <qhbuttongroup.h> |
|
#include <qradiobutton.h> |
|
|
|
#include "kmfolderdia.moc" |
|
|
|
using namespace KMail; |
|
|
|
//----------------------------------------------------------------------------- |
|
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 ), |
|
mPositionInFolderList( 0 ), |
|
mIsNewFolder( aFolder == 0 ) |
|
{ |
|
kdDebug(5006)<<"KMFolderDialog::KMFolderDialog()" << endl; |
|
|
|
if( !mFolder ) { |
|
// new folder can be subfolder of any other folder |
|
aParent->createFolderList(&mFolderNameList, &mFolders, true, true, |
|
true, false, true, false); |
|
} |
|
else if( mFolder->folderType() != KMFolderTypeImap |
|
&& mFolder->folderType() != KMFolderTypeCachedImap ) { |
|
// already existant local folder can only be moved locally |
|
aParent->createFolderList(&mFolderNameList, &mFolders, true, false, |
|
false, false, true, false); |
|
} |
|
else { |
|
// already existant IMAP folder can't be moved, but we add all |
|
// IMAP folders so that the correct parent folder can be shown |
|
aParent->createFolderList(&mFolderNameList, &mFolders, false, true, |
|
true, false, true, false); |
|
} |
|
|
|
mFolderNameList.prepend( i18n( "Local Folders" ) ); |
|
|
|
if( mFolderDir ) { |
|
// search the parent folder of the folder |
|
// kdDebug(5006) << "search the parent folder of the folder" << endl; |
|
FolderList::ConstIterator it; |
|
int i = 1; |
|
for( it = mFolders.begin(); it != mFolders.end(); ++it, ++i ) { |
|
// kdDebug(5006) << "checking folder '" << (*it)->label() << "'" << endl; |
|
if( (*it)->child() == mFolderDir ) { |
|
mParentFolder = *it; |
|
mPositionInFolderList = i; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
// Now create the folder list for the "move expired message to..." combo |
|
aParent->createFolderList(&mMoveToFolderNameList, &mMoveToFolderList, true, true, |
|
true, false, true, true); // all except search folders |
|
|
|
|
|
FolderDiaTab* tab; |
|
QVBox* box; |
|
|
|
box = addVBoxPage( i18n("General") ); |
|
tab = new FolderDiaGeneralTab( this, aName, box ); |
|
addTab( tab ); |
|
|
|
if ( !mFolder || !mFolder->noContent() ) |
|
{ |
|
box = addVBoxPage( i18n("Old Message Expiry") ); |
|
tab = new FolderDiaExpiryTab( this, box ); |
|
addTab( tab ); |
|
|
|
box = addVBoxPage( i18n("Mailing List") ); |
|
tab = new FolderDiaMailingListTab( 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 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; |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
KMail::FolderDiaGeneralTab::FolderDiaGeneralTab( KMFolderDialog* dlg, |
|
const QString& aName, |
|
QWidget* parent, const char* name ) |
|
: FolderDiaTab( parent, name ), mDlg( dlg ) |
|
{ |
|
QLabel *label; |
|
|
|
QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() ); |
|
|
|
QGroupBox *fpGroup = new QGroupBox( i18n("Folder Position"), this, "fpGroup" ); |
|
fpGroup->setColumnLayout( 0, Qt::Vertical ); |
|
|
|
topLayout->addWidget( fpGroup ); |
|
|
|
QHBoxLayout *hl = new QHBoxLayout( fpGroup->layout() ); |
|
hl->setSpacing( 6 ); |
|
|
|
label = new QLabel( i18n("&Name:"), fpGroup ); |
|
hl->addWidget( label ); |
|
|
|
mNameEdit = new KLineEdit( fpGroup ); |
|
if( !mDlg->folder() ) |
|
mNameEdit->setFocus(); |
|
mNameEdit->setText( mDlg->folder() ? mDlg->folder()->label() : i18n("unnamed") ); |
|
if (!aName.isEmpty()) |
|
mNameEdit->setText(aName); |
|
mNameEdit->setMinimumSize(mNameEdit->sizeHint()); |
|
label->setBuddy( mNameEdit ); |
|
hl->addWidget( mNameEdit ); |
|
connect( mNameEdit, SIGNAL( textChanged( const QString & ) ), |
|
this, SLOT( slotFolderNameChanged( const QString & ) ) ); |
|
|
|
QLabel* belongsToLabel = new QLabel( i18n("&Belongs to:" ), fpGroup ); |
|
hl->addWidget( belongsToLabel ); |
|
|
|
mBelongsToComboBox = new QComboBox(fpGroup); |
|
hl->addWidget( mBelongsToComboBox ); |
|
belongsToLabel->setBuddy( mBelongsToComboBox ); |
|
|
|
//start icons group |
|
QGroupBox *iconGroup = new QGroupBox( i18n("Folder Icons"), this, "iconGroup" ); |
|
iconGroup->setColumnLayout( 0, Qt::Vertical ); |
|
|
|
topLayout->addWidget( iconGroup ); |
|
|
|
QVBoxLayout *ivl = new QVBoxLayout( iconGroup->layout() ); |
|
ivl->setSpacing( 6 ); |
|
|
|
QHBoxLayout *ihl = new QHBoxLayout( ivl ); |
|
mIconsCheckBox = new QCheckBox( i18n("Use custom &icons"), iconGroup ); |
|
mIconsCheckBox->setChecked( false ); |
|
ihl->addWidget( mIconsCheckBox ); |
|
ihl->addStretch( 2 ); |
|
|
|
mNormalIconLabel = new QLabel( i18n("&Normal:"), iconGroup ); |
|
mNormalIconLabel->setEnabled( false ); |
|
ihl->addWidget( mNormalIconLabel ); |
|
|
|
mNormalIconButton = new KIconButton( iconGroup ); |
|
mNormalIconLabel->setBuddy( mNormalIconButton ); |
|
mNormalIconButton->setIconType( KIcon::NoGroup , KIcon::Any, true ); |
|
mNormalIconButton->setIconSize( 16 ); |
|
mNormalIconButton->setStrictIconSize( true ); |
|
mNormalIconButton->setFixedSize( 28, 28 ); |
|
mNormalIconButton->setIcon( QString("folder") ); |
|
mNormalIconButton->setEnabled( false ); |
|
ihl->addWidget( mNormalIconButton ); |
|
|
|
mUnreadIconLabel = new QLabel( i18n("&Unread:"), iconGroup ); |
|
mUnreadIconLabel->setEnabled( false ); |
|
ihl->addWidget( mUnreadIconLabel ); |
|
|
|
mUnreadIconButton = new KIconButton( iconGroup ); |
|
mUnreadIconLabel->setBuddy( mUnreadIconButton ); |
|
mUnreadIconButton->setIconType( KIcon::NoGroup, KIcon::Any, true ); |
|
mUnreadIconButton->setIconSize( 16 ); |
|
mUnreadIconButton->setStrictIconSize( true ); |
|
mUnreadIconButton->setFixedSize( 28, 28 ); |
|
mUnreadIconButton->setIcon( QString("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 |
|
|
|
mMailboxTypeGroupBox = new QGroupBox( i18n("Folder Type"), this, "mMailboxTypeGroupBox" ); |
|
mMailboxTypeGroupBox->setColumnLayout( 0, Qt::Vertical ); |
|
|
|
topLayout->addWidget( mMailboxTypeGroupBox ); |
|
|
|
QHBoxLayout *ml = new QHBoxLayout( mMailboxTypeGroupBox->layout() ); |
|
ml->setSpacing( 6 ); |
|
|
|
QLabel *label_type = new QLabel( i18n("&Mailbox format:" ), mMailboxTypeGroupBox ); |
|
ml->addWidget( label_type ); |
|
mMailboxTypeComboBox = new QComboBox(mMailboxTypeGroupBox); |
|
label_type->setBuddy( mMailboxTypeComboBox ); |
|
mMailboxTypeComboBox->insertItem("mbox", 0); |
|
mMailboxTypeComboBox->insertItem("maildir", 1); |
|
mMailboxTypeComboBox->insertItem("search", 2); |
|
{ |
|
KConfig *config = KMKernel::config(); |
|
KConfigGroupSaver saver(config, "General"); |
|
int type = config->readNumEntry("default-mailbox-format", 1); |
|
if ( type < 0 || type > 1 ) type = 1; |
|
mMailboxTypeComboBox->setCurrentItem( type ); |
|
} |
|
mMailboxTypeComboBox->setEnabled( !mDlg->folder() ); |
|
ml->addWidget( mMailboxTypeComboBox ); |
|
ml->addStretch( 1 ); |
|
|
|
mBelongsToComboBox->insertStringList( mDlg->folderNameList() ); |
|
// we want to know if the activated changes |
|
connect( mBelongsToComboBox, SIGNAL(activated(int)), SLOT(slotUpdateItems(int)) ); |
|
|
|
QGroupBox *idGroup = new QGroupBox( i18n("Identity" ), this ); |
|
idGroup->setColumnLayout( 0, Qt::Vertical ); |
|
QHBoxLayout *idLayout = new QHBoxLayout(idGroup->layout()); |
|
idLayout->setSpacing( 6 ); |
|
topLayout->addWidget( idGroup ); |
|
|
|
label = new QLabel( i18n("&Sender:"), idGroup ); |
|
idLayout->addWidget( label ); |
|
mIdentityComboBox = new KPIM::IdentityCombo( kmkernel->identityManager(), idGroup ); |
|
label->setBuddy( mIdentityComboBox ); |
|
idLayout->addWidget( mIdentityComboBox, 3 ); |
|
|
|
QGroupBox* senderGroup = new QGroupBox( i18n("Show Sender/Receiver"), this, "senderGroup" ); |
|
senderGroup->setColumnLayout( 0, Qt::Vertical ); |
|
|
|
topLayout->addWidget( senderGroup ); |
|
|
|
QHBoxLayout *sl = new QHBoxLayout( senderGroup->layout() ); |
|
sl->setSpacing( 6 ); |
|
|
|
QLabel *sender_label = new QLabel( i18n("Sho&w:" ), senderGroup ); |
|
sl->addWidget( sender_label ); |
|
mShowSenderReceiverComboBox = new QComboBox(senderGroup); |
|
sender_label->setBuddy(mShowSenderReceiverComboBox); |
|
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); |
|
if (whoField == "From") mShowSenderReceiverComboBox->setCurrentItem(1); |
|
if (whoField == "To") mShowSenderReceiverComboBox->setCurrentItem(2); |
|
|
|
sl->addWidget( mShowSenderReceiverComboBox ); |
|
sl->addStretch( 1 ); |
|
|
|
if ( kmkernel->iCalIface().isEnabled() && |
|
!kmkernel->iCalIface().isResourceFolder( mDlg->folder() ) ) { |
|
// Only do make this settable, if the IMAP resource is enabled |
|
// and it's not the personal folders (those must not be changed) |
|
QGroupBox *typeGroup = new QGroupBox( i18n("Contents" ), this ); |
|
typeGroup->setColumnLayout( 0, Qt::Vertical ); |
|
QHBoxLayout *typeLayout = new QHBoxLayout( typeGroup->layout() ); |
|
typeLayout->setSpacing( 6 ); |
|
topLayout->addWidget( typeGroup ); |
|
label = new QLabel( i18n("&Folder contents:"), typeGroup ); |
|
typeLayout->addWidget( label ); |
|
mContentsComboBox = new QComboBox( typeGroup ); |
|
label->setBuddy( mContentsComboBox ); |
|
typeLayout->addWidget( mContentsComboBox, 3 ); |
|
|
|
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 ) ) ); |
|
} else { |
|
mContentsComboBox = 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 || |
|
( mDlg->folder() && ( mDlg->folder()->storage()->contentsType() == KMail::ContentsTypeCalendar |
|
|| mDlg->folder()->storage()->contentsType() == KMail::ContentsTypeTask ) ) ) ) { |
|
mIncidencesForGroup = new QGroupBox( i18n("Relevance of Events and Tasks" ), this ); |
|
mIncidencesForGroup->setColumnLayout( 0, Qt::Vertical ); |
|
QHBoxLayout *relevanceLayout = new QHBoxLayout( mIncidencesForGroup->layout() ); |
|
relevanceLayout->setSpacing( 6 ); |
|
topLayout->addWidget( mIncidencesForGroup ); |
|
|
|
QLabel* label = new QLabel( i18n( "Generate free/&busy and activate alarms for:" ), mIncidencesForGroup ); |
|
relevanceLayout->addWidget( label ); |
|
mIncidencesForComboBox = new QComboBox( mIncidencesForGroup ); |
|
label->setBuddy( mIncidencesForComboBox ); |
|
relevanceLayout->addWidget( mIncidencesForComboBox, 3 ); |
|
|
|
QWhatsThis::add( mIncidencesForComboBox, |
|
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." ) ); |
|
|
|
mIncidencesForComboBox->insertItem( i18n( "Nobody" ) ); |
|
mIncidencesForComboBox->insertItem( i18n( "Admins of this folder" ) ); |
|
mIncidencesForComboBox->insertItem( i18n( "All readers of this folder" ) ); |
|
|
|
//connect ( mIncidencesForComboBox, SIGNAL ( activated( int ) ), |
|
// this, SLOT( slotIncidencesForChanged( int ) ) ); |
|
if ( mContentsComboBox && mDlg->folder()&& mIncidencesForGroup ) { |
|
KMail::FolderContentsType type = mDlg->folder()->storage()->contentsType(); |
|
mIncidencesForGroup->setEnabled( type == KMail::ContentsTypeCalendar || |
|
type == KMail::ContentsTypeTask ); |
|
} |
|
|
|
} else { |
|
mIncidencesForComboBox = 0; |
|
mIncidencesForGroup = 0; |
|
} |
|
|
|
// should this folder be included in new-mail-checks? |
|
QGroupBox* newmailGroup = new QGroupBox( i18n("Check for New Mail"), this, "newmailGroup" ); |
|
newmailGroup->setColumnLayout( 0, Qt::Vertical ); |
|
topLayout->addWidget( newmailGroup ); |
|
|
|
QHBoxLayout *nml = new QHBoxLayout( newmailGroup->layout() ); |
|
nml->setSpacing( 6 ); |
|
mNewMailCheckBox = new QCheckBox( i18n("Include in check" ), newmailGroup ); |
|
// default is on |
|
mNewMailCheckBox->setChecked(true); |
|
nml->addWidget( mNewMailCheckBox ); |
|
nml->addStretch( 1 ); |
|
|
|
// should new mail in this folder be ignored? |
|
QGroupBox* notifyGroup = new QGroupBox( i18n("New Mail Notification"), this, |
|
"notifyGroup" ); |
|
notifyGroup->setColumnLayout( 0, Qt::Vertical ); |
|
topLayout->addWidget( notifyGroup ); |
|
|
|
QHBoxLayout *hbl = new QHBoxLayout( notifyGroup->layout() ); |
|
hbl->setSpacing( KDialog::spacingHint() ); |
|
mIgnoreNewMailCheckBox = |
|
new QCheckBox( i18n("Ignore new mail in this folder" ), notifyGroup ); |
|
QWhatsThis::add( mIgnoreNewMailCheckBox, |
|
i18n( "Check this option if you do not want to be notified " |
|
"about new mail that is moved to this folder; this " |
|
"is useful, for example, for ignoring spam." ) ); |
|
hbl->addWidget( mIgnoreNewMailCheckBox ); |
|
hbl->addStretch( 1 ); |
|
|
|
// should replies to mails in this folder be kept in this same folder? |
|
QGroupBox* replyGroup = new QGroupBox( i18n("Reply Handling"), this, |
|
"replyGroup" ); |
|
replyGroup->setColumnLayout( 0, Qt::Vertical ); |
|
topLayout->addWidget( replyGroup ); |
|
|
|
hbl = new QHBoxLayout( replyGroup->layout() ); |
|
hbl->setSpacing( KDialog::spacingHint() ); |
|
mKeepRepliesInSameFolderCheckBox = |
|
new QCheckBox( i18n("Keep replies in this folder" ), replyGroup ); |
|
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 ); |
|
|
|
topLayout->addStretch( 100 ); // eat all superfluous space |
|
|
|
KMFolder* parentFolder = mDlg->parentFolder(); |
|
|
|
if ( parentFolder ) { |
|
mBelongsToComboBox->setCurrentItem( mDlg->positionInFolderList() ); |
|
slotUpdateItems( mDlg->positionInFolderList() ); |
|
} |
|
|
|
if ( mDlg->folder() ) { |
|
// existing folder |
|
initializeWithValuesFromFolder( mDlg->folder() ); |
|
|
|
// mailbox folder type |
|
switch ( mDlg->folder()->folderType() ) { |
|
case KMFolderTypeSearch: |
|
mMailboxTypeComboBox->setCurrentItem( 2 ); |
|
belongsToLabel->hide(); |
|
mBelongsToComboBox->hide(); |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeMaildir: |
|
mMailboxTypeComboBox->setCurrentItem( 1 ); |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeMbox: |
|
mMailboxTypeComboBox->setCurrentItem( 0 ); |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeImap: |
|
belongsToLabel->setEnabled( false ); |
|
mBelongsToComboBox->setEnabled( false ); |
|
mMailboxTypeGroupBox->hide(); |
|
break; |
|
case KMFolderTypeCachedImap: |
|
belongsToLabel->setEnabled( false ); |
|
mBelongsToComboBox->setEnabled( false ); |
|
mMailboxTypeGroupBox->hide(); |
|
newmailGroup->hide(); |
|
break; |
|
default: ; |
|
} |
|
} |
|
|
|
else if ( parentFolder ) { |
|
// new folder |
|
initializeWithValuesFromFolder( parentFolder ); |
|
|
|
// mailbox folder type |
|
switch ( parentFolder->folderType() ) { |
|
case KMFolderTypeSearch: |
|
mMailboxTypeComboBox->setCurrentItem( 2 ); |
|
belongsToLabel->hide(); |
|
mBelongsToComboBox->hide(); |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeMaildir: |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeMbox: |
|
newmailGroup->hide(); |
|
break; |
|
case KMFolderTypeImap: |
|
mMailboxTypeGroupBox->hide(); |
|
break; |
|
case KMFolderTypeCachedImap: |
|
mMailboxTypeGroupBox->hide(); |
|
newmailGroup->hide(); |
|
break; |
|
default: ; |
|
} |
|
} |
|
|
|
// Musn't be able to edit details for a system folder. |
|
// Make sure we don't bomb out if there isn't a folder |
|
// object yet (i.e. just about to create new folder). |
|
|
|
if ( mDlg->folder() && mDlg->folder()->isSystemFolder() && |
|
mDlg->folder()->folderType() != KMFolderTypeImap && |
|
mDlg->folder()->folderType() != KMFolderTypeCachedImap ) { |
|
fpGroup->hide(); |
|
iconGroup->hide(); |
|
mMailboxTypeGroupBox->hide(); |
|
idGroup->hide(); |
|
} |
|
} |
|
|
|
void FolderDiaGeneralTab::load() |
|
{ |
|
// Nothing here, all is done in the ctor |
|
} |
|
|
|
void FolderDiaGeneralTab::initializeWithValuesFromFolder( KMFolder* folder ) { |
|
if ( !folder ) |
|
return; |
|
|
|
// 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 |
|
mIgnoreNewMailCheckBox->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); |
|
} |
|
|
|
bool isImap = /*folder->folderType() == KMFolderTypeImap ||*/ folder->folderType() == KMFolderTypeCachedImap; |
|
if ( mIncidencesForGroup ) { |
|
if ( !isImap ) |
|
mIncidencesForGroup->hide(); |
|
else { |
|
KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( folder->storage() ); |
|
mIncidencesForComboBox->setCurrentItem( dimap->incidencesFor() ); |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void FolderDiaGeneralTab::slotFolderNameChanged( const QString& str ) |
|
{ |
|
mDlg->enableButtonOK( !str.isEmpty() ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void FolderDiaGeneralTab::slotUpdateItems ( int current ) |
|
{ |
|
KMFolder* selectedFolder = 0; |
|
// check if the index is valid (the top level has no entrance in the mDlg->folders()) |
|
if (current > 0) selectedFolder = *mDlg->folders().at(current - 1); |
|
if (selectedFolder && (selectedFolder->folderType() == KMFolderTypeImap || |
|
selectedFolder->folderType() == KMFolderTypeCachedImap)) |
|
{ |
|
// deactivate stuff that is not available for imap |
|
mMailboxTypeGroupBox->setEnabled( false ); |
|
} else { |
|
// activate it |
|
mMailboxTypeGroupBox->setEnabled( true ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
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 ); |
|
} |
|
|
|
if ( mIncidencesForGroup ) |
|
mIncidencesForGroup->setEnabled( type == KMail::ContentsTypeCalendar || |
|
type == KMail::ContentsTypeTask ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
bool FolderDiaGeneralTab::save() |
|
{ |
|
QString oldFldName; |
|
if( !mDlg->isNewFolder() ) oldFldName = mDlg->folder()->name(); |
|
QString fldName = !mNameEdit->text().isEmpty() ? mNameEdit->text() : oldFldName; |
|
if ( mDlg->parentFolder() && |
|
mDlg->parentFolder()->folderType() != KMFolderTypeImap && |
|
mDlg->parentFolder()->folderType() != KMFolderTypeCachedImap ) |
|
fldName.remove('/'); |
|
fldName.remove(QRegExp("^\\.*")); |
|
if (fldName.isEmpty()) fldName = i18n("unnamed"); |
|
|
|
// moving of IMAP folders is not yet supported |
|
if ( mDlg->isNewFolder() || !mDlg->folder()->isSystemFolder() ) |
|
{ |
|
QString acctName; |
|
KMFolderDir *selectedFolderDir = &(kmkernel->folderMgr()->dir()); |
|
KMFolder *selectedFolder = 0; |
|
int curFolder = mBelongsToComboBox->currentItem(); |
|
|
|
if (mMailboxTypeComboBox->currentItem() == 2) { |
|
selectedFolderDir = &(kmkernel->searchFolderMgr()->dir()); |
|
} |
|
else if (curFolder != 0) |
|
{ |
|
selectedFolder = *mDlg->folders().at(curFolder - 1); |
|
selectedFolderDir = selectedFolder->createChildFolder(); |
|
} |
|
|
|
QString message = i18n( "<qt>Failed to create folder <b>%1</b>, folder already exists.</qt>" ).arg(fldName); |
|
if( selectedFolderDir->hasNamedFolder( fldName ) |
|
&& ( !( mDlg->folder() |
|
&& ( selectedFolderDir == mDlg->folder()->parent() ) |
|
&& ( mDlg->folder()->name() == fldName ) ) ) ) |
|
{ |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
|
|
message = i18n( "<qt>Cannot move folder <b>%1</b> into a subfolder below itself.</qt>" ).arg(fldName); |
|
KMFolderDir* folderDir = selectedFolderDir; |
|
|
|
|
|
// Buggy? |
|
if( mDlg->folder() && mDlg->folder()->child() ) { |
|
while( ( folderDir != &kmkernel->folderMgr()->dir() ) |
|
&& ( folderDir != mDlg->folder()->parent() ) ) { |
|
if( folderDir->findRef( mDlg->folder() ) != -1 ) { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
folderDir = folderDir->parent(); |
|
} |
|
} |
|
// End buggy? |
|
|
|
|
|
if( mDlg->folder() && mDlg->folder()->child() && selectedFolderDir && |
|
( selectedFolderDir->path().find( mDlg->folder()->child()->path() + "/" ) == 0 ) ) { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
|
|
if( mDlg->folder() && mDlg->folder()->child() |
|
&& ( selectedFolderDir == mDlg->folder()->child() ) ) { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
|
|
if( mDlg->isNewFolder() ) { |
|
|
|
if ( fldName.find( '/' ) != -1 ) { |
|
KMessageBox::error( this, i18n( "Folder names can't contain the / (slash) character, please choose another folder name" ) ); |
|
return false; |
|
} |
|
message = i18n( "<qt>Failed to create folder <b>%1</b>." |
|
"</qt> " ).arg(fldName); |
|
|
|
if (selectedFolder && selectedFolder->folderType() == KMFolderTypeImap) |
|
{ |
|
KMFolder *newFolder = kmkernel->imapFolderMgr()->createFolder( fldName, FALSE, KMFolderTypeImap, selectedFolderDir ); |
|
if ( newFolder ) { |
|
mDlg->setFolder( newFolder ); |
|
KMFolderImap* selectedStorage = static_cast<KMFolderImap*>(selectedFolder->storage()); |
|
selectedStorage->createFolder(fldName); // create it on the server |
|
static_cast<KMFolderImap*>(mDlg->folder()->storage())->setAccount( selectedStorage->account() ); |
|
} else { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
} else if (selectedFolder && selectedFolder->folderType() == KMFolderTypeCachedImap){ |
|
KMFolder *newFolder = kmkernel->dimapFolderMgr()->createFolder( fldName, FALSE, KMFolderTypeCachedImap, selectedFolderDir ); |
|
if ( newFolder ) { |
|
mDlg->setFolder( newFolder ); |
|
KMFolderCachedImap* selectedStorage = static_cast<KMFolderCachedImap*>(selectedFolder->storage()); |
|
KMFolderCachedImap* newStorage = static_cast<KMFolderCachedImap*>(mDlg->folder()->storage()); |
|
newStorage->initializeFrom( selectedStorage ); |
|
} else { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
} else if (mMailboxTypeComboBox->currentItem() == 2) { |
|
KMFolder *folder = kmkernel->searchFolderMgr()->createFolder(fldName, FALSE, KMFolderTypeSearch, &kmkernel->searchFolderMgr()->dir() ); |
|
if ( folder ) { |
|
mDlg->setFolder( folder ); |
|
} else { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
} else if (mMailboxTypeComboBox->currentItem() == 1) { |
|
KMFolder *folder = kmkernel->folderMgr()->createFolder(fldName, FALSE, KMFolderTypeMaildir, selectedFolderDir ); |
|
if ( folder ) { |
|
mDlg->setFolder( folder ); |
|
} else { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
|
|
} else { |
|
KMFolder *folder = kmkernel->folderMgr()->createFolder(fldName, FALSE, KMFolderTypeMbox, selectedFolderDir ); |
|
if ( folder ) { |
|
mDlg->setFolder( folder ); |
|
} else { |
|
KMessageBox::error( this, message ); |
|
return false; |
|
} |
|
|
|
} |
|
} |
|
else if( mDlg->folder()->parent() != selectedFolderDir ) |
|
{ |
|
if( mDlg->folder()->folderType() == KMFolderTypeCachedImap ) { |
|
QString message = i18n("Moving IMAP folders is not supported"); |
|
KMessageBox::error( this, message ); |
|
} else { |
|
mDlg->folder()->rename(fldName, selectedFolderDir ); |
|
kmkernel->folderMgr()->contentsChanged(); |
|
} |
|
} |
|
} |
|
// 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 ( !mDlg->isNewFolder() ) { |
|
mDlg->folder()->rename(fldName); |
|
} |
|
|
|
KMFolder* folder = mDlg->folder(); |
|
if( folder ) { |
|
folder->setIdentity( mIdentityComboBox->currentIdentity() ); |
|
|
|
// 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 whoField |
|
if (mShowSenderReceiverComboBox->currentItem() == 1) |
|
folder->setUserWhoField("From"); |
|
else if (mShowSenderReceiverComboBox->currentItem() == 2) |
|
folder->setUserWhoField("To"); |
|
else |
|
folder->setUserWhoField(QString::null); |
|
|
|
// Set type field |
|
if ( mContentsComboBox ) { |
|
KMail::FolderContentsType type = |
|
static_cast<KMail::FolderContentsType>( mContentsComboBox->currentItem() ); |
|
folder->storage()->setContentsType( type ); |
|
} |
|
|
|
if ( mIncidencesForComboBox && folder->folderType() == KMFolderTypeCachedImap ) { |
|
KMFolderCachedImap::IncidencesFor incfor = |
|
static_cast<KMFolderCachedImap::IncidencesFor>( mIncidencesForComboBox->currentItem() ); |
|
KMFolderCachedImap* dimap = static_cast<KMFolderCachedImap *>( mDlg->folder()->storage() ); |
|
if ( dimap->incidencesFor() != incfor ) { |
|
dimap->setIncidencesFor( incfor ); |
|
dimap->writeConfig(); |
|
} |
|
} |
|
|
|
folder->setIgnoreNewMail( mIgnoreNewMailCheckBox->isChecked() ); |
|
|
|
folder->setPutRepliesInSameFolder( mKeepRepliesInSameFolderCheckBox->isChecked() ); |
|
|
|
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(); |
|
} |
|
kmkernel->folderMgr()->contentsChanged(); |
|
|
|
if ( mDlg->isNewFolder() && folder ) |
|
folder->close(); |
|
return true; |
|
} |
|
|
|
void FolderDiaGeneralTab::slotChangeIcon( QString icon ) // can't use a const-ref here, due to KIconButton's signal |
|
{ |
|
mUnreadIconButton->setIcon( icon ); |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
KMail::FolderDiaExpiryTab::FolderDiaExpiryTab( KMFolderDialog* dlg, |
|
QWidget* parent, |
|
const char* name ) |
|
: FolderDiaTab( parent, name ), mDlg( dlg ) |
|
{ |
|
QLabel *label; |
|
|
|
QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() ); |
|
|
|
// Checkbox for setting whether expiry is enabled on this folder. |
|
mExpireFolderCheckBox = |
|
new QCheckBox( i18n("E&xpire old messages in this folder"), this ); |
|
QObject::connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
this, SLOT( slotExpireFolder( bool ) ) ); |
|
topLayout->addWidget( mExpireFolderCheckBox ); |
|
|
|
QGridLayout *expLayout = new QGridLayout( topLayout ); |
|
|
|
// Expiry time for read documents. |
|
label = new QLabel( i18n("Expire &read email after:"), this ); |
|
label->setEnabled( false ); |
|
QObject::connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
label, SLOT( setEnabled( bool ) ) ); |
|
expLayout->addWidget( label, 1, 0 ); |
|
|
|
mReadExpiryTimeNumInput = new KIntNumInput( this ); |
|
mReadExpiryTimeNumInput->setRange( 1, 500, 1, false ); |
|
label->setBuddy( mReadExpiryTimeNumInput ); |
|
expLayout->addWidget( mReadExpiryTimeNumInput, 1, 1 ); |
|
|
|
mReadExpiryUnitsComboBox = new QComboBox( this ); |
|
mReadExpiryUnitsComboBox->insertItem( i18n("Never") ); |
|
mReadExpiryUnitsComboBox->insertItem( i18n("Day(s)") ); |
|
mReadExpiryUnitsComboBox->insertItem( i18n("Week(s)") ); |
|
mReadExpiryUnitsComboBox->insertItem( i18n("Month(s)") ); |
|
expLayout->addWidget( mReadExpiryUnitsComboBox, 1, 2 ); |
|
connect( mReadExpiryUnitsComboBox, SIGNAL( activated( int ) ), |
|
this, SLOT( slotReadExpiryUnitChanged( int ) ) ); |
|
|
|
// Expiry time for unread documents. |
|
label = new QLabel( i18n("Expire unr&ead email after:"), this ); |
|
label->setEnabled(false); |
|
QObject::connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
label, SLOT( setEnabled( bool ) ) ); |
|
expLayout->addWidget( label, 2, 0 ); |
|
|
|
mUnreadExpiryTimeNumInput = new KIntNumInput( this ); |
|
mUnreadExpiryTimeNumInput->setRange( 1, 500, 1, false ); |
|
label->setBuddy( mUnreadExpiryTimeNumInput ); |
|
expLayout->addWidget( mUnreadExpiryTimeNumInput, 2, 1 ); |
|
|
|
mUnreadExpiryUnitsComboBox = new QComboBox( this ); |
|
mUnreadExpiryUnitsComboBox->insertItem( i18n("Never") ); |
|
mUnreadExpiryUnitsComboBox->insertItem( i18n("Day(s)") ); |
|
mUnreadExpiryUnitsComboBox->insertItem( i18n("Week(s)") ); |
|
mUnreadExpiryUnitsComboBox->insertItem( i18n("Month(s)") ); |
|
expLayout->addWidget( mUnreadExpiryUnitsComboBox, 2, 2 ); |
|
connect( mUnreadExpiryUnitsComboBox, SIGNAL( activated( int ) ), |
|
this, SLOT( slotUnreadExpiryUnitChanged( int ) ) ); |
|
|
|
expLayout->setColStretch( 3, 100 ); |
|
|
|
// delete or archive old messages |
|
QButtonGroup* radioBG = new QButtonGroup( this ); |
|
radioBG->hide(); // just for the exclusive behavior |
|
mExpireActionDelete = new QRadioButton( i18n( "Delete old messages" ), |
|
this ); |
|
radioBG->insert( mExpireActionDelete ); |
|
topLayout->addWidget( mExpireActionDelete ); |
|
|
|
QHBoxLayout *hbl = new QHBoxLayout( topLayout ); |
|
mExpireActionMove = new QRadioButton( i18n( "Move old messages to:" ), |
|
this ); |
|
radioBG->insert( mExpireActionMove ); |
|
hbl->addWidget( mExpireActionMove ); |
|
mExpireToFolderComboBox = new QComboBox( this ); |
|
hbl->addWidget( mExpireToFolderComboBox ); |
|
mExpireToFolderComboBox->insertStringList( mDlg->moveToFolderNameList() ); |
|
hbl->addStretch( 100 ); |
|
|
|
topLayout->addStretch( 100 ); // eat all superfluous space |
|
|
|
connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
mExpireActionDelete, SLOT( setEnabled( bool ) ) ); |
|
connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
mExpireActionMove, SLOT( setEnabled( bool ) ) ); |
|
connect( mExpireFolderCheckBox, SIGNAL( toggled( bool ) ), |
|
mExpireToFolderComboBox, SLOT( setEnabled( bool ) ) ); |
|
} |
|
|
|
void FolderDiaExpiryTab::load() |
|
{ |
|
KMFolder* folder = mDlg->folder(); |
|
if( folder ) { |
|
// settings for automatic deletion of old messages |
|
mExpireFolderCheckBox->setChecked( folder->isAutoExpire() ); |
|
// Legal values for units are 0=never, 1=days, 2=weeks, 3=months. |
|
if( folder->getReadExpireUnits() >= 0 |
|
&& folder->getReadExpireUnits() < expireMaxUnits ) { |
|
mReadExpiryUnitsComboBox->setCurrentItem( folder->getReadExpireUnits() ); |
|
} |
|
if( folder->getUnreadExpireUnits() >= 0 |
|
&& folder->getUnreadExpireUnits() < expireMaxUnits ) { |
|
mUnreadExpiryUnitsComboBox->setCurrentItem( folder->getUnreadExpireUnits() ); |
|
} |
|
int age = folder->getReadExpireAge(); |
|
if ( age >= 1 && age <= 500 ) { |
|
mReadExpiryTimeNumInput->setValue( age ); |
|
} else { |
|
mReadExpiryTimeNumInput->setValue( 7 ); |
|
} |
|
age = folder->getUnreadExpireAge(); |
|
if ( age >= 1 && age <= 500 ) { |
|
mUnreadExpiryTimeNumInput->setValue( age ); |
|
} else { |
|
mUnreadExpiryTimeNumInput->setValue( 28 ); |
|
} |
|
if ( folder->expireAction() == KMFolder::ExpireDelete ) |
|
mExpireActionDelete->setChecked( true ); |
|
else |
|
mExpireActionMove->setChecked( true ); |
|
QString destFolderID = folder->expireToFolderId(); |
|
if ( !destFolderID.isEmpty() ) { |
|
KMFolderDialog::FolderList moveToFolderList = mDlg->moveToFolderList(); |
|
KMFolder* destFolder = kmkernel->findFolderById( destFolderID ); |
|
int pos = moveToFolderList.findIndex( QGuardedPtr<KMFolder>( destFolder ) ); |
|
if ( pos > -1 ) |
|
mExpireToFolderComboBox->setCurrentItem( pos ); |
|
} |
|
} else { // new folder, use default values |
|
mReadExpiryTimeNumInput->setValue( 7 ); |
|
mUnreadExpiryTimeNumInput->setValue(28); |
|
mExpireActionDelete->setChecked( true ); |
|
} |
|
if( !folder || !folder->isAutoExpire() ) { |
|
mReadExpiryTimeNumInput->setEnabled( false ); |
|
mReadExpiryUnitsComboBox->setEnabled( false ); |
|
mUnreadExpiryTimeNumInput->setEnabled( false ); |
|
mUnreadExpiryUnitsComboBox->setEnabled( false ); |
|
mExpireActionDelete->setEnabled( false ); |
|
mExpireActionMove->setEnabled( false ); |
|
mExpireToFolderComboBox->setEnabled( false ); |
|
} |
|
else { |
|
// disable the number fields if "Never" is selected |
|
mReadExpiryTimeNumInput->setEnabled( mReadExpiryUnitsComboBox->currentItem() != 0 ); |
|
mUnreadExpiryTimeNumInput->setEnabled( mUnreadExpiryUnitsComboBox->currentItem() != 0 ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
bool FolderDiaExpiryTab::save() |
|
{ |
|
KMFolder* folder = mDlg->folder(); |
|
if( !folder ) |
|
return true; |
|
|
|
// Settings for auto expiry of old email messages. |
|
folder->setAutoExpire( mExpireFolderCheckBox->isChecked() ); |
|
folder->setUnreadExpireAge( mUnreadExpiryTimeNumInput->value() ); |
|
folder->setReadExpireAge( mReadExpiryTimeNumInput->value() ); |
|
folder->setUnreadExpireUnits( static_cast<ExpireUnits>( mUnreadExpiryUnitsComboBox->currentItem() ) ); |
|
folder->setReadExpireUnits( static_cast<ExpireUnits>( mReadExpiryUnitsComboBox->currentItem() ) ); |
|
if ( mExpireActionDelete->isChecked() ) |
|
folder->setExpireAction( KMFolder::ExpireDelete ); |
|
else |
|
folder->setExpireAction( KMFolder::ExpireMove ); |
|
KMFolder* expireToFolder = |
|
mDlg->moveToFolderList()[mExpireToFolderComboBox->currentItem()]; |
|
if ( expireToFolder ) |
|
folder->setExpireToFolderId( expireToFolder->idString() ); |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* Called when the 'auto expire' toggle is clicked. |
|
* Enables/disables all widgets related to this. |
|
*/ |
|
void FolderDiaExpiryTab::slotExpireFolder(bool expire) |
|
{ |
|
if (expire) { |
|
// disable the number field if "Never" is selected |
|
mReadExpiryTimeNumInput->setEnabled( mReadExpiryUnitsComboBox->currentItem() != 0 ); |
|
mReadExpiryUnitsComboBox->setEnabled(true); |
|
// disable the number field if "Never" is selected |
|
mUnreadExpiryTimeNumInput->setEnabled( mUnreadExpiryUnitsComboBox->currentItem() != 0 ); |
|
mUnreadExpiryUnitsComboBox->setEnabled(true); |
|
} else { |
|
mReadExpiryTimeNumInput->setEnabled(false); |
|
mReadExpiryUnitsComboBox->setEnabled(false); |
|
mUnreadExpiryTimeNumInput->setEnabled(false); |
|
mUnreadExpiryUnitsComboBox->setEnabled(false); |
|
} |
|
} |
|
|
|
|
|
/** |
|
* Enable/disable the number field if appropriate |
|
*/ |
|
void FolderDiaExpiryTab::slotReadExpiryUnitChanged( int value ) |
|
{ |
|
// disable the number field if "Never" is selected |
|
mReadExpiryTimeNumInput->setEnabled( value != 0 ); |
|
} |
|
|
|
|
|
/** |
|
* Enable/disable the number field if appropriate |
|
*/ |
|
void FolderDiaExpiryTab::slotUnreadExpiryUnitChanged( int value ) |
|
{ |
|
// disable the number field if "Never" is selected |
|
mUnreadExpiryTimeNumInput->setEnabled( value != 0 ); |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
FolderDiaMailingListTab::FolderDiaMailingListTab( KMFolderDialog* dlg, |
|
QWidget* parent, const char* name ) |
|
: FolderDiaTab( parent, name ), mDlg( dlg ) |
|
{ |
|
QLabel* label; |
|
mLastItem = 0; |
|
|
|
QVBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint(), |
|
"topLayout" ); |
|
|
|
QGroupBox *mlGroup = new QGroupBox( i18n("Associated Mailing List" ), this ); |
|
mlGroup->setColumnLayout( 0, Qt::Vertical ); |
|
QVBoxLayout *groupLayout = new QVBoxLayout( mlGroup->layout() ); |
|
topLayout->addWidget( mlGroup ); |
|
|
|
mHoldsMailingList = new QCheckBox( i18n("&Folder holds a mailing list"), mlGroup ); |
|
QObject::connect( mHoldsMailingList, SIGNAL(toggled(bool)), |
|
SLOT(slotHoldsML(bool)) ); |
|
groupLayout->addWidget( mHoldsMailingList ); |
|
|
|
groupLayout->addSpacing( 10 ); |
|
|
|
mDetectButton = new QPushButton( i18n("Detect Automatically"), mlGroup ); |
|
mDetectButton->setEnabled( false ); |
|
QObject::connect( mDetectButton, SIGNAL(pressed()), SLOT(slotDetectMailingList()) ); |
|
groupLayout->addWidget( mDetectButton, 0, Qt::AlignHCenter ); |
|
|
|
groupLayout->addSpacing( 10 ); |
|
|
|
QHBoxLayout *handlerLayout = new QHBoxLayout( groupLayout ); |
|
//FIXME: add QWhatsThis |
|
label = new QLabel( i18n("Preferred handler: "), mlGroup ); |
|
QObject::connect( mHoldsMailingList, SIGNAL(toggled(bool)), |
|
label, SLOT(setEnabled(bool)) ); |
|
handlerLayout->addWidget( label, 0, Qt::AlignCenter ); |
|
mMLHandlerCombo = new QComboBox( mlGroup ); |
|
mMLHandlerCombo->insertItem( i18n("KMail"), MailingList::KMail ); |
|
mMLHandlerCombo->insertItem( i18n("Browser"), MailingList::Browser ); |
|
mMLHandlerCombo->setEnabled( false ); |
|
handlerLayout->addWidget( mMLHandlerCombo, 0, Qt::AlignCenter ); |
|
QObject::connect( mMLHandlerCombo, SIGNAL(activated(int)), |
|
SLOT(slotMLHandling(int)) ); |
|
label->setBuddy( mMLHandlerCombo ); |
|
|
|
//groupLayout->addSpacing( 10 ); |
|
|
|
QVBoxLayout *idLayout = new QVBoxLayout( groupLayout ); |
|
label = new QLabel( i18n("<b>Mailing list description: </b>"), mlGroup ); |
|
label->setEnabled( false ); |
|
QObject::connect( mHoldsMailingList, SIGNAL(toggled(bool)), |
|
label, SLOT(setEnabled(bool)) ); |
|
idLayout->addWidget( label, 0 ); |
|
mMLId = new QLabel( label, "", mlGroup ); |
|
idLayout->addWidget( mMLId, 0 ); |
|
mMLId->setEnabled( false ); |
|
|
|
QGridLayout *mlLayout = new QGridLayout( groupLayout ); |
|
mlLayout->setSpacing( 6 ); |
|
// mlLayout->setColStretch(0, 1); |
|
// mlLayout->setColStretch(1, 100); |
|
|
|
label = new QLabel( i18n("&Address type:"), mlGroup ); |
|
label->setEnabled(false); |
|
QObject::connect( mHoldsMailingList, SIGNAL(toggled(bool)), |
|
label, SLOT(setEnabled(bool)) ); |
|
mlLayout->addWidget( label, 0, 0, Qt::AlignTop ); |
|
mAddressCombo = new QComboBox( mlGroup ); |
|
label->setBuddy( mAddressCombo ); |
|
mlLayout->addWidget( mAddressCombo, 0, 1, Qt::AlignTop ); |
|
mAddressCombo->setEnabled( false ); |
|
|
|
//FIXME: if the mailing list actions have either KAction's or toolbar buttons |
|
// associated with them - remove this button since it's really silly |
|
// here |
|
QPushButton *handleButton = new QPushButton( i18n( "Invoke Handler" ), mlGroup ); |
|
handleButton->setEnabled( false ); |
|
if( mDlg->folder()) |
|
{ |
|
QObject::connect( mHoldsMailingList, SIGNAL(toggled(bool)), |
|
handleButton, SLOT(setEnabled(bool)) ); |
|
QObject::connect( handleButton, SIGNAL(clicked()), |
|
SLOT(slotInvokeHandler()) ); |
|
} |
|
mlLayout->addWidget( handleButton, 0, 2, Qt::AlignTop ); |
|
|
|
mEditList = new KEditListBox( mlGroup ); |
|
mEditList->setEnabled( false ); |
|
mlLayout->addMultiCellWidget( mEditList, 1, 2, 0, 3, Qt::AlignTop ); |
|
|
|
QStringList el; |
|
|
|
//Order is important because the activate handler and fillMLFromWidgets |
|
//depend on it |
|
el << i18n( "Post to List" ) |
|
<< i18n( "Subscribe to List" ) |
|
<< i18n( "Unsubscribe from List" ) |
|
<< i18n( "List Archives" ) |
|
<< i18n( "List Help" ); |
|
mAddressCombo->insertStringList( el ); |
|
QObject::connect( mAddressCombo, SIGNAL(activated(int)), |
|
SLOT(slotAddressChanged(int)) ); |
|
} |
|
|
|
void FolderDiaMailingListTab::load() |
|
{ |
|
if (mDlg->folder()) mMailingList = mDlg->folder()->mailingList(); |
|
mMLId->setText( (mMailingList.id().isEmpty() ? i18n("Not available") : mMailingList.id()) ); |
|
mMLHandlerCombo->setCurrentItem( mMailingList.handler() ); |
|
mEditList->insertStringList( mMailingList.postURLS().toStringList() ); |
|
|
|
mAddressCombo->setCurrentItem( mLastItem ); |
|
mHoldsMailingList->setChecked( mDlg->folder() && mDlg->folder()->isMailingListEnabled() ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
bool FolderDiaMailingListTab::save() |
|
{ |
|
KMFolder* folder = mDlg->folder(); |
|
if( folder ) |
|
{ |
|
// settings for mailingList |
|
folder->setMailingListEnabled( mHoldsMailingList && mHoldsMailingList->isChecked() ); |
|
fillMLFromWidgets(); |
|
folder->setMailingList( mMailingList ); |
|
} |
|
return true; |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
void FolderDiaMailingListTab::slotHoldsML( bool holdsML ) |
|
{ |
|
mMLHandlerCombo->setEnabled( holdsML ); |
|
if ( mDlg->folder() && mDlg->folder()->count() ) |
|
mDetectButton->setEnabled( holdsML ); |
|
mAddressCombo->setEnabled( holdsML ); |
|
mEditList->setEnabled( holdsML ); |
|
mMLId->setEnabled( holdsML ); |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
void FolderDiaMailingListTab::slotDetectMailingList() |
|
{ |
|
if ( !mDlg->folder() ) return; // in case the folder was just created |
|
int num = mDlg->folder()->count(); |
|
|
|
kdDebug(5006)<<k_funcinfo<<" Detecting mailing list"<<endl; |
|
|
|
// first try the currently selected message |
|
KMFolderTree *folderTree = static_cast<KMFolderTree *>( mDlg->parent() ); |
|
int curMsgIdx = folderTree->mainWidget()->headers()->currentItemIndex(); |
|
if ( curMsgIdx > 0 ) { |
|
KMMessage *mes = mDlg->folder()->getMsg( curMsgIdx ); |
|
if ( mes ) |
|
mMailingList = MailingList::detect( mes ); |
|
} |
|
|
|
// next try the 5 most recently added messages |
|
if ( !( mMailingList.features() & MailingList::Post ) ) { |
|
const int maxchecks = 5; |
|
for( int i = --num; i > num-maxchecks; --i ) { |
|
KMMessage *mes = mDlg->folder()->getMsg( i ); |
|
if ( !mes ) |
|
continue; |
|
mMailingList = MailingList::detect( mes ); |
|
if ( mMailingList.features() & MailingList::Post ) |
|
break; |
|
} |
|
} |
|
if ( !(mMailingList.features() & MailingList::Post) ) { |
|
KMessageBox::error( this, |
|
i18n("KMail was unable to detect a mailing list in this folder. " |
|
"Please fill the addresses by hand.") ); |
|
} else { |
|
mMLId->setText( (mMailingList.id().isEmpty() ? i18n("Not available.") : mMailingList.id() ) ); |
|
fillEditBox(); |
|
} |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
void FolderDiaMailingListTab::slotMLHandling( int element ) |
|
{ |
|
mMailingList.setHandler( static_cast<MailingList::Handler>( element ) ); |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
void FolderDiaMailingListTab::slotAddressChanged( int i ) |
|
{ |
|
fillMLFromWidgets(); |
|
fillEditBox(); |
|
mLastItem = i; |
|
} |
|
|
|
//---------------------------------------------------------------------------- |
|
void FolderDiaMailingListTab::fillMLFromWidgets() |
|
{ |
|
if ( !mHoldsMailingList->isChecked() ) |
|
return; |
|
|
|
// make sure that email addresses are prepended by "mailto:" |
|
bool changed = false; |
|
QStringList oldList = mEditList->items(); |
|
QStringList newList; // the correct string list |
|
for ( QStringList::ConstIterator it = oldList.begin(); |
|
it != oldList.end(); ++it ) { |
|
if ( !(*it).startsWith("http:") && !(*it).startsWith("https:") && |
|
!(*it).startsWith("mailto:") && ( (*it).find('@') != -1 ) ) { |
|
changed = true; |
|
newList << "mailto:" + *it; |
|
} |
|
else { |
|
newList << *it; |
|
} |
|
} |
|
if ( changed ) { |
|
mEditList->clear(); |
|
mEditList->insertStringList( newList ); |
|
} |
|
|
|
//mMailingList.setHandler( static_cast<MailingList::Handler>( mMLHandlerCombo->currentItem() ) ); |
|
switch ( mLastItem ) { |
|
case 0: |
|
mMailingList.setPostURLS( mEditList->items() ); |
|
break; |
|
case 1: |
|
mMailingList.setSubscribeURLS( mEditList->items() ); |
|
break; |
|
case 2: |
|
mMailingList.setUnsubscribeURLS( mEditList->items() ); |
|
break; |
|
case 3: |
|
mMailingList.setArchiveURLS( mEditList->items() ); |
|
break; |
|
case 4: |
|
mMailingList.setHelpURLS( mEditList->items() ); |
|
break; |
|
default: |
|
kdWarning( 5006 )<<"Wrong entry in the mailing list entry combo!"<<endl; |
|
} |
|
} |
|
|
|
void FolderDiaMailingListTab::fillEditBox() |
|
{ |
|
mEditList->clear(); |
|
switch ( mAddressCombo->currentItem() ) { |
|
case 0: |
|
mEditList->insertStringList( mMailingList.postURLS().toStringList() ); |
|
break; |
|
case 1: |
|
mEditList->insertStringList( mMailingList.subscribeURLS().toStringList() ); |
|
break; |
|
case 2: |
|
mEditList->insertStringList( mMailingList.unsubscribeURLS().toStringList() ); |
|
break; |
|
case 3: |
|
mEditList->insertStringList( mMailingList.archiveURLS().toStringList() ); |
|
break; |
|
case 4: |
|
mEditList->insertStringList( mMailingList.helpURLS().toStringList() ); |
|
break; |
|
default: |
|
kdWarning( 5006 )<<"Wrong entry in the mailing list entry combo!"<<endl; |
|
} |
|
} |
|
|
|
void FolderDiaMailingListTab::slotInvokeHandler() |
|
{ |
|
KMCommand *command =0; |
|
switch ( mAddressCombo->currentItem() ) { |
|
case 0: |
|
command = new KMMailingListPostCommand( this, mDlg->folder() ); |
|
break; |
|
case 1: |
|
command = new KMMailingListSubscribeCommand( this, mDlg->folder() ); |
|
break; |
|
case 2: |
|
command = new KMMailingListUnsubscribeCommand( this, mDlg->folder() ); |
|
break; |
|
case 3: |
|
command = new KMMailingListArchivesCommand( this, mDlg->folder() ); |
|
break; |
|
case 4: |
|
command = new KMMailingListHelpCommand( this, mDlg->folder() ); |
|
break; |
|
default: |
|
kdWarning( 5006 )<<"Wrong entry in the mailing list entry combo!"<<endl; |
|
} |
|
if ( command ) command->start(); |
|
} |
|
|
|
|
|
|