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.
884 lines
33 KiB
884 lines
33 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., 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 TQt library by Trolltech AS, Norway (or with modified versions
|
|
* of TQt that use the same license as TQt), 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
|
|
* TQt. 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 "acljobs.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 <tdeconfig.h>
|
|
#include <kdebug.h>
|
|
#include <klistview.h>
|
|
#include <kpushbutton.h>
|
|
|
|
#include <tqcheckbox.h>
|
|
#include <tqlayout.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqregexp.h>
|
|
#include <tqlabel.h>
|
|
#include <tqvbox.h>
|
|
#include <tqtooltip.h>
|
|
#include <tqwhatsthis.h>
|
|
|
|
#include <assert.h>
|
|
#include <tqhbuttongroup.h>
|
|
#include <tqradiobutton.h>
|
|
#include <tqtextedit.h>
|
|
|
|
#include "templatesconfiguration.h"
|
|
#include "templatesconfiguration_kfg.h"
|
|
|
|
#include "kmfolderdia.moc"
|
|
|
|
using namespace KMail;
|
|
|
|
static TQString inCaseWeDecideToRenameTheTab( I18N_NOOP( "Permissions (ACL)" ) );
|
|
|
|
//-----------------------------------------------------------------------------
|
|
KMFolderDialog::KMFolderDialog(KMFolder *aFolder, KMFolderDir *aFolderDir,
|
|
KMFolderTree* aParent, const TQString& aCap,
|
|
const TQString& 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;
|
|
|
|
TQStringList folderNames;
|
|
TQValueList<TQGuardedPtr<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;
|
|
TQVBox* 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, TQT_SIGNAL( readyForAccept() ),
|
|
this, TQT_SLOT( slotReadyForAccept() ) );
|
|
connect( tab, TQT_SIGNAL( cancelAccept() ),
|
|
this, TQT_SLOT( slotCancelAccept() ) );
|
|
//connect( tab, TQT_SIGNAL(changed( bool )),
|
|
// this, TQT_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::AccepStatus 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 TDECModuleProxy...
|
|
}
|
|
|
|
void KMFolderDialog::setFolder( KMFolder* folder )
|
|
{
|
|
Q_ASSERT( mFolder.isNull() );
|
|
mFolder = folder;
|
|
}
|
|
|
|
static void addLine( TQWidget *parent, TQVBoxLayout* layout )
|
|
{
|
|
TQFrame *line = new TQFrame( parent, "line" );
|
|
line->setGeometry( TQRect( 80, 150, 250, 20 ) );
|
|
line->setFrameShape( TQFrame::HLine );
|
|
line->setFrameShadow( TQFrame::Sunken );
|
|
line->setFrameShape( TQFrame::HLine );
|
|
layout->addWidget( line );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
KMail::FolderDiaGeneralTab::FolderDiaGeneralTab( KMFolderDialog* dlg,
|
|
const TQString& aName,
|
|
TQWidget* parent, const char* name )
|
|
: FolderDiaTab( parent, name ),
|
|
mSharedSeenFlagsCheckBox( 0 ),
|
|
mDlg( dlg )
|
|
{
|
|
|
|
mIsLocalSystemFolder = mDlg->folder()->isSystemFolder();
|
|
mIsResourceFolder = kmkernel->iCalIface().isStandardResourceFolder( mDlg->folder() );
|
|
|
|
TQLabel *label;
|
|
|
|
TQVBoxLayout *topLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() );
|
|
|
|
// Musn't be able to edit details for a non-resource, system folder.
|
|
if ( !mIsLocalSystemFolder || mIsResourceFolder ) {
|
|
|
|
TQHBoxLayout *hl = new TQHBoxLayout( topLayout );
|
|
hl->setSpacing( KDialog::spacingHint() );
|
|
|
|
label = new TQLabel( i18n("&Name:"), this );
|
|
hl->addWidget( label );
|
|
|
|
// Determine if we are allowed to rename this folder. Only possible if the folder supports
|
|
// ACLs.
|
|
bool nameChangeAllowed = true;
|
|
if ( mDlg->folder() && mDlg->parentFolder() &&
|
|
mDlg->folder()->storage() && mDlg->parentFolder()->storage() &&
|
|
( mDlg->folder()->folderType() == KMFolderTypeCachedImap ||
|
|
mDlg->folder()->folderType() == KMFolderTypeImap ) ) {
|
|
ImapAccountBase *account = 0;
|
|
KMFolderCachedImap *dimap = 0;
|
|
KMFolderImap *imap = 0;
|
|
if ( mDlg->folder()->folderType() == KMFolderTypeCachedImap ) {
|
|
dimap = static_cast<KMFolderCachedImap*>( mDlg->folder()->storage() );
|
|
account = dynamic_cast<ImapAccountBase*>( dimap->account() );
|
|
}
|
|
if ( mDlg->folder()->folderType() == KMFolderTypeImap ) {
|
|
imap = static_cast<KMFolderImap*>( mDlg->folder()->storage() );
|
|
account = dynamic_cast<ImapAccountBase*>( imap->account() );
|
|
}
|
|
|
|
if ( account && account->hasACLSupport() ) {
|
|
int parentRights = -1;
|
|
int folderRights = -1;
|
|
bool parentRightsOk = false;
|
|
bool folderRightsOk = false;
|
|
if ( imap ) {
|
|
KMFolderImap * const parent = dynamic_cast<KMFolderImap*>( mDlg->parentFolder()->storage() );
|
|
folderRights = imap->userRights();
|
|
folderRightsOk = imap->userRightsState() == KMail::ACLJobs::Ok;
|
|
if ( parent ) {
|
|
parentRights = parent->userRights();
|
|
parentRightsOk = parent->userRightsState() == KMail::ACLJobs::Ok;
|
|
}
|
|
} else if ( dimap ) {
|
|
KMFolderCachedImap * const parent = dynamic_cast<KMFolderCachedImap*>( mDlg->parentFolder()->storage() );
|
|
folderRights = dimap->userRights();
|
|
folderRightsOk = dimap->userRightsState() == KMail::ACLJobs::Ok;
|
|
if ( parent ) {
|
|
parentRights = parent->userRights();
|
|
parentRightsOk = parent->userRightsState() == KMail::ACLJobs::Ok;
|
|
}
|
|
}
|
|
|
|
// For renaming, we need support for deleting the mailbox and then re-creating it.
|
|
if ( parentRightsOk && folderRightsOk &&
|
|
( !( parentRights & KMail::ACLJobs::Create ) || !( folderRights & KMail::ACLJobs::Delete ) ) ) {
|
|
nameChangeAllowed = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
mNameEdit = new KLineEdit( this );
|
|
if( !mDlg->folder() && nameChangeAllowed )
|
|
mNameEdit->setFocus();
|
|
mNameEdit->setEnabled( nameChangeAllowed );
|
|
if ( !nameChangeAllowed ) {
|
|
TQToolTip::add( mNameEdit, i18n( "Not enough permissions to rename this folder.\n"
|
|
"The parent folder doesn't have write support.\n"
|
|
"A sync is needed after changing the permissions." ) );
|
|
}
|
|
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() ) {
|
|
TQString 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, TQT_SIGNAL( textChanged( const TQString & ) ),
|
|
this, TQT_SLOT( slotFolderNameChanged( const TQString & ) ) );
|
|
|
|
|
|
//start icons group
|
|
TQVBoxLayout *ivl = new TQVBoxLayout( topLayout );
|
|
ivl->setSpacing( KDialog::spacingHint() );
|
|
|
|
TQHBoxLayout *ihl = new TQHBoxLayout( ivl );
|
|
mIconsCheckBox = new TQCheckBox( i18n("Use custom &icons"), this );
|
|
mIconsCheckBox->setChecked( false );
|
|
ihl->addWidget( mIconsCheckBox );
|
|
ihl->addStretch( 2 );
|
|
|
|
mNormalIconLabel = new TQLabel( 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 TQLabel( 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, TQT_SIGNAL(toggled(bool)),
|
|
mNormalIconButton, TQT_SLOT(setEnabled(bool)) );
|
|
connect( mIconsCheckBox, TQT_SIGNAL(toggled(bool)),
|
|
mUnreadIconButton, TQT_SLOT(setEnabled(bool)) );
|
|
connect( mIconsCheckBox, TQT_SIGNAL(toggled(bool)),
|
|
mNormalIconLabel, TQT_SLOT(setEnabled(bool)) );
|
|
connect( mIconsCheckBox, TQT_SIGNAL(toggled(bool)),
|
|
mUnreadIconLabel, TQT_SLOT(setEnabled(bool)) );
|
|
|
|
connect( mNormalIconButton, TQT_SIGNAL(iconChanged(TQString)),
|
|
this, TQT_SLOT(slotChangeIcon(TQString)) );
|
|
|
|
//end icons group
|
|
addLine( this, topLayout);
|
|
}
|
|
|
|
|
|
// should new mail in this folder be ignored?
|
|
TQHBoxLayout *hbl = new TQHBoxLayout( topLayout );
|
|
hbl->setSpacing( KDialog::spacingHint() );
|
|
mNotifyOnNewMailCheckBox =
|
|
new TQCheckBox( i18n("Act on new/unread mail in this folder" ), this );
|
|
TQWhatsThis::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?
|
|
|
|
TQHBoxLayout *nml = new TQHBoxLayout( topLayout );
|
|
nml->setSpacing( KDialog::spacingHint() );
|
|
mNewMailCheckBox = new TQCheckBox( 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 TQHBoxLayout( topLayout );
|
|
hbl->setSpacing( KDialog::spacingHint() );
|
|
mKeepRepliesInSameFolderCheckBox =
|
|
new TQCheckBox( i18n("Keep replies in this folder" ), this );
|
|
TQWhatsThis::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
|
|
TQGridLayout *gl = new TQGridLayout( 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;
|
|
TQString tip = i18n("Show Sender/Receiver Column in List of Messages");
|
|
|
|
TQLabel *sender_label = new TQLabel( i18n("Sho&w column:" ), this );
|
|
gl->addWidget( sender_label, row, 0 );
|
|
mShowSenderReceiverComboBox = new TQComboBox( this );
|
|
TQToolTip::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);
|
|
|
|
TQString 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 TQLabel( i18n("&Sender identity:"), this );
|
|
gl->addWidget( label, row, 0 );
|
|
mIdentityComboBox = new KPIM::IdentityCombo( kmkernel->identityManager(), this );
|
|
label->setBuddy( mIdentityComboBox );
|
|
gl->addWidget( mIdentityComboBox, row, 1 );
|
|
TQWhatsThis::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 || mIsResourceFolder ) &&
|
|
kmkernel->iCalIface().isEnabled() &&
|
|
mDlg->folder() && mDlg->folder()->folderType() != KMFolderTypeImap ) {
|
|
// 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 TQLabel( i18n("&Folder contents:"), this );
|
|
gl->addWidget( label, row, 0 );
|
|
mContentsComboBox = new TQComboBox( 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, TQT_SIGNAL ( activated( int ) ),
|
|
this, TQT_SLOT( slotFolderContentsSelectionChanged( int ) ) );
|
|
if ( mDlg->folder()->isReadOnly() || mIsResourceFolder )
|
|
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;
|
|
|
|
TQLabel* label = new TQLabel( i18n( "Generate free/&busy and activate alarms for:" ), this );
|
|
gl->addWidget( label, row, 0 );
|
|
mIncidencesForComboBox = new TQComboBox( this );
|
|
label->setBuddy( mIncidencesForComboBox );
|
|
gl->addWidget( mIncidencesForComboBox, row, 1 );
|
|
|
|
const TQString 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." );
|
|
|
|
TQWhatsThis::add( mIncidencesForComboBox, whatsThisForMyOwnFolders );
|
|
mIncidencesForComboBox->insertItem( i18n( "Nobody" ) );
|
|
mIncidencesForComboBox->insertItem( i18n( "Admins of This Folder" ) );
|
|
mIncidencesForComboBox->insertItem( i18n( "All Readers of This Folder" ) );
|
|
++row;
|
|
const TQString whatsThisForReadOnlyFolders =
|
|
i18n( "This setting allows you to disable alarms for folders shared by others. ");
|
|
mAlarmsBlockedCheckBox = new TQCheckBox( this );
|
|
mAlarmsBlockedCheckBox->setText( i18n( "Block alarms locally" ) );
|
|
gl->addMultiCellWidget( mAlarmsBlockedCheckBox, row, row, 0, 1);
|
|
TQWhatsThis::add( mAlarmsBlockedCheckBox, whatsThisForReadOnlyFolders );
|
|
|
|
if ( mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeCalendar
|
|
&& mDlg->folder()->storage()->contentsType() != KMail::ContentsTypeTask ) {
|
|
mIncidencesForComboBox->setEnabled( false );
|
|
mAlarmsBlockedCheckBox->setEnabled( false );
|
|
}
|
|
}
|
|
|
|
if ( mDlg->folder()->folderType() == KMFolderTypeCachedImap ) {
|
|
kdDebug() << k_funcinfo << mDlg->folder()->folderType() << endl;
|
|
mSharedSeenFlagsCheckBox = new TQCheckBox( this );
|
|
mSharedSeenFlagsCheckBox->setText( i18n( "Share unread state with all users" ) );
|
|
++row;
|
|
gl->addMultiCellWidget( mSharedSeenFlagsCheckBox, row, row, 0, 1 );
|
|
TQWhatsThis::add( mSharedSeenFlagsCheckBox, i18n( "If enabled, the unread state of messages in this folder will be the same "
|
|
"for all users having access to this folders. If disabled (the default), every user with access to this folder has her "
|
|
"own unread state." ) );
|
|
}
|
|
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() );
|
|
TQString 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() );
|
|
}
|
|
if ( mSharedSeenFlagsCheckBox ) {
|
|
KMFolderCachedImap *dimap = static_cast<KMFolderCachedImap*>( folder->storage() );
|
|
ImapAccountBase *account = dynamic_cast<ImapAccountBase*>( dimap->account() );
|
|
mSharedSeenFlagsCheckBox->setChecked( dimap->sharedSeenFlags() );
|
|
mSharedSeenFlagsCheckBox->setDisabled( folder->isReadOnly() );
|
|
if ( account && account->hasCapability( "x-kmail-sharedseen" ) )
|
|
mSharedSeenFlagsCheckBox->show();
|
|
else
|
|
mSharedSeenFlagsCheckBox->hide();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void FolderDiaGeneralTab::slotFolderNameChanged( const TQString& 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() ) {
|
|
TQString 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() );
|
|
|
|
TQString fldName, oldFldName;
|
|
KMFolderCachedImap* dimap = 0;
|
|
if ( folder->folderType() == KMFolderTypeCachedImap )
|
|
dimap = static_cast<KMFolderCachedImap *>( mDlg->folder()->storage() );
|
|
|
|
if ( !mIsLocalSystemFolder || mIsResourceFolder )
|
|
{
|
|
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(TQRegExp("^\\.*"));
|
|
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 ( dimap ) {
|
|
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() );
|
|
}
|
|
}
|
|
|
|
if ( dimap && mSharedSeenFlagsCheckBox &&
|
|
mSharedSeenFlagsCheckBox->isChecked() != dimap->sharedSeenFlags() ) {
|
|
dimap->setSharedSeenFlags( mSharedSeenFlagsCheckBox->isChecked() );
|
|
dimap->writeConfig();
|
|
}
|
|
|
|
// make sure everything is on disk, connected slots will call readConfig()
|
|
// when creating a new folder.
|
|
folder->storage()->writeConfig();
|
|
|
|
TQString msg;
|
|
if ( !folder->isValidName( fldName, msg ) ) {
|
|
KMessageBox::sorry( this, msg );
|
|
return false;
|
|
} else {
|
|
// 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( TQString icon ) // can't use a const-ref here, due to KIconButton's signal
|
|
{
|
|
mUnreadIconButton->setIcon( icon );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
KMail::FolderDiaTemplatesTab::FolderDiaTemplatesTab( KMFolderDialog* dlg,
|
|
TQWidget* parent )
|
|
: FolderDiaTab( parent, 0 ), mDlg( dlg )
|
|
{
|
|
|
|
mIsLocalSystemFolder = mDlg->folder()->isSystemFolder();
|
|
|
|
|
|
TQVBoxLayout *topLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() );
|
|
|
|
mCustom = new TQCheckBox( i18n("&Use custom message templates"), this );
|
|
topLayout->addWidget( mCustom );
|
|
|
|
mWidget = new TemplatesConfiguration( this , "folder-templates" );
|
|
mWidget->setEnabled( false );
|
|
topLayout->addWidget( mWidget );
|
|
|
|
TQHBoxLayout *btns = new TQHBoxLayout( topLayout, KDialog::spacingHint() );
|
|
mCopyGlobal = new KPushButton( i18n("&Copy global templates"), this );
|
|
mCopyGlobal->setEnabled( false );
|
|
btns->addWidget( mCopyGlobal );
|
|
|
|
connect( mCustom, TQT_SIGNAL(toggled(bool)),
|
|
mWidget, TQT_SLOT(setEnabled(bool)) );
|
|
connect( mCustom, TQT_SIGNAL(toggled(bool)),
|
|
mCopyGlobal, TQT_SLOT(setEnabled(bool)) );
|
|
|
|
connect( mCopyGlobal, TQT_SIGNAL(clicked()),
|
|
this, TQT_SLOT(slotCopyGlobal()) );
|
|
|
|
initializeWithValuesFromFolder( mDlg->folder() );
|
|
|
|
connect( mWidget, TQT_SIGNAL( changed() ),
|
|
this, TQT_SLOT( slotEmitChanged( void ) ) );
|
|
}
|
|
|
|
void FolderDiaTemplatesTab::load()
|
|
{
|
|
|
|
}
|
|
|
|
void FolderDiaTemplatesTab::initializeWithValuesFromFolder( KMFolder* folder ) {
|
|
if ( !folder )
|
|
return;
|
|
|
|
mFolder = folder;
|
|
|
|
TQString fid = folder->idString();
|
|
|
|
Templates t( fid );
|
|
|
|
mCustom->setChecked(t.useCustomTemplates());
|
|
|
|
mIdentity = folder->identity();
|
|
|
|
mWidget->loadFromFolder( fid, mIdentity );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool FolderDiaTemplatesTab::save()
|
|
{
|
|
KMFolder* folder = mDlg->folder();
|
|
|
|
TQString 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();
|
|
}
|
|
}
|