• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • 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         i18n( "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         i18n( "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         i18nc( "@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         i18n( "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         i18n( "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         i18n( "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       mGenericManager->interceptAction( Akonadi::StandardActionManager::ManageLocalSubscriptions );
00229       connect( mGenericManager->action( StandardActionManager::ManageLocalSubscriptions ), SIGNAL( triggered( bool ) ),
00230                mParent, SLOT( slotMailLocalSubscription() ) );
00231     }
00232 
00233     ~Private()
00234     {
00235       delete mGenericManager;
00236     }
00237 
00238     void updateActions()
00239     {
00240       const Akonadi::Item::List selectedItems = mGenericManager->selectedItems();
00241       const Akonadi::Collection::List selectedCollections = mGenericManager->selectedCollections();
00242 
00243       bool itemIsSelected = !selectedItems.isEmpty();
00244       bool collectionIsSelected = !selectedCollections.isEmpty();
00245 
00246       if ( itemIsSelected ) {
00247         bool allMarkedAsImportant = true;
00248         bool allMarkedAsRead = true;
00249         bool allMarkedAsActionItem = true;
00250 
00251         foreach ( const Akonadi::Item &item, selectedItems ) {
00252           Akonadi::MessageStatus status;
00253           status.setStatusFromFlags( item.flags() );
00254           if ( !status.isImportant() )
00255             allMarkedAsImportant = false;
00256           if ( !status.isRead() )
00257             allMarkedAsRead= 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->setText( i18n( "&Mark Mail as Unread" ) );
00267           else
00268             action->setText( i18n( "&Mark Mail as Read" ) );
00269           action->setEnabled( true );
00270         }
00271 
00272         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
00273         if ( action ) {
00274           updateMarkAction( action, allMarkedAsImportant );
00275           if ( allMarkedAsImportant )
00276             action->setText( i18n( "Remove Important Mark" ) );
00277           else
00278             action->setText( i18n( "&Mark Mail as Important" ) );
00279           action->setEnabled( true );
00280         }
00281 
00282         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
00283         if ( action ) {
00284           updateMarkAction( action, allMarkedAsActionItem );
00285           if ( allMarkedAsActionItem )
00286             action->setText( i18n( "Remove Action Item Mark" ) );
00287           else
00288             action->setText( i18n( "&Mark Mail as Action Item" ) );
00289           action->setEnabled( true );
00290         }
00291      } else {
00292         QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsRead );
00293         if ( action )
00294           action->setEnabled( false );
00295 
00296         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
00297         if ( action )
00298           action->setEnabled( false );
00299 
00300         action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
00301         if ( action )
00302           action->setEnabled( false );
00303      }
00304 
00305       bool enableMarkAllAsRead = false;
00306       bool enableMarkAllAsUnread = false;
00307       if ( collectionIsSelected ) {
00308         const Collection collection = selectedCollections.first();
00309         if ( collection.isValid() ) {
00310           const Akonadi::CollectionStatistics stats = collection.statistics();
00311           enableMarkAllAsRead = (stats.unreadCount() > 0);
00312           enableMarkAllAsUnread = (stats.count() != stats.unreadCount());
00313 
00314           const bool isSystemFolder = (collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Inbox ) ||
00315                                        collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Outbox ) ||
00316                                        collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::SentMail ) ||
00317                                        collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Trash ) ||
00318                                        collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Drafts ) ||
00319                                        collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Templates ));
00320 
00321           if ( isSystemFolder ) {
00322             if ( mGenericManager->action( StandardActionManager::DeleteCollections ) ) {
00323               mGenericManager->action( StandardActionManager::DeleteCollections )->setEnabled( false );
00324             }
00325           }
00326         }
00327       }
00328 
00329       if ( mActions.contains( Akonadi::StandardMailActionManager::MoveToTrash ) )
00330         mActions.value( Akonadi::StandardMailActionManager::MoveToTrash )->setEnabled( itemIsSelected );
00331 
00332       QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsRead );
00333       if ( action )
00334         action->setEnabled( enableMarkAllAsRead );
00335 
00336       action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsUnread );
00337       if ( action )
00338         action->setEnabled( enableMarkAllAsUnread );
00339 
00340       emit mParent->actionStateUpdated();
00341     }
00342 
00343     void updateMarkAction( QAction* action, bool allMarked )
00344     {
00345       QByteArray data = action->data().toByteArray();
00346       if ( allMarked ) {
00347         if ( !data.startsWith( '!' ) )
00348           data.prepend( '!' );
00349       } else {
00350         if ( data.startsWith( '!' ) )
00351           data = data.mid( 1 );
00352       }
00353       action->setData( data );
00354     }
00355 
00356     void slotMarkAs()
00357     {
00358       const QAction *action = qobject_cast<QAction*>( mParent->sender() );
00359       Q_ASSERT( action );
00360 
00361       const Akonadi::Item::List items = mGenericManager->selectedItems();
00362       if ( items.isEmpty() )
00363         return;
00364 
00365       QByteArray typeStr = action->data().toByteArray();
00366       kDebug() << "Mark mail as: " << typeStr;
00367 
00368       bool invert = false;
00369       if ( typeStr.startsWith( '!' ) ) {
00370         invert = true;
00371         typeStr = typeStr.mid( 1 );
00372       }
00373 
00374       Akonadi::MessageStatus targetStatus;
00375       targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
00376 
00377       StandardMailActionManager::Type type = MarkMailAsRead;
00378       if ( typeStr == "U" ) {
00379         type = MarkMailAsUnread;
00380         targetStatus.setRead( true );
00381         invert = true;
00382       } else if ( typeStr == "K" )
00383         type = MarkMailAsActionItem;
00384       else if ( typeStr == "G" )
00385         type = MarkMailAsImportant;
00386 
00387       if ( mInterceptedActions.contains( type ) )
00388         return;
00389 
00390       MarkAsCommand *command = new MarkAsCommand( targetStatus, items, invert, mParent );
00391       command->execute();
00392     }
00393 
00394     void slotMarkAllAs()
00395     {
00396       const QAction *action = qobject_cast<QAction*>( mParent->sender() );
00397       Q_ASSERT( action );
00398 
00399       QByteArray typeStr = action->data().toByteArray();
00400       kDebug() << "Mark all as: " << typeStr;
00401 
00402       const Akonadi::Collection::List collections = mGenericManager->selectedCollections();
00403       if ( collections.isEmpty() )
00404         return;
00405 
00406       Akonadi::MessageStatus targetStatus;
00407       targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
00408 
00409       bool invert = false;
00410       if ( typeStr.startsWith( '!' ) ) {
00411         invert = true;
00412         typeStr = typeStr.mid( 1 );
00413       }
00414 
00415       StandardMailActionManager::Type type = MarkAllMailAsRead;
00416       if ( typeStr == "U" ) {
00417         type = MarkAllMailAsUnread;
00418         targetStatus.setRead( true );
00419         invert = true;
00420       } else if ( typeStr == "K" )
00421         type = MarkAllMailAsActionItem;
00422       else if ( typeStr == "G" )
00423         type = MarkAllMailAsImportant;
00424 
00425       if ( mInterceptedActions.contains( type ) )
00426         return;
00427 
00428       MarkAsCommand *command = new MarkAsCommand( targetStatus, collections, invert, mParent );
00429       command->execute();
00430     }
00431 
00432     void slotMoveToTrash()
00433     {
00434       if ( mInterceptedActions.contains( StandardMailActionManager::MoveToTrash ) )
00435         return;
00436 
00437       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00438         return;
00439 
00440       const Item::List items = mGenericManager->selectedItems();
00441       if ( items.isEmpty() )
00442         return;
00443 
00444       MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), items, mParent );
00445       command->execute();
00446     }
00447 
00448     void slotMoveAllToTrash()
00449     {
00450       if ( mInterceptedActions.contains( StandardMailActionManager::MoveAllToTrash ) )
00451         return;
00452 
00453       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00454         return;
00455 
00456       const Collection::List collections = mGenericManager->selectedCollections();
00457       if ( collections.isEmpty() )
00458         return;
00459 
00460       MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), collections, mParent );
00461       command->execute();
00462     }
00463 
00464     void slotRemoveDuplicates()
00465     {
00466       if ( mInterceptedActions.contains( StandardMailActionManager::RemoveDuplicates ) )
00467         return;
00468 
00469       const Collection::List collections = mGenericManager->selectedCollections();
00470       if ( collections.isEmpty() )
00471         return;
00472 
00473       RemoveDuplicatesCommand *command = new RemoveDuplicatesCommand( mCollectionSelectionModel->model(), collections, mParent );
00474       command->execute();
00475     }
00476 
00477     void slotEmptyAllTrash()
00478     {
00479       if ( mInterceptedActions.contains( StandardMailActionManager::EmptyAllTrash ) )
00480         return;
00481 
00482       EmptyTrashCommand *command = new EmptyTrashCommand( const_cast<QAbstractItemModel*>( mCollectionSelectionModel->model() ), mParent );
00483       command->execute();
00484     }
00485 
00486     void slotEmptyTrash()
00487     {
00488       if ( mInterceptedActions.contains( StandardMailActionManager::EmptyTrash ) )
00489         return;
00490 
00491       if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
00492         return;
00493 
00494       const Collection::List collections = mGenericManager->selectedCollections();
00495       if ( collections.count() != 1 )
00496         return;
00497 
00498       EmptyTrashCommand *command = new EmptyTrashCommand( collections.first(), mParent );
00499       command->execute();
00500     }
00501 
00502     void slotMailLocalSubscription()
00503     {
00504 #ifndef Q_OS_WINCE
00505       SubscriptionDialog* dlg = new SubscriptionDialog( KMime::Message::mimeType(), mParentWidget );
00506       dlg->show();
00507 #endif
00508     }
00509 
00510     KActionCollection *mActionCollection;
00511     QWidget *mParentWidget;
00512     StandardActionManager *mGenericManager;
00513     QItemSelectionModel *mCollectionSelectionModel;
00514     QItemSelectionModel *mItemSelectionModel;
00515     QHash<StandardMailActionManager::Type, KAction*> mActions;
00516     QSet<StandardMailActionManager::Type> mInterceptedActions;
00517     StandardMailActionManager *mParent;
00518 };
00519 
00520 
00521 StandardMailActionManager::StandardMailActionManager( KActionCollection *actionCollection, QWidget *parent )
00522   : QObject( parent ), d( new Private( actionCollection, parent, this ) )
00523 {
00524 }
00525 
00526 StandardMailActionManager::~StandardMailActionManager()
00527 {
00528   delete d;
00529 }
00530 
00531 void StandardMailActionManager::setCollectionSelectionModel( QItemSelectionModel *selectionModel )
00532 {
00533   d->mCollectionSelectionModel = selectionModel;
00534   d->mGenericManager->setCollectionSelectionModel( selectionModel );
00535 
00536   connect( selectionModel->model(), SIGNAL( rowsInserted( const QModelIndex&, int, int ) ),
00537            SLOT( updateActions() ) );
00538   connect( selectionModel->model(), SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ),
00539            SLOT( updateActions() ) );
00540   connect( selectionModel, SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ),
00541            SLOT( updateActions() ) );
00542 
00543   d->updateActions();
00544 }
00545 
00546 void StandardMailActionManager::setItemSelectionModel( QItemSelectionModel* selectionModel )
00547 {
00548   d->mItemSelectionModel = selectionModel;
00549   d->mGenericManager->setItemSelectionModel( selectionModel );
00550 
00551   connect( selectionModel, SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ),
00552            SLOT( updateActions() ) );
00553 
00554   //to catch item modifications, listen to the model's dataChanged signal as well
00555   connect( selectionModel->model(), SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ),
00556            SLOT( updateActions() ) );
00557 
00558   d->updateActions();
00559 }
00560 
00561 KAction* StandardMailActionManager::createAction( Type type )
00562 {
00563   if ( d->mActions.contains( type ) )
00564     return d->mActions.value( type );
00565 
00566   KAction *action = 0;
00567 
00568   switch ( type ) {
00569     case MarkMailAsRead:
00570       action = new KAction( d->mParentWidget );
00571       action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
00572       action->setText( i18n( "&Mark Mail as Read" ) );
00573       action->setIconText( i18n( "Mark as Read" ) );
00574       action->setWhatsThis( i18n( "Mark selected messages as read" ) );
00575       d->mActions.insert( MarkMailAsRead, action );
00576       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_read" ), action );
00577       action->setData( QByteArray( "R" ) );
00578       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) );
00579       break;
00580     case MarkMailAsUnread:
00581       action = new KAction( d->mParentWidget );
00582       action->setText( i18n( "&Mark Mail as Unread" ) );
00583       action->setIconText( i18n( "Mark as Unread" ) );
00584       action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
00585       d->mActions.insert( MarkMailAsUnread, action );
00586       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_unread" ), action );
00587       action->setShortcut( Qt::CTRL+Qt::Key_U );
00588       action->setData( QByteArray( "U" ) );
00589       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) );
00590       break;
00591     case MarkMailAsImportant:
00592       action = new KAction( d->mParentWidget );
00593       action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
00594       action->setText( i18n( "&Mark Mail as Important" ) );
00595       action->setIconText( i18n( "Mark as Important" ) );
00596       d->mActions.insert( MarkMailAsImportant, action );
00597       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_important" ), action );
00598       action->setData( QByteArray( "G" ) );
00599       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) );
00600       break;
00601     case MarkMailAsActionItem:
00602       action = new KAction( d->mParentWidget );
00603       action->setText( i18n( "&Mark Mail as Action Item" ) );
00604       action->setIconText( i18n( "Mark as Action Item" ) );
00605       action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
00606       d->mActions.insert( MarkMailAsActionItem, action );
00607       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_action_item" ), action );
00608       action->setData( QByteArray( "K" ) );
00609       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) );
00610       break;
00611     case MarkAllMailAsRead:
00612       action = new KAction( d->mParentWidget );
00613       action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
00614       action->setText( i18n( "Mark &All Mails as Read" ) );
00615       action->setIconText( i18n( "Mark All as Read" ) );
00616       d->mActions.insert( MarkAllMailAsRead, action );
00617       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_read" ), action );
00618       action->setData( QByteArray( "R" ) );
00619       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) );
00620       break;
00621     case MarkAllMailAsUnread:
00622       action = new KAction( d->mParentWidget );
00623       action->setText( i18n( "Mark &All Mails as Unread" ) );
00624       action->setIconText( i18n( "Mark All as Unread" ) );
00625       action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
00626       d->mActions.insert( MarkAllMailAsUnread, action );
00627       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_unread" ), action );
00628       action->setData( QByteArray( "U" ) );
00629       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) );
00630       break;
00631     case MarkAllMailAsImportant:
00632       action = new KAction( d->mParentWidget );
00633       action->setText( i18n( "Mark &All Mails as Important" ) );
00634       action->setIconText( i18n( "Mark All as Important" ) );
00635       action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
00636       d->mActions.insert( MarkAllMailAsImportant, action );
00637       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_important" ), action );
00638       action->setData( QByteArray( "G" ) );
00639       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) );
00640       break;
00641     case MarkAllMailAsActionItem:
00642       action = new KAction( d->mParentWidget );
00643       action->setText( i18n( "Mark &All Mails as Action Item" ) );
00644       action->setIconText( i18n( "Mark All as Action Item" ) );
00645       action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
00646       d->mActions.insert( MarkAllMailAsActionItem, action );
00647       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_action_item" ), action );
00648       action->setData( QByteArray("K") );
00649       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) );
00650       break;
00651     case MoveToTrash:
00652       action = new KAction( d->mParentWidget );
00653       action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
00654       action->setText( i18n( "Move to &Trash" ) );
00655       action->setShortcut( QKeySequence( Qt::Key_Delete ) );
00656       action->setWhatsThis( i18n( "Move message to trashcan" ) );
00657       d->mActions.insert( MoveToTrash, action );
00658       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_to_trash" ), action );
00659       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMoveToTrash() ) );
00660       break;
00661     case MoveAllToTrash:
00662       action = new KAction( d->mParentWidget );
00663       action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
00664       action->setText( i18n( "Move All to &Trash" ) );
00665       d->mActions.insert( MoveAllToTrash, action );
00666       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_all_to_trash" ), action );
00667       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMoveAllToTrash() ) );
00668       break;
00669     case RemoveDuplicates:
00670       action = new KAction( d->mParentWidget );
00671       action->setText( i18n( "Remove &Duplicate Mails" ) );
00672       action->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_Asterisk ) );
00673       d->mActions.insert( RemoveDuplicates, action );
00674       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_remove_duplicates" ), action );
00675       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotRemoveDuplicates() ) );
00676       break;
00677     case EmptyAllTrash:
00678       action = new KAction( d->mParentWidget );
00679       action->setText( i18n( "Empty All &Trash Folders" ) );
00680       d->mActions.insert( EmptyAllTrash, action );
00681       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_all_trash" ), action );
00682       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotEmptyAllTrash() ) );
00683       break;
00684     case EmptyTrash:
00685       action = new KAction( d->mParentWidget );
00686       action->setText( i18n( "E&mpty Trash" ) );
00687       d->mActions.insert( EmptyTrash, action );
00688       d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_trash" ), action );
00689       connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotEmptyTrash() ) );
00690       break;
00691     default:
00692       Q_ASSERT( false ); // should never happen
00693       break;
00694   }
00695 
00696   return action;
00697 }
00698 
00699 KAction* StandardMailActionManager::createAction( StandardActionManager::Type type )
00700 {
00701   return d->mGenericManager->createAction( type );
00702 }
00703 
00704 void StandardMailActionManager::createAllActions()
00705 {
00706   createAction( MarkMailAsRead );
00707   createAction( MarkMailAsUnread );
00708   createAction( MarkMailAsImportant );
00709   createAction( MarkMailAsActionItem );
00710   createAction( MarkAllMailAsRead );
00711   createAction( MarkAllMailAsUnread );
00712   createAction( MarkAllMailAsImportant );
00713   createAction( MarkAllMailAsActionItem );
00714   createAction( MoveToTrash );
00715   createAction( MoveAllToTrash );
00716   createAction( RemoveDuplicates );
00717   createAction( EmptyAllTrash );
00718   createAction( EmptyTrash );
00719 
00720   d->mGenericManager->createAllActions();
00721 
00722   d->updateActions();
00723 }
00724 
00725 KAction* StandardMailActionManager::action( Type type ) const
00726 {
00727   if ( d->mActions.contains( type ) )
00728     return d->mActions.value( type );
00729 
00730   return 0;
00731 }
00732 
00733 KAction* StandardMailActionManager::action( StandardActionManager::Type type ) const
00734 {
00735   return d->mGenericManager->action( type );
00736 }
00737 
00738 void StandardMailActionManager::setActionText( StandardActionManager::Type type, const KLocalizedString &text )
00739 {
00740   d->mGenericManager->setActionText( type, text );
00741 }
00742 
00743 void StandardMailActionManager::interceptAction( Type type, bool intercept )
00744 {
00745   if ( intercept )
00746     d->mInterceptedActions.insert( type );
00747   else
00748     d->mInterceptedActions.remove( type );
00749 }
00750 
00751 void StandardMailActionManager::interceptAction( StandardActionManager::Type type, bool intercept )
00752 {
00753   d->mGenericManager->interceptAction( type, intercept );
00754 }
00755 
00756 Akonadi::Collection::List StandardMailActionManager::selectedCollections() const
00757 {
00758   return d->mGenericManager->selectedCollections();
00759 }
00760 
00761 Akonadi::Item::List StandardMailActionManager::selectedItems() const
00762 {
00763   return d->mGenericManager->selectedItems();
00764 }
00765 
00766 void StandardMailActionManager::setFavoriteCollectionsModel( FavoriteCollectionsModel *favoritesModel )
00767 {
00768   d->mGenericManager->setFavoriteCollectionsModel( favoritesModel );
00769 }
00770 
00771 void StandardMailActionManager::setFavoriteSelectionModel( QItemSelectionModel *selectionModel )
00772 {
00773   d->mGenericManager->setFavoriteSelectionModel( selectionModel );
00774 }
00775 
00776 void StandardMailActionManager::setCollectionPropertiesPageNames( const QStringList &names )
00777 {
00778   d->mGenericManager->setCollectionPropertiesPageNames( names );
00779 }
00780 
00781 #include "standardmailactionmanager.moc"

akonadi/kmime

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

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • 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
Generated for KDE-PIM Libraries by doxygen 1.7.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal