• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.8.3 API Reference
  • KDE Home
  • Contact Us
 

akonadi/kmime

standardmailactionmanager.cpp
00001 /*
00002     This file is part of Akonadi Contact.
00003 
00004     Copyright (c) 2009 - 2010 Tobias Koenig <tokoe@kde.org>
00005     Copyright (c) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
00006     Copyright (c) 2010 Andras Mantia <andras@kdab.com>
00007 
00008     This library is free software; you can redistribute it and/or modify it
00009     under the terms of the GNU Library General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or (at your
00011     option) any later version.
00012 
00013     This library is distributed in the hope that it will be useful, but WITHOUT
00014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00015     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
00016     License for more details.
00017 
00018     You should have received a copy of the GNU Library General Public License
00019     along with this library; see the file COPYING.LIB.  If not, write to the
00020     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00021     02110-1301, USA.
00022 */
00023 
00024 #include "standardmailactionmanager.h"
00025 
00026 #include "emptytrashcommand_p.h"
00027 #include "markascommand_p.h"
00028 #include "movetotrashcommand_p.h"
00029 #include "removeduplicatescommand_p.h"
00030 #include "specialmailcollections.h"
00031 
00032 #include "akonadi/agentfilterproxymodel.h"
00033 #include "akonadi/agentinstance.h"
00034 #include "akonadi/agentinstancecreatejob.h"
00035 #include "akonadi/agentmanager.h"
00036 #include "akonadi/agenttypedialog.h"
00037 #include "akonadi/collectionstatistics.h"
00038 #include "akonadi/entitytreemodel.h"
00039 #include "akonadi/kmime/messagestatus.h"
00040 #include "akonadi/mimetypechecker.h"
00041 #include "akonadi/subscriptiondialog_p.h"
00042 
00043 #include <kaction.h>
00044 #include <kactioncollection.h>
00045 #include <klocale.h>
00046 #include <kmessagebox.h>
00047 #include <kmime/kmime_message.h>
00048 
00049 #include <QtCore/QPointer>
00050 #include <QtGui/QItemSelectionModel>
00051 
00052 using namespace Akonadi;
00053 
00054 class StandardMailActionManager::Private
00055 {
00056   public:
00057     Private( KActionCollection *actionCollection, QWidget *parentWidget, StandardMailActionManager *parent )
00058       : mActionCollection( actionCollection ),
00059         mParentWidget( parentWidget ),
00060         mCollectionSelectionModel( 0 ),
00061         mItemSelectionModel( 0 ),
00062         mParent( parent )
00063     {
00064       mGenericManager = new StandardActionManager( actionCollection, parentWidget );
00065 
00066       mParent->connect( mGenericManager, SIGNAL(actionStateUpdated()),
00067                         mParent, SIGNAL(actionStateUpdated()) );
00068 
00069       mGenericManager->createAllActions();
00070 
00071       mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setText(
00072         i18n( "Add Folder..." ) );
00073       mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setWhatsThis(
00074         i18n( "Add a new folder to the currently selected account." ) );
00075 
00076       mGenericManager->setActionText( Akonadi::StandardActionManager::CopyCollections,
00077                                       ki18np( "Copy Folder", "Copy %1 Folders" ) );
00078       mGenericManager->action( Akonadi::StandardActionManager::CopyCollections )->setWhatsThis(
00079         i18n( "Copy the selected folders to the clipboard." ) );
00080 
00081       mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteCollections,
00082                                       ki18np( "Delete Folder", "Delete %1 Folders" ) );
00083       mGenericManager->action( Akonadi::StandardActionManager::DeleteCollections )->setWhatsThis(
00084         i18n( "Delete the selected folders from the account." ) );
00085 
00086       mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollections,
00087                                       ki18np( "Update Folder", "Update Folders" ) );
00088 
00089       mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollections )->setWhatsThis(
00090         i18n( "Update the content of the selected folders." ) );
00091 
00092       mGenericManager->setActionText( Akonadi::StandardActionManager::CutCollections,
00093                                       ki18np( "Cut Folder", "Cut %1 Folders" ) );
00094       mGenericManager->action( Akonadi::StandardActionManager::CutCollections )->setWhatsThis(
00095         i18n( "Cut the selected folders from the account." ) );
00096 
00097       mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties )->setText(
00098         i18n( "Folder Properties..." ) );
00099       mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties)->setWhatsThis(
00100         i18n( "Open a dialog to edit the properties of the selected folder." ) );
00101 
00102       mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
00103                                       ki18np( "Copy Email", "Copy %1 Emails" ) );
00104       mGenericManager->action( Akonadi::StandardActionManager::CopyItems )->setWhatsThis(
00105         i18n( "Copy the selected emails to the clipboard." ) );
00106 
00107       mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
00108                                       ki18np( "Delete Email", "Delete %1 Emails" ) );
00109       mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )->setWhatsThis(
00110         i18n( "Delete the selected emails from the folder." ) );
00111 
00112       mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
00113                                       ki18np( "Cut Email", "Cut %1 Emails" ) );
00114       mGenericManager->action( Akonadi::StandardActionManager::CutItems )->setWhatsThis(
00115         i18n( "Cut the selected emails from the folder." ) );
00116 
00117       mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setText(
00118         i18n( "Add &Account..." ) );
00119       mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setWhatsThis(
00120         i18n( "Add a new account<p>"
00121               "You will be presented with a dialog where you can select "
00122               "the type of the account that shall be added.</p>" ) );
00123 
00124       mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteResources,
00125                                       ki18np( "&Delete Account", "&Delete %1 Accounts" ) );
00126       mGenericManager->action( Akonadi::StandardActionManager::DeleteResources )->setWhatsThis(
00127         i18n( "Delete the selected accounts<p>"
00128               "The currently selected accounts will be deleted, "
00129               "along with all the emails they contain.</p>" ) );
00130 
00131       mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setText(
00132         i18n( "Account Properties..." ) );
00133       mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setWhatsThis(
00134         i18n( "Open a dialog to edit properties of the selected account." ) );
00135 
00136       mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeResources,
00137                                       ki18np( "Update Account", "Update %1 Accounts" ) );
00138       mGenericManager->action( Akonadi::StandardActionManager::SynchronizeResources )->setWhatsThis(
00139         i18n( "Updates the content of all folders of the selected accounts." ) );
00140 
00141       mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollectionsRecursive,
00142                                       ki18np( "Update folder and its subfolders", "Update folders and their subfolders" ) );
00143 
00144       mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollectionsRecursive )->setWhatsThis(
00145         i18n( "Update the content of the selected folders and their subfolders." ) );
00146 
00147       mGenericManager->setContextText(
00148         StandardActionManager::CreateCollection, StandardActionManager::DialogTitle,
00149         i18nc( "@title:window", "New Folder" ) );
00150 
00151       mGenericManager->setContextText(
00152         StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageText,
00153         ki18n( "Could not create folder: %1" ) );
00154 
00155       mGenericManager->setContextText(
00156         StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageTitle,
00157         i18n( "Folder creation failed" ) );
00158 
00159       mGenericManager->setContextText(
00160         StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxText,
00161         ki18np( "Do you really want to delete this folder and all its sub-folders?",
00162                 "Do you really want to delete %1 folders and all their sub-folders?" ) );
00163 
00164       mGenericManager->setContextText(
00165         StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxTitle,
00166         ki18ncp( "@title:window", "Delete folder?", "Delete folders?" ) );
00167 
00168       mGenericManager->setContextText(
00169         StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageText,
00170         ki18n( "Could not delete folder: %1" ) );
00171 
00172       mGenericManager->setContextText(
00173         StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageTitle,
00174         i18n( "Folder deletion failed" ) );
00175 
00176       mGenericManager->setContextText(
00177         StandardActionManager::CollectionProperties, StandardActionManager::DialogTitle,
00178         ki18nc( "@title:window", "Properties of Folder %1" ) );
00179 
00180       mGenericManager->setContextText(
00181         StandardActionManager::DeleteItems, StandardActionManager::MessageBoxText,
00182         ki18np( "Do you really want to delete the selected email?",
00183                 "Do you really want to delete %1 emails?" ) );
00184 
00185       mGenericManager->setContextText(
00186         StandardActionManager::DeleteItems, StandardActionManager::MessageBoxTitle,
00187         ki18ncp( "@title:window", "Delete Email?", "Delete Emails?" ) );
00188 
00189       mGenericManager->setContextText(
00190         StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText,
00191         ki18n( "Could not delete email: %1" ) );
00192 
00193       mGenericManager->setContextText(
00194         StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageTitle,
00195         i18n( "Email deletion failed" ) );
00196 
00197       mGenericManager->setContextText(
00198         StandardActionManager::CreateResource, StandardActionManager::DialogTitle,
00199         i18nc( "@title:window", "Add Account" ) );
00200 
00201       mGenericManager->setContextText(
00202         StandardActionManager::CreateResource, StandardActionManager::ErrorMessageText,
00203         ki18n( "Could not create account: %1" ) );
00204 
00205       mGenericManager->setContextText(
00206         StandardActionManager::CreateResource, StandardActionManager::ErrorMessageTitle,
00207         i18n( "Account creation failed" ) );
00208 
00209       mGenericManager->setContextText(
00210         StandardActionManager::DeleteResources, StandardActionManager::MessageBoxText,
00211         ki18np( "Do you really want to delete this account?",
00212                 "Do you really want to delete %1 accounts?" ) );
00213 
00214       mGenericManager->setContextText(
00215         StandardActionManager::DeleteResources, StandardActionManager::MessageBoxTitle,
00216         ki18ncp( "@title:window", "Delete Account?", "Delete Accounts?" ) );
00217 
00218       mGenericManager->setContextText(
00219         StandardActionManager::Paste, StandardActionManager::ErrorMessageText,
00220         ki18n( "Could not paste email: %1" ) );
00221 
00222       mGenericManager->setContextText(
00223         StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle,
00224         i18n( "Paste failed" ) );
00225 
00226       mGenericManager->setMimeTypeFilter( QStringList() << KMime::Message::mimeType() );
00227       mGenericManager->setCapabilityFilter( QStringList() << QLatin1String( "Resource" ) );
00228     }
00229 
00230     ~Private()
00231     {
00232       delete mGenericManager;
00233     }
00234 
00235     void updateActions()
00236     {
00237       const Akonadi::Item::List selectedItems = mGenericManager->selectedItems();
00238       const Akonadi::Collection::List selectedCollections = mGenericManager->selectedCollections();
00239 
00240       bool itemIsSelected = !selectedItems.isEmpty();
00241       bool collectionIsSelected = !selectedCollections.isEmpty();
00242 
00243       if ( itemIsSelected ) {
00244         bool allMarkedAsImportant = true;
00245         bool allMarkedAsRead = true;
00246         bool allMarkedAsUnread = true;
00247         bool allMarkedAsActionItem = true;
00248 
00249         foreach ( const Akonadi::Item &item, selectedItems ) {
00250           Akonadi::MessageStatus status;
00251           status.setStatusFromFlags( item.flags() );
00252           if ( !status.isImportant() )
00253             allMarkedAsImportant = false;
00254           if ( !status.isRead() )
00255             allMarkedAsRead= false;
00256       else 
00257         allMarkedAsUnread = false;
00258           if ( !status.isToAct() )
00259             allMarkedAsActionItem = false;
00260         }
00261 
00262         QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsRead );
00263         if ( action ) {
00264           updateMarkAction( action, allMarkedAsRead );
00265           if ( allMarkedAsRead )
00266             action->setEnabled(false);
00267           else
00268             action->setEnabled( true );
00269         }
00270 
00271         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsUnread );
00272         if ( action ) {
00273           updateMarkAction( action, allMarkedAsUnread );
00274           if ( allMarkedAsUnread )
00275             action->setEnabled(false);
00276           else
00277             action->setEnabled( true );
00278         }
00279 
00280         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
00281         if ( action ) {
00282           updateMarkAction( action, allMarkedAsImportant );
00283           if ( allMarkedAsImportant )
00284             action->setText( i18n( "Remove Important Mark" ) );
00285           else
00286             action->setText( i18n( "&Mark Mail as Important" ) );
00287           action->setEnabled( true );
00288         }
00289 
00290         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
00291         if ( action ) {
00292           updateMarkAction( action, allMarkedAsActionItem );
00293           if ( allMarkedAsActionItem )
00294             action->setText( i18n( "Remove Action Item Mark" ) );
00295           else
00296             action->setText( i18n( "&Mark Mail as Action Item" ) );
00297           action->setEnabled( true );
00298         }
00299      } else {
00300         QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsRead );
00301         if ( action )
00302           action->setEnabled( false );
00303 
00304         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
00305         if ( action )
00306           action->setEnabled( false );
00307 
00308         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
00309         if ( action )
00310           action->setEnabled( false );
00311      }
00312 
00313       bool enableMarkAllAsRead = false;
00314       bool enableMarkAllAsUnread = false;
00315       bool canDeleteItem = true;
00316       bool isSystemFolder = false;
00317       if ( collectionIsSelected ) {
00318         foreach( const Collection &collection, selectedCollections )
00319         {
00320           if ( collection.isValid() ) {
00321             const Akonadi::CollectionStatistics stats = collection.statistics();
00322             if ( !enableMarkAllAsRead )
00323               enableMarkAllAsRead = (stats.unreadCount() > 0);
00324             if ( !enableMarkAllAsUnread )
00325               enableMarkAllAsUnread = (stats.count() != stats.unreadCount());
00326             if ( canDeleteItem )
00327               canDeleteItem = collection.rights() & Akonadi::Collection::CanDeleteItem;
00328             if ( !isSystemFolder ) {
00329               isSystemFolder = (collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Inbox ) ||
00330                                 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Outbox ) ||
00331                                 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::SentMail ) ||
00332                                 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Trash ) ||
00333                                 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Drafts ) ||
00334                                 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Templates ));
00335             }
00336             //We will not change after that.
00337             if ( enableMarkAllAsRead && enableMarkAllAsUnread && !canDeleteItem && isSystemFolder )
00338               break;
00339           }
00340         }
00341       }
00342       if ( isSystemFolder ) {
00343         if ( mGenericManager->action( StandardActionManager::DeleteCollections ) ) {
00344           mGenericManager->action( StandardActionManager::DeleteCollections )->setEnabled( false );
00345         }
00346       }
00347 
00348       if ( mActions.contains( Akonadi::StandardMailActionManager::MoveToTrash ) )
00349         mActions.value( Akonadi::StandardMailActionManager::MoveToTrash )->setEnabled( itemIsSelected && canDeleteItem );
00350       if ( mActions.contains( Akonadi::StandardMailActionManager::RemoveDuplicates ) )
00351         mActions.value( Akonadi::StandardMailActionManager::RemoveDuplicates )->setEnabled( canDeleteItem );
00352 
00353       QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsRead );
00354       if ( action ) {
00355         action->setEnabled( enableMarkAllAsRead );
00356       }
00357 
00358       action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsUnread );
00359       if ( action ) {
00360         action->setEnabled( enableMarkAllAsUnread );
00361       }
00362 
00363       emit mParent->actionStateUpdated();
00364     }
00365 
00366     void updateMarkAction( QAction* action, bool allMarked )
00367     {
00368       QByteArray data = action->data().toByteArray();
00369       if ( allMarked ) {
00370         if ( !data.startsWith( '!' ) )
00371           data.prepend( '!' );
00372       } else {
00373         if ( data.startsWith( '!' ) )
00374           data = data.mid( 1 );
00375       }
00376       action->setData( data );
00377     }
00378 
00379     void slotMarkAs()
00380     {
00381       const QAction *action = qobject_cast<QAction*>( mParent->sender() );
00382       Q_ASSERT( action );
00383 
00384       const Akonadi::Item::List items = mGenericManager->selectedItems();
00385       if ( items.isEmpty() )
00386         return;
00387 
00388       QByteArray typeStr = action->data().toByteArray();
00389       kDebug() << "Mark mail as: " << typeStr;
00390 
00391       bool invert = false;
00392       if ( typeStr.startsWith( '!' ) ) {
00393         invert = true;
00394         typeStr = typeStr.mid( 1 );
00395       }
00396 
00397       Akonadi::MessageStatus targetStatus;
00398       targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
00399 
00400       StandardMailActionManager::Type type = MarkMailAsRead;
00401       if ( typeStr == "U" ) {
00402         type = MarkMailAsUnread;
00403         targetStatus.setRead( true );
00404         invert = true;
00405       } else if ( typeStr == "K" )
00406         type = MarkMailAsActionItem;
00407       else if ( typeStr == "G" )
00408         type = MarkMailAsImportant;
00409 
00410       if ( mInterceptedActions.contains( type ) )
00411         return;
00412 
00413       MarkAsCommand *command = new MarkAsCommand( targetStatus, items, invert, mParent );
00414       command->execute();
00415     }
00416 
00417     void slotMarkAllAs()
00418     {
00419       const QAction *action = qobject_cast<QAction*>( mParent->sender() );
00420       Q_ASSERT( action );
00421 
00422       QByteArray typeStr = action->data().toByteArray();
00423       kDebug() << "Mark all as: " << typeStr;
00424 
00425       const Akonadi::Collection::List collections = mGenericManager->selectedCollections();
00426       if ( collections.isEmpty() )
00427         return;
00428 
00429       Akonadi::MessageStatus targetStatus;
00430       targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
00431 
00432       bool invert = false;
00433       if ( typeStr.startsWith( '!' ) ) {
00434         invert = true;
00435         typeStr = typeStr.mid( 1 );
00436       }
00437 
00438       StandardMailActionManager::Type type = MarkAllMailAsRead;
00439       if ( typeStr == "U" ) {
00440         type = MarkAllMailAsUnread;
00441         targetStatus.setRead( true );
00442         invert = true;
00443       } else if ( typeStr == "K" )
00444         type = MarkAllMailAsActionItem;
00445       else if ( typeStr == "G" )
00446         type = MarkAllMailAsImportant;
00447 
00448       if ( mInterceptedActions.contains( type ) )
00449         return;
00450 
00451       MarkAsCommand *command = new MarkAsCommand( targetStatus, collections, invert, mParent );
00452       command->execute();
00453     }
00454 
00455     void slotMoveToTrash()
00456     {
00457       if ( mInterceptedActions.contains( StandardMailActionManager::MoveToTrash ) )
00458         return;
00459 
00460       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00461         return;
00462 
00463       const Item::List items = mGenericManager->selectedItems();
00464       if ( items.isEmpty() )
00465         return;
00466 
00467       MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), items, mParent );
00468       command->execute();
00469     }
00470 
00471     void slotMoveAllToTrash()
00472     {
00473       if ( mInterceptedActions.contains( StandardMailActionManager::MoveAllToTrash ) )
00474         return;
00475 
00476       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00477         return;
00478 
00479       const Collection::List collections = mGenericManager->selectedCollections();
00480       if ( collections.isEmpty() )
00481         return;
00482 
00483       MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), collections, mParent );
00484       command->execute();
00485     }
00486 
00487     void slotRemoveDuplicates()
00488     {
00489       if ( mInterceptedActions.contains( StandardMailActionManager::RemoveDuplicates ) )
00490         return;
00491 
00492       const Collection::List collections = mGenericManager->selectedCollections();
00493       if ( collections.isEmpty() )
00494         return;
00495 
00496       RemoveDuplicatesCommand *command = new RemoveDuplicatesCommand( mCollectionSelectionModel->model(), collections, mParent );
00497       command->execute();
00498     }
00499 
00500     void slotEmptyAllTrash()
00501     {
00502       if ( mInterceptedActions.contains( StandardMailActionManager::EmptyAllTrash ) )
00503         return;
00504 
00505       EmptyTrashCommand *command = new EmptyTrashCommand( const_cast<QAbstractItemModel*>( mCollectionSelectionModel->model() ), mParent );
00506       command->execute();
00507     }
00508 
00509     void slotEmptyTrash()
00510     {
00511       if ( mInterceptedActions.contains( StandardMailActionManager::EmptyTrash ) )
00512         return;
00513 
00514       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00515         return;
00516 
00517       const Collection::List collections = mGenericManager->selectedCollections();
00518       if ( collections.count() != 1 )
00519         return;
00520 
00521       EmptyTrashCommand *command = new EmptyTrashCommand( collections.first(), mParent );
00522       command->execute();
00523     }
00524 
00525     KActionCollection *mActionCollection;
00526     QWidget *mParentWidget;
00527     StandardActionManager *mGenericManager;
00528     QItemSelectionModel *mCollectionSelectionModel;
00529     QItemSelectionModel *mItemSelectionModel;
00530     QHash<StandardMailActionManager::Type, KAction*> mActions;
00531     QSet<StandardMailActionManager::Type> mInterceptedActions;
00532     StandardMailActionManager *mParent;
00533 };
00534 
00535 
00536 StandardMailActionManager::StandardMailActionManager( KActionCollection *actionCollection, QWidget *parent )
00537   : QObject( parent ), d( new Private( actionCollection, parent, this ) )
00538 {
00539 }
00540 
00541 StandardMailActionManager::~StandardMailActionManager()
00542 {
00543   delete d;
00544 }
00545 
00546 void StandardMailActionManager::setCollectionSelectionModel( QItemSelectionModel *selectionModel )
00547 {
00548   d->mCollectionSelectionModel = selectionModel;
00549   d->mGenericManager->setCollectionSelectionModel( selectionModel );
00550 
00551   connect( selectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
00552            SLOT(updateActions()) );
00553   connect( selectionModel->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
00554            SLOT(updateActions()) );
00555   connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
00556            SLOT(updateActions()) );
00557 
00558   d->updateActions();
00559 }
00560 
00561 void StandardMailActionManager::setItemSelectionModel( QItemSelectionModel* selectionModel )
00562 {
00563   d->mItemSelectionModel = selectionModel;
00564   d->mGenericManager->setItemSelectionModel( selectionModel );
00565 
00566   connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
00567            SLOT(updateActions()) );
00568 
00569   //to catch item modifications, listen to the model's dataChanged signal as well
00570   connect( selectionModel->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
00571            SLOT(updateActions()) );
00572 
00573   d->updateActions();
00574 }
00575 
00576 KAction* StandardMailActionManager::createAction( Type type )
00577 {
00578   if ( d->mActions.contains( type ) )
00579     return d->mActions.value( type );
00580 
00581   KAction *action = 0;
00582 
00583   switch ( type ) {
00584     case MarkMailAsRead:
00585       action = new KAction( d->mParentWidget );
00586       action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
00587       action->setText( i18n( "&Mark Mail as Read" ) );
00588       action->setIconText( i18n( "Mark as Read" ) );
00589       action->setWhatsThis( i18n( "Mark selected messages as read" ) );
00590       d->mActions.insert( MarkMailAsRead, action );
00591       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_read" ), action );
00592       action->setData( QByteArray( "R" ) );
00593       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
00594       break;
00595     case MarkMailAsUnread:
00596       action = new KAction( d->mParentWidget );
00597       action->setText( i18n( "&Mark Mail as Unread" ) );
00598       action->setIconText( i18n( "Mark as Unread" ) );
00599       action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
00600       d->mActions.insert( MarkMailAsUnread, action );
00601       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_unread" ), action );
00602       action->setShortcut( Qt::CTRL+Qt::Key_U );
00603       action->setData( QByteArray( "U" ) );
00604       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
00605       break;
00606     case MarkMailAsImportant:
00607       action = new KAction( d->mParentWidget );
00608       action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
00609       action->setText( i18n( "&Mark Mail as Important" ) );
00610       action->setIconText( i18n( "Mark as Important" ) );
00611       d->mActions.insert( MarkMailAsImportant, action );
00612       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_important" ), action );
00613       action->setData( QByteArray( "G" ) );
00614       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
00615       break;
00616     case MarkMailAsActionItem:
00617       action = new KAction( d->mParentWidget );
00618       action->setText( i18n( "&Mark Mail as Action Item" ) );
00619       action->setIconText( i18n( "Mark as Action Item" ) );
00620       action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
00621       d->mActions.insert( MarkMailAsActionItem, action );
00622       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_action_item" ), action );
00623       action->setData( QByteArray( "K" ) );
00624       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
00625       break;
00626     case MarkAllMailAsRead:
00627       action = new KAction( d->mParentWidget );
00628       action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
00629       action->setText( i18n( "Mark &All Mails as Read" ) );
00630       action->setIconText( i18n( "Mark All as Read" ) );
00631       d->mActions.insert( MarkAllMailAsRead, action );
00632       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_read" ), action );
00633       action->setData( QByteArray( "R" ) );
00634       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
00635       break;
00636     case MarkAllMailAsUnread:
00637       action = new KAction( d->mParentWidget );
00638       action->setText( i18n( "Mark &All Mails as Unread" ) );
00639       action->setIconText( i18n( "Mark All as Unread" ) );
00640       action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
00641       d->mActions.insert( MarkAllMailAsUnread, action );
00642       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_unread" ), action );
00643       action->setData( QByteArray( "U" ) );
00644       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
00645       break;
00646     case MarkAllMailAsImportant:
00647       action = new KAction( d->mParentWidget );
00648       action->setText( i18n( "Mark &All Mails as Important" ) );
00649       action->setIconText( i18n( "Mark All as Important" ) );
00650       action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
00651       d->mActions.insert( MarkAllMailAsImportant, action );
00652       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_important" ), action );
00653       action->setData( QByteArray( "G" ) );
00654       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
00655       break;
00656     case MarkAllMailAsActionItem:
00657       action = new KAction( d->mParentWidget );
00658       action->setText( i18n( "Mark &All Mails as Action Item" ) );
00659       action->setIconText( i18n( "Mark All as Action Item" ) );
00660       action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
00661       d->mActions.insert( MarkAllMailAsActionItem, action );
00662       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_action_item" ), action );
00663       action->setData( QByteArray("K") );
00664       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
00665       break;
00666     case MoveToTrash:
00667       action = new KAction( d->mParentWidget );
00668       action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
00669       action->setText( i18n( "Move to &Trash" ) );
00670       action->setShortcut( QKeySequence( Qt::Key_Delete ) );
00671       action->setWhatsThis( i18n( "Move message to trashcan" ) );
00672       d->mActions.insert( MoveToTrash, action );
00673       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_to_trash" ), action );
00674       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMoveToTrash()) );
00675       break;
00676     case MoveAllToTrash:
00677       action = new KAction( d->mParentWidget );
00678       action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
00679       action->setText( i18n( "Move All to &Trash" ) );
00680       d->mActions.insert( MoveAllToTrash, action );
00681       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_all_to_trash" ), action );
00682       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMoveAllToTrash()) );
00683       break;
00684     case RemoveDuplicates:
00685       action = new KAction( d->mParentWidget );
00686       action->setText( i18n( "Remove &Duplicate Mails" ) );
00687       action->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_Asterisk ) );
00688       d->mActions.insert( RemoveDuplicates, action );
00689       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_remove_duplicates" ), action );
00690       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotRemoveDuplicates()) );
00691       break;
00692     case EmptyAllTrash:
00693       action = new KAction( d->mParentWidget );
00694       action->setText( i18n( "Empty All &Trash Folders" ) );
00695       d->mActions.insert( EmptyAllTrash, action );
00696       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_all_trash" ), action );
00697       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotEmptyAllTrash()) );
00698       break;
00699     case EmptyTrash:
00700       action = new KAction( d->mParentWidget );
00701       action->setText( i18n( "E&mpty Trash" ) );
00702       d->mActions.insert( EmptyTrash, action );
00703       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_trash" ), action );
00704       connect( action, SIGNAL(triggered(bool)), this, SLOT(slotEmptyTrash()) );
00705       break;
00706     default:
00707       Q_ASSERT( false ); // should never happen
00708       break;
00709   }
00710 
00711   return action;
00712 }
00713 
00714 KAction* StandardMailActionManager::createAction( StandardActionManager::Type type )
00715 {
00716   return d->mGenericManager->createAction( type );
00717 }
00718 
00719 void StandardMailActionManager::createAllActions()
00720 {
00721   createAction( MarkMailAsRead );
00722   createAction( MarkMailAsUnread );
00723   createAction( MarkMailAsImportant );
00724   createAction( MarkMailAsActionItem );
00725   createAction( MarkAllMailAsRead );
00726   createAction( MarkAllMailAsUnread );
00727   createAction( MarkAllMailAsImportant );
00728   createAction( MarkAllMailAsActionItem );
00729   createAction( MoveToTrash );
00730   createAction( MoveAllToTrash );
00731   createAction( RemoveDuplicates );
00732   createAction( EmptyAllTrash );
00733   createAction( EmptyTrash );
00734 
00735   d->mGenericManager->createAllActions();
00736 
00737   d->updateActions();
00738 }
00739 
00740 KAction* StandardMailActionManager::action( Type type ) const
00741 {
00742   if ( d->mActions.contains( type ) )
00743     return d->mActions.value( type );
00744 
00745   return 0;
00746 }
00747 
00748 KAction* StandardMailActionManager::action( StandardActionManager::Type type ) const
00749 {
00750   return d->mGenericManager->action( type );
00751 }
00752 
00753 void StandardMailActionManager::setActionText( StandardActionManager::Type type, const KLocalizedString &text )
00754 {
00755   d->mGenericManager->setActionText( type, text );
00756 }
00757 
00758 void StandardMailActionManager::interceptAction( Type type, bool intercept )
00759 {
00760   if ( intercept )
00761     d->mInterceptedActions.insert( type );
00762   else
00763     d->mInterceptedActions.remove( type );
00764 }
00765 
00766 void StandardMailActionManager::interceptAction( StandardActionManager::Type type, bool intercept )
00767 {
00768   d->mGenericManager->interceptAction( type, intercept );
00769 }
00770 
00771 Akonadi::Collection::List StandardMailActionManager::selectedCollections() const
00772 {
00773   return d->mGenericManager->selectedCollections();
00774 }
00775 
00776 Akonadi::Item::List StandardMailActionManager::selectedItems() const
00777 {
00778   return d->mGenericManager->selectedItems();
00779 }
00780 
00781 void StandardMailActionManager::setFavoriteCollectionsModel( FavoriteCollectionsModel *favoritesModel )
00782 {
00783   d->mGenericManager->setFavoriteCollectionsModel( favoritesModel );
00784 }
00785 
00786 void StandardMailActionManager::setFavoriteSelectionModel( QItemSelectionModel *selectionModel )
00787 {
00788   d->mGenericManager->setFavoriteSelectionModel( selectionModel );
00789 }
00790 
00791 void StandardMailActionManager::setCollectionPropertiesPageNames( const QStringList &names )
00792 {
00793   d->mGenericManager->setCollectionPropertiesPageNames( names );
00794 }
00795 
00796 Akonadi::StandardActionManager* StandardMailActionManager::standardActionManager() const
00797 {
00798   return d->mGenericManager;
00799 }
00800 
00801 
00802 #include "standardmailactionmanager.moc"
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Apr 30 2012 21:49:40 by doxygen 1.8.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi/kmime

Skip menu "akonadi/kmime"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Members
  • File List
  • Related Pages

kdepimlibs-4.8.3 API Reference

Skip menu "kdepimlibs-4.8.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal