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.
456 lines
14 KiB
456 lines
14 KiB
|
|
#include "managesievescriptsdialog.h" |
|
#include "managesievescriptsdialog_p.h" |
|
|
|
#include "sievejob.h" |
|
#include "kmkernel.h" |
|
#include "util.h" |
|
#include "imapsettings.h" |
|
#include "kmagentmanager.h" |
|
|
|
#include <klocale.h> |
|
#include <kiconloader.h> |
|
#include <kwindowsystem.h> |
|
#include <kinputdialog.h> |
|
#include <kglobalsettings.h> |
|
#include <kmessagebox.h> |
|
|
|
|
|
#include <akonadi/agentinstance.h> |
|
|
|
#include <QLayout> |
|
#include <QMenu> |
|
#include <QTreeWidget> |
|
#include <QVBoxLayout> |
|
|
|
#include <cassert> |
|
|
|
bool KMail::ItemRadioButton::mTreeWidgetIsBeingCleared = false; |
|
|
|
KMail::ManageSieveScriptsDialog::ManageSieveScriptsDialog( QWidget * parent, const char * name ) |
|
: KDialog( parent ), |
|
mContextMenuItem( 0 ), |
|
mSieveEditor( 0 ), |
|
mWasActive( false ) |
|
{ |
|
setCaption( i18n( "Manage Sieve Scripts" ) ); |
|
setButtons( Close ); |
|
setObjectName( name ); |
|
setDefaultButton( Close ); |
|
setModal( false ); |
|
setAttribute( Qt::WA_GroupLeader ); |
|
setAttribute( Qt::WA_DeleteOnClose ); |
|
KWindowSystem::setIcons( winId(), qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop),IconSize(KIconLoader::Desktop)), qApp->windowIcon().pixmap(IconSize(KIconLoader::Small),IconSize(KIconLoader::Small)) ); |
|
QFrame *frame =new QFrame( this ); |
|
setMainWidget( frame ); |
|
QVBoxLayout * vlay = new QVBoxLayout( frame ); |
|
vlay->setSpacing( 0 ); |
|
vlay->setMargin( 0 ); |
|
|
|
mListView = new TreeWidgetWithContextMenu( frame); |
|
mListView->setHeaderLabel( i18n( "Available Scripts" ) ); |
|
mListView->setRootIsDecorated( true ); |
|
mListView->setAlternatingRowColors( true ); |
|
mListView->setSelectionMode( QAbstractItemView::SingleSelection ); |
|
connect( mListView, SIGNAL( contextMenuRequested( QTreeWidgetItem*, QPoint ) ), |
|
this, SLOT( slotContextMenuRequested( QTreeWidgetItem*, QPoint ) ) ); |
|
connect( mListView, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *, int ) ), |
|
this, SLOT( slotDoubleClicked( QTreeWidgetItem* ) ) ); |
|
vlay->addWidget( mListView ); |
|
|
|
resize( 2 * sizeHint().width(), sizeHint().height() ); |
|
|
|
slotRefresh(); |
|
} |
|
|
|
KMail::ManageSieveScriptsDialog::~ManageSieveScriptsDialog() |
|
{ |
|
clear(); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::killAllJobs() |
|
{ |
|
for ( QMap<SieveJob*,QTreeWidgetItem*>::const_iterator it = mJobs.constBegin(), |
|
end = mJobs.constEnd() ; it != end ; ++it ) |
|
it.key()->kill(); |
|
mJobs.clear(); |
|
} |
|
|
|
|
|
void KMail::ManageSieveScriptsDialog::slotRefresh() |
|
{ |
|
clear(); |
|
QTreeWidgetItem *last = 0; |
|
Akonadi::AgentInstance::List lst = kmkernel->agentManager()->instanceList(); |
|
foreach ( const Akonadi::AgentInstance& type, lst ) |
|
{ |
|
//TODO verify it. |
|
if ( type.identifier().contains( IMAP_RESOURCE_IDENTIFIER ) ) { |
|
|
|
OrgKdeAkonadiImapSettingsInterface *iface = KMail::Util::createImapSettingsInterface(type.identifier()); |
|
if ( iface->isValid() ) { |
|
last = new QTreeWidgetItem( mListView, last ); |
|
last->setText( 0, type.name() ); |
|
last->setIcon( 0, SmallIcon( "network-server" ) ); |
|
|
|
const KUrl u = KMail::Util::findSieveUrlForAccount( iface,type.identifier() ); |
|
if ( u.isEmpty() ) { |
|
QTreeWidgetItem *item = new QTreeWidgetItem( last ); |
|
item->setText( 0, i18n( "No Sieve URL configured" ) ); |
|
item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); |
|
mListView->expandItem( last ); |
|
} else { |
|
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 ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotResult( KMail::SieveJob * job, bool success, const QString &, bool ) |
|
{ |
|
QTreeWidgetItem * parent = mJobs[job]; |
|
if ( !parent ) |
|
return; |
|
|
|
mJobs.remove( job ); |
|
|
|
mListView->expandItem( parent ); |
|
|
|
if ( success ) |
|
return; |
|
|
|
QTreeWidgetItem * item = |
|
new QTreeWidgetItem( parent ); |
|
item->setText( 0, i18n( "Failed to fetch the list of scripts" ) ); |
|
item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotItem( KMail::SieveJob * job, const QString & filename, bool isActive ) |
|
{ |
|
QTreeWidgetItem * parent = mJobs[job]; |
|
if ( !parent ) |
|
return; |
|
QTreeWidgetItem* item = new QTreeWidgetItem( parent ); |
|
addRadioButton( item, filename ); |
|
if ( isActive ) { |
|
setRadioButtonState( item, true ); |
|
mSelectedItems[parent] = item; |
|
} |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotContextMenuRequested( QTreeWidgetItem *item, QPoint p ) |
|
{ |
|
if ( !item ) |
|
return; |
|
if ( !item->parent() && !mUrls.count( item )) |
|
return; |
|
QMenu menu; |
|
mContextMenuItem = item; |
|
if ( isFileNameItem( item ) ) { |
|
// script items: |
|
menu.addAction( i18n( "Delete Script" ), this, SLOT(slotDeleteScript()) ); |
|
menu.addAction( i18n( "Edit Script..." ), this, SLOT(slotEditScript()) ); |
|
if ( isRadioButtonChecked( item ) ) |
|
menu.addAction( i18n( "Deactivate Script" ), this, SLOT(slotDeactivateScript()) ); |
|
} else if ( !item->parent() ) { |
|
// top-levels: |
|
menu.addAction( i18n( "New Script..." ), this, SLOT(slotNewScript()) ); |
|
} |
|
if ( !menu.actions().isEmpty() ) |
|
menu.exec( p ); |
|
mContextMenuItem = 0; |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotDeactivateScript() |
|
{ |
|
QTreeWidgetItem * item = mListView->currentItem(); |
|
if ( !isFileNameItem( item ) ) |
|
return; |
|
QTreeWidgetItem *parent = item->parent(); |
|
if ( isRadioButtonChecked( item ) ) { |
|
mSelectedItems[parent] = item; |
|
changeActiveScript( parent, false ); |
|
} |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotSelectionChanged() |
|
{ |
|
QTreeWidgetItem * item = mListView->currentItem(); |
|
if ( !isFileNameItem( item ) ) |
|
return; |
|
QTreeWidgetItem *parent = item->parent(); |
|
if ( isRadioButtonChecked( item ) && mSelectedItems[parent] != item ) { |
|
mSelectedItems[parent] = item; |
|
changeActiveScript( parent, true ); |
|
} |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::changeActiveScript( QTreeWidgetItem * item, bool activate ) |
|
{ |
|
if ( !item ) |
|
return; |
|
if ( !mUrls.count( item ) ) |
|
return; |
|
if ( !mSelectedItems.count( item ) ) |
|
return; |
|
KUrl u = mUrls[item]; |
|
if ( u.isEmpty() ) |
|
return; |
|
QTreeWidgetItem* selected = mSelectedItems[item]; |
|
if ( !selected ) |
|
return; |
|
u.setFileName( itemText( selected ) ); |
|
|
|
SieveJob * job; |
|
if ( activate ) |
|
job = SieveJob::activate( u ); |
|
else |
|
job = SieveJob::desactivate( u ); |
|
connect( job, SIGNAL(result(KMail::SieveJob*,bool,const QString&,bool)), |
|
this, SLOT(slotRefresh()) ); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::addRadioButton( QTreeWidgetItem *item, const QString &text ) |
|
{ |
|
Q_ASSERT( item && item->parent() ); |
|
Q_ASSERT( !mListView->itemWidget( item, 0 ) ); |
|
|
|
// Create the radio button and set it as item widget |
|
ItemRadioButton *radioButton = new ItemRadioButton( item ); |
|
radioButton->setAutoExclusive( false ); |
|
radioButton->setText( text ); |
|
mListView->setItemWidget( item, 0, radioButton ); |
|
connect( radioButton, SIGNAL( toggled ( bool ) ), |
|
this, SLOT( slotSelectionChanged() ) ); |
|
|
|
// Add the radio button to the button group |
|
QTreeWidgetItem *parent = item->parent(); |
|
QButtonGroup *buttonGroup = mButtonGroups.value( parent ); |
|
if ( !buttonGroup ) { |
|
buttonGroup = new QButtonGroup(); |
|
mButtonGroups.insert( parent, buttonGroup ); |
|
} |
|
buttonGroup->addButton( radioButton ); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::setRadioButtonState( QTreeWidgetItem *item, bool checked ) |
|
{ |
|
Q_ASSERT( item && item->parent() ); |
|
|
|
ItemRadioButton *radioButton = dynamic_cast<ItemRadioButton*>( mListView->itemWidget( item, 0 ) ); |
|
Q_ASSERT( radioButton ); |
|
radioButton->setChecked( checked ); |
|
} |
|
|
|
|
|
bool KMail::ManageSieveScriptsDialog::isRadioButtonChecked( QTreeWidgetItem *item ) const |
|
{ |
|
Q_ASSERT( item && item->parent() ); |
|
|
|
ItemRadioButton *radioButton = dynamic_cast<ItemRadioButton*>( mListView->itemWidget( item, 0 ) ); |
|
Q_ASSERT( radioButton ); |
|
return radioButton->isChecked(); |
|
} |
|
|
|
QString KMail::ManageSieveScriptsDialog::itemText( QTreeWidgetItem *item ) const |
|
{ |
|
Q_ASSERT( item && item->parent() ); |
|
|
|
ItemRadioButton *radioButton = dynamic_cast<ItemRadioButton*>( mListView->itemWidget( item, 0 ) ); |
|
Q_ASSERT( radioButton ); |
|
return radioButton->text().remove( '&' ); |
|
} |
|
|
|
bool KMail::ManageSieveScriptsDialog::isFileNameItem( QTreeWidgetItem *item ) const |
|
{ |
|
if ( !item || !item->parent() ) |
|
return false; |
|
|
|
ItemRadioButton *radioButton = dynamic_cast<ItemRadioButton*>( mListView->itemWidget( item, 0 ) ); |
|
return ( radioButton != 0 ); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::clear() |
|
{ |
|
killAllJobs(); |
|
mSelectedItems.clear(); |
|
qDeleteAll( mButtonGroups ); |
|
mButtonGroups.clear(); |
|
mUrls.clear(); |
|
ItemRadioButton::setTreeWidgetIsBeingCleared( true ); |
|
mListView->clear(); |
|
ItemRadioButton::setTreeWidgetIsBeingCleared( false ); |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotDoubleClicked( QTreeWidgetItem * item ) |
|
{ |
|
if ( !isFileNameItem( item ) ) |
|
return; |
|
|
|
mContextMenuItem = item; |
|
slotEditScript(); |
|
mContextMenuItem = 0; |
|
} |
|
|
|
void KMail::ManageSieveScriptsDialog::slotDeleteScript() |
|
{ |
|
if ( !isFileNameItem( mContextMenuItem ) ) |
|
return; |
|
|
|
QTreeWidgetItem *parent = mContextMenuItem->parent(); |
|
if ( !parent ) |
|
return; |
|
|
|
if ( !mUrls.count( parent ) ) |
|
return; |
|
|
|
KUrl u = mUrls[parent]; |
|
if ( u.isEmpty() ) |
|
return; |
|
|
|
u.setFileName( itemText( mContextMenuItem ) ); |
|
|
|
if ( KMessageBox::warningContinueCancel( this, i18n( "Really delete script \"%1\" from the server?", u.fileName() ), |
|
i18n( "Delete Sieve Script Confirmation" ), |
|
KStandardGuiItem::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 ( !isFileNameItem( mContextMenuItem ) ) |
|
return; |
|
QTreeWidgetItem* parent = mContextMenuItem->parent(); |
|
if ( !mUrls.count( parent ) ) |
|
return; |
|
KUrl url = mUrls[parent]; |
|
if ( url.isEmpty() ) |
|
return; |
|
url.setFileName( itemText( mContextMenuItem ) ); |
|
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->parent() ) |
|
mContextMenuItem = 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 ); |
|
|
|
QTreeWidgetItem *newItem = |
|
new QTreeWidgetItem( mContextMenuItem ); |
|
addRadioButton( newItem, name ); |
|
mCurrentURL = u; |
|
slotGetResult( 0, true, QString(), false ); |
|
} |
|
|
|
KMail::SieveEditor::SieveEditor( QWidget * parent, const char * name ) |
|
: KDialog( parent ) |
|
{ |
|
setCaption( i18n( "Edit Sieve Script" ) ); |
|
setButtons( Ok|Cancel ); |
|
setObjectName( name ); |
|
setDefaultButton( Ok ); |
|
setModal( true ); |
|
QFrame *frame = new QFrame( this ); |
|
setMainWidget( frame ); |
|
QVBoxLayout * vlay = new QVBoxLayout( frame ); |
|
vlay->setSpacing( spacingHint() ); |
|
vlay->setMargin( 0 ); |
|
mTextEdit = new KTextEdit( frame); |
|
mTextEdit->setFocus(); |
|
vlay->addWidget( mTextEdit ); |
|
mTextEdit->setAcceptRichText( false ); |
|
mTextEdit->setWordWrapMode ( QTextOption::NoWrap ); |
|
mTextEdit->setFont( KGlobalSettings::fixedFont() ); |
|
connect( mTextEdit, SIGNAL( textChanged () ), SLOT( slotTextChanged() ) ); |
|
resize( 3 * sizeHint() ); |
|
} |
|
|
|
KMail::SieveEditor::~SieveEditor() |
|
{ |
|
} |
|
|
|
void KMail::SieveEditor::slotTextChanged() |
|
{ |
|
enableButtonOk( !script().isEmpty() ); |
|
} |
|
|
|
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(); |
|
slotRefresh(); |
|
} |
|
|
|
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"
|
|
|