diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /kmail/managesievescriptsdialog.cpp | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmail/managesievescriptsdialog.cpp')
-rw-r--r-- | kmail/managesievescriptsdialog.cpp | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/kmail/managesievescriptsdialog.cpp b/kmail/managesievescriptsdialog.cpp new file mode 100644 index 000000000..594a467d0 --- /dev/null +++ b/kmail/managesievescriptsdialog.cpp @@ -0,0 +1,347 @@ +#include "managesievescriptsdialog.h" +#include "managesievescriptsdialog_p.h" + +#include "sieveconfig.h" +#include "accountmanager.h" +#include "imapaccountbase.h" +#include "sievejob.h" +#include "kmkernel.h" + +#include <klocale.h> +#include <kiconloader.h> +#include <kwin.h> +#include <kapplication.h> +#include <kinputdialog.h> +#include <kglobalsettings.h> +#include <kmessagebox.h> + +#include <qlayout.h> +#include <qlistview.h> +#include <qtextedit.h> +#include <qpopupmenu.h> + +#include <cassert> + +inline QCheckListItem * qcli_cast( QListViewItem * lvi ) { + return lvi && lvi->rtti() == 1 ? static_cast<QCheckListItem*>( lvi ) : 0 ; +} +inline const QCheckListItem * qcli_cast( const QListViewItem * lvi ) { + return lvi && lvi->rtti() == 1 ? static_cast<const QCheckListItem*>( lvi ) : 0 ; +} + +KMail::ManageSieveScriptsDialog::ManageSieveScriptsDialog( QWidget * parent, const char * name ) + : KDialogBase( Plain, i18n( "Manage Sieve Scripts" ), Close, Close, + parent, name, false ), + mSieveEditor( 0 ), + mContextMenuItem( 0 ), + mWasActive( false ) +{ + setWFlags( WGroupLeader|WDestructiveClose ); + KWin::setIcons( winId(), kapp->icon(), kapp->miniIcon() ); + + QVBoxLayout * vlay = new QVBoxLayout( plainPage(), 0, 0 ); + + mListView = new QListView( plainPage() ); + mListView->addColumn( i18n( "Available Scripts" ) ); + mListView->setResizeMode( QListView::LastColumn ); + mListView->setRootIsDecorated( true ); + mListView->setSelectionMode( QListView::Single ); + connect( mListView, SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&,int)), + this, SLOT(slotContextMenuRequested(QListViewItem*, const QPoint&)) ); + connect( mListView, SIGNAL(doubleClicked(QListViewItem*,const QPoint&,int)), + this, SLOT(slotDoubleClicked(QListViewItem*)) ); + connect( mListView, SIGNAL(selectionChanged(QListViewItem*)), + this, SLOT(slotSelectionChanged(QListViewItem*)) ); + vlay->addWidget( mListView ); + + resize( 2 * sizeHint().width(), sizeHint().height() ); + + slotRefresh(); +} + +KMail::ManageSieveScriptsDialog::~ManageSieveScriptsDialog() { + killAllJobs(); +} + +void KMail::ManageSieveScriptsDialog::killAllJobs() { + for ( QMap<SieveJob*,QCheckListItem*>::const_iterator it = mJobs.constBegin(), end = mJobs.constEnd() ; it != end ; ++it ) + it.key()->kill(); + mJobs.clear(); +} + +static KURL findUrlForAccount( const KMail::ImapAccountBase * a ) { + assert( a ); + const KMail::SieveConfig sieve = a->sieveConfig(); + if ( !sieve.managesieveSupported() ) + return KURL(); + if ( sieve.reuseConfig() ) { + // assemble Sieve url from the settings of the account: + KURL u; + u.setProtocol( "sieve" ); + u.setHost( a->host() ); + u.setUser( a->login() ); + u.setPass( a->passwd() ); + u.setPort( sieve.port() ); + // Translate IMAP LOGIN to PLAIN: + u.setQuery( "x-mech=" + ( a->auth() == "*" ? "PLAIN" : a->auth() ) ); + return u; + } else { + return sieve.alternateURL(); + } +} + +void KMail::ManageSieveScriptsDialog::slotRefresh() { + killAllJobs(); + mUrls.clear(); + mListView->clear(); + + KMail::AccountManager * am = kmkernel->acctMgr(); + assert( am ); + QCheckListItem * last = 0; + for ( KMAccount * a = am->first() ; a ; a = am->next() ) { + last = new QCheckListItem( mListView, last, a->name(), QCheckListItem::Controller ); + last->setPixmap( 0, SmallIcon( "server" ) ); + if ( ImapAccountBase * iab = dynamic_cast<ImapAccountBase*>( a ) ) { + const KURL u = ::findUrlForAccount( iab ); + if ( u.isEmpty() ) + continue; + SieveJob * job = SieveJob::list( u ); + connect( job, SIGNAL(item(KMail::SieveJob*,const QString&,bool)), + this, SLOT(slotItem(KMail::SieveJob*,const QString&,bool)) ); + connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), + this, SLOT(slotResult(KMail::SieveJob*,bool,const QString&,bool)) ); + mJobs.insert( job, last ); + mUrls.insert( last, u ); + } else { + QListViewItem * item = new QListViewItem( last, i18n( "No Sieve URL configured" ) ); + item->setEnabled( false ); + last->setOpen( true ); + } + } +} + +void KMail::ManageSieveScriptsDialog::slotResult( KMail::SieveJob * job, bool success, const QString &, bool ) { + QCheckListItem * parent = mJobs[job]; + if ( !parent ) + return; + + mJobs.remove( job ); + + parent->setOpen( true ); + + if ( success ) + return; + + QListViewItem * item = new QListViewItem( parent, i18n( "Failed to fetch the list of scripts" ) ); + item->setEnabled( false ); +} + +void KMail::ManageSieveScriptsDialog::slotItem( KMail::SieveJob * job, const QString & filename, bool isActive ) { + QCheckListItem * parent = mJobs[job]; + if ( !parent ) + return; + QCheckListItem * item = new QCheckListItem( parent, filename, QCheckListItem::RadioButton ); + if ( isActive ) { + item->setOn( true ); + mSelectedItems[parent] = item; + } +} + +void KMail::ManageSieveScriptsDialog::slotContextMenuRequested( QListViewItem * i, const QPoint & p ) { + QCheckListItem * item = qcli_cast( i ); + if ( !item ) + return; + if ( !item->depth() && !mUrls.count( item ) ) + return; + QPopupMenu menu; + mContextMenuItem = item; + if ( item->depth() ) { + // script items: + menu.insertItem( i18n( "Delete Script" ), this, SLOT(slotDeleteScript()) ); + menu.insertItem( i18n( "Edit Script..." ), this, SLOT(slotEditScript()) ); + } else { + // top-levels: + menu.insertItem( i18n( "New Script..." ), this, SLOT(slotNewScript()) ); + } + menu.exec( p ); + mContextMenuItem = 0; +} + +void KMail::ManageSieveScriptsDialog::slotSelectionChanged( QListViewItem * i ) { + QCheckListItem * item = qcli_cast( i ); + if ( !item ) + return; + QCheckListItem * parent = qcli_cast( item->parent() ); + if ( !parent ) + return; + if ( item->isOn() && mSelectedItems[parent] != item ) { + mSelectedItems[parent] = item; + changeActiveScript( parent ); + } +} + +void KMail::ManageSieveScriptsDialog::changeActiveScript( QCheckListItem * item ) { + if ( !item ) + return; + if ( !mUrls.count( item ) ) + return; + if ( !mSelectedItems.count( item ) ) + return; + KURL u = mUrls[item]; + if ( u.isEmpty() ) + return; + QCheckListItem * selected = mSelectedItems[item]; + if ( !selected ) + return; + u.setFileName( selected->text( 0 ) ); + + SieveJob * job = SieveJob::activate( u ); + connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), + this, SLOT(slotRefresh()) ); +} + +void KMail::ManageSieveScriptsDialog::slotDoubleClicked( QListViewItem * i ) { + QCheckListItem * item = qcli_cast( i ); + if ( !item ) + return; + if ( !item->depth() ) + return; + mContextMenuItem = item; + slotEditScript(); + mContextMenuItem = 0; +} + +void KMail::ManageSieveScriptsDialog::slotDeleteScript() { + if ( !mContextMenuItem ) + return; + if ( !mContextMenuItem->depth() ) + return; + + QCheckListItem * parent = qcli_cast( mContextMenuItem->parent() ); + if ( !parent ) + return; + + if ( !mUrls.count( parent ) ) + return; + + KURL u = mUrls[parent]; + if ( u.isEmpty() ) + return; + + u.setFileName( mContextMenuItem->text( 0 ) ); + + if ( KMessageBox::warningContinueCancel( this, i18n( "Really delete script \"%1\" from the server?" ).arg( u.fileName() ), + i18n( "Delete Sieve Script Confirmation" ), + KStdGuiItem::del() ) + != KMessageBox::Continue ) + return; + + SieveJob * job = SieveJob::del( u ); + connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), + this, SLOT(slotRefresh()) ); +} + +void KMail::ManageSieveScriptsDialog::slotEditScript() { + if ( !mContextMenuItem ) + return; + if ( !mContextMenuItem->depth() ) + return; + QCheckListItem * parent = qcli_cast( mContextMenuItem->parent() ); + if ( !mUrls.count( parent ) ) + return; + KURL url = mUrls[parent]; + if ( url.isEmpty() ) + return; + url.setFileName( mContextMenuItem->text( 0 ) ); + mCurrentURL = url; + SieveJob * job = SieveJob::get( url ); + connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), + this, SLOT(slotGetResult(KMail::SieveJob*,bool,const QString&,bool)) ); +} + +void KMail::ManageSieveScriptsDialog::slotNewScript() { + if ( !mContextMenuItem ) + return; + if ( mContextMenuItem->depth() ) + mContextMenuItem = qcli_cast( mContextMenuItem->parent() ); + if ( !mContextMenuItem ) + return; + + if ( !mUrls.count( mContextMenuItem ) ) + return; + + KURL u = mUrls[mContextMenuItem]; + if ( u.isEmpty() ) + return; + + bool ok = false; + const QString name = KInputDialog::getText( i18n( "New Sieve Script" ), + i18n( "Please enter a name for the new Sieve script:" ), + i18n( "unnamed" ), &ok, this ); + if ( !ok || name.isEmpty() ) + return; + + u.setFileName( name ); + + (void) new QCheckListItem( mContextMenuItem, name, QCheckListItem::RadioButton ); + + mCurrentURL = u; + slotGetResult( 0, true, QString::null, false ); +} + +KMail::SieveEditor::SieveEditor( QWidget * parent, const char * name ) + : KDialogBase( Plain, i18n( "Edit Sieve Script" ), Ok|Cancel, Ok, parent, name ) +{ + QVBoxLayout * vlay = new QVBoxLayout( plainPage(), 0, spacingHint() ); + mTextEdit = new QTextEdit( plainPage() ); + vlay->addWidget( mTextEdit ); + mTextEdit->setTextFormat( QTextEdit::PlainText ); + mTextEdit->setWordWrap( QTextEdit::NoWrap ); + mTextEdit->setFont( KGlobalSettings::fixedFont() ); + + resize( 3 * sizeHint() ); +} + +KMail::SieveEditor::~SieveEditor() {} + +void KMail::ManageSieveScriptsDialog::slotGetResult( KMail::SieveJob *, bool success, const QString & script, bool isActive ) { + if ( !success ) + return; + + if ( mSieveEditor ) + return; + + mSieveEditor = new SieveEditor( this ); + mSieveEditor->setScript( script ); + connect( mSieveEditor, SIGNAL(okClicked()), this, SLOT(slotSieveEditorOkClicked()) ); + connect( mSieveEditor, SIGNAL(cancelClicked()), this, SLOT(slotSieveEditorCancelClicked()) ); + mSieveEditor->show(); + mWasActive = isActive; +} + +void KMail::ManageSieveScriptsDialog::slotSieveEditorOkClicked() { + if ( !mSieveEditor ) + return; + SieveJob * job = SieveJob::put( mCurrentURL,mSieveEditor->script(), mWasActive, mWasActive ); + connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), + this, SLOT(slotPutResult(KMail::SieveJob*,bool)) ); +} + +void KMail::ManageSieveScriptsDialog::slotSieveEditorCancelClicked() { + mSieveEditor->deleteLater(); mSieveEditor = 0; + mCurrentURL = KURL(); +} + +void KMail::ManageSieveScriptsDialog::slotPutResult( KMail::SieveJob *, bool success ) { + if ( success ) { + KMessageBox::information( this, i18n( "The Sieve script was successfully uploaded." ), + i18n( "Sieve Script Upload" ) ); + mSieveEditor->deleteLater(); mSieveEditor = 0; + mCurrentURL = KURL(); + } else { + mSieveEditor->show(); + } +} + +#include "managesievescriptsdialog.moc" +#include "managesievescriptsdialog_p.moc" |