• Skip to content
  • Skip to link menu
KDE 4.8 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • KDE Home
  • Contact Us
 

akonadi

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

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Modules
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • 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
Generated for KDE-PIM Libraries by doxygen 1.7.6.1
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