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 } 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 if ( collectionIsSelected ) { 00306 const Collection collection = selectedCollections.first(); 00307 if ( collection.isValid() ) { 00308 const Akonadi::CollectionStatistics stats = collection.statistics(); 00309 enableMarkAllAsRead = (stats.unreadCount() > 0); 00310 enableMarkAllAsUnread = (stats.count() != stats.unreadCount()); 00311 canDeleteItem = collection.rights() & Akonadi::Collection::CanDeleteItem; 00312 const bool isSystemFolder = (collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Inbox ) || 00313 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Outbox ) || 00314 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::SentMail ) || 00315 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Trash ) || 00316 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Drafts ) || 00317 collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Templates )); 00318 00319 if ( isSystemFolder ) { 00320 if ( mGenericManager->action( StandardActionManager::DeleteCollections ) ) { 00321 mGenericManager->action( StandardActionManager::DeleteCollections )->setEnabled( false ); 00322 } 00323 } 00324 } 00325 } 00326 00327 if ( mActions.contains( Akonadi::StandardMailActionManager::MoveToTrash ) ) 00328 mActions.value( Akonadi::StandardMailActionManager::MoveToTrash )->setEnabled( itemIsSelected && canDeleteItem ); 00329 if ( mActions.contains( Akonadi::StandardMailActionManager::RemoveDuplicates ) ) 00330 mActions.value( Akonadi::StandardMailActionManager::RemoveDuplicates )->setEnabled( canDeleteItem ); 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 KActionCollection *mActionCollection; 00503 QWidget *mParentWidget; 00504 StandardActionManager *mGenericManager; 00505 QItemSelectionModel *mCollectionSelectionModel; 00506 QItemSelectionModel *mItemSelectionModel; 00507 QHash<StandardMailActionManager::Type, KAction*> mActions; 00508 QSet<StandardMailActionManager::Type> mInterceptedActions; 00509 StandardMailActionManager *mParent; 00510 }; 00511 00512 00513 StandardMailActionManager::StandardMailActionManager( KActionCollection *actionCollection, QWidget *parent ) 00514 : QObject( parent ), d( new Private( actionCollection, parent, this ) ) 00515 { 00516 } 00517 00518 StandardMailActionManager::~StandardMailActionManager() 00519 { 00520 delete d; 00521 } 00522 00523 void StandardMailActionManager::setCollectionSelectionModel( QItemSelectionModel *selectionModel ) 00524 { 00525 d->mCollectionSelectionModel = selectionModel; 00526 d->mGenericManager->setCollectionSelectionModel( selectionModel ); 00527 00528 connect( selectionModel->model(), SIGNAL( rowsInserted( const QModelIndex&, int, int ) ), 00529 SLOT( updateActions() ) ); 00530 connect( selectionModel->model(), SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ), 00531 SLOT( updateActions() ) ); 00532 connect( selectionModel, SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), 00533 SLOT( updateActions() ) ); 00534 00535 d->updateActions(); 00536 } 00537 00538 void StandardMailActionManager::setItemSelectionModel( QItemSelectionModel* selectionModel ) 00539 { 00540 d->mItemSelectionModel = selectionModel; 00541 d->mGenericManager->setItemSelectionModel( selectionModel ); 00542 00543 connect( selectionModel, SIGNAL( selectionChanged( const QItemSelection&, const QItemSelection& ) ), 00544 SLOT( updateActions() ) ); 00545 00546 //to catch item modifications, listen to the model's dataChanged signal as well 00547 connect( selectionModel->model(), SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ), 00548 SLOT( updateActions() ) ); 00549 00550 d->updateActions(); 00551 } 00552 00553 KAction* StandardMailActionManager::createAction( Type type ) 00554 { 00555 if ( d->mActions.contains( type ) ) 00556 return d->mActions.value( type ); 00557 00558 KAction *action = 0; 00559 00560 switch ( type ) { 00561 case MarkMailAsRead: 00562 action = new KAction( d->mParentWidget ); 00563 action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) ); 00564 action->setText( i18n( "&Mark Mail as Read" ) ); 00565 action->setIconText( i18n( "Mark as Read" ) ); 00566 action->setWhatsThis( i18n( "Mark selected messages as read" ) ); 00567 d->mActions.insert( MarkMailAsRead, action ); 00568 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_read" ), action ); 00569 action->setData( QByteArray( "R" ) ); 00570 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) ); 00571 break; 00572 case MarkMailAsUnread: 00573 action = new KAction( d->mParentWidget ); 00574 action->setText( i18n( "&Mark Mail as Unread" ) ); 00575 action->setIconText( i18n( "Mark as Unread" ) ); 00576 action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) ); 00577 d->mActions.insert( MarkMailAsUnread, action ); 00578 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_unread" ), action ); 00579 action->setShortcut( Qt::CTRL+Qt::Key_U ); 00580 action->setData( QByteArray( "U" ) ); 00581 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) ); 00582 break; 00583 case MarkMailAsImportant: 00584 action = new KAction( d->mParentWidget ); 00585 action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) ); 00586 action->setText( i18n( "&Mark Mail as Important" ) ); 00587 action->setIconText( i18n( "Mark as Important" ) ); 00588 d->mActions.insert( MarkMailAsImportant, action ); 00589 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_important" ), action ); 00590 action->setData( QByteArray( "G" ) ); 00591 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) ); 00592 break; 00593 case MarkMailAsActionItem: 00594 action = new KAction( d->mParentWidget ); 00595 action->setText( i18n( "&Mark Mail as Action Item" ) ); 00596 action->setIconText( i18n( "Mark as Action Item" ) ); 00597 action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) ); 00598 d->mActions.insert( MarkMailAsActionItem, action ); 00599 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_action_item" ), action ); 00600 action->setData( QByteArray( "K" ) ); 00601 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAs() ) ); 00602 break; 00603 case MarkAllMailAsRead: 00604 action = new KAction( d->mParentWidget ); 00605 action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) ); 00606 action->setText( i18n( "Mark &All Mails as Read" ) ); 00607 action->setIconText( i18n( "Mark All as Read" ) ); 00608 d->mActions.insert( MarkAllMailAsRead, action ); 00609 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_read" ), action ); 00610 action->setData( QByteArray( "R" ) ); 00611 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) ); 00612 break; 00613 case MarkAllMailAsUnread: 00614 action = new KAction( d->mParentWidget ); 00615 action->setText( i18n( "Mark &All Mails as Unread" ) ); 00616 action->setIconText( i18n( "Mark All as Unread" ) ); 00617 action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) ); 00618 d->mActions.insert( MarkAllMailAsUnread, action ); 00619 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_unread" ), action ); 00620 action->setData( QByteArray( "U" ) ); 00621 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) ); 00622 break; 00623 case MarkAllMailAsImportant: 00624 action = new KAction( d->mParentWidget ); 00625 action->setText( i18n( "Mark &All Mails as Important" ) ); 00626 action->setIconText( i18n( "Mark All as Important" ) ); 00627 action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) ); 00628 d->mActions.insert( MarkAllMailAsImportant, action ); 00629 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_important" ), action ); 00630 action->setData( QByteArray( "G" ) ); 00631 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) ); 00632 break; 00633 case MarkAllMailAsActionItem: 00634 action = new KAction( d->mParentWidget ); 00635 action->setText( i18n( "Mark &All Mails as Action Item" ) ); 00636 action->setIconText( i18n( "Mark All as Action Item" ) ); 00637 action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) ); 00638 d->mActions.insert( MarkAllMailAsActionItem, action ); 00639 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_action_item" ), action ); 00640 action->setData( QByteArray("K") ); 00641 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMarkAllAs() ) ); 00642 break; 00643 case MoveToTrash: 00644 action = new KAction( d->mParentWidget ); 00645 action->setIcon( KIcon( QLatin1String( "user-trash" ) ) ); 00646 action->setText( i18n( "Move to &Trash" ) ); 00647 action->setShortcut( QKeySequence( Qt::Key_Delete ) ); 00648 action->setWhatsThis( i18n( "Move message to trashcan" ) ); 00649 d->mActions.insert( MoveToTrash, action ); 00650 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_to_trash" ), action ); 00651 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMoveToTrash() ) ); 00652 break; 00653 case MoveAllToTrash: 00654 action = new KAction( d->mParentWidget ); 00655 action->setIcon( KIcon( QLatin1String( "user-trash" ) ) ); 00656 action->setText( i18n( "Move All to &Trash" ) ); 00657 d->mActions.insert( MoveAllToTrash, action ); 00658 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_all_to_trash" ), action ); 00659 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotMoveAllToTrash() ) ); 00660 break; 00661 case RemoveDuplicates: 00662 action = new KAction( d->mParentWidget ); 00663 action->setText( i18n( "Remove &Duplicate Mails" ) ); 00664 action->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_Asterisk ) ); 00665 d->mActions.insert( RemoveDuplicates, action ); 00666 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_remove_duplicates" ), action ); 00667 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotRemoveDuplicates() ) ); 00668 break; 00669 case EmptyAllTrash: 00670 action = new KAction( d->mParentWidget ); 00671 action->setText( i18n( "Empty All &Trash Folders" ) ); 00672 d->mActions.insert( EmptyAllTrash, action ); 00673 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_all_trash" ), action ); 00674 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotEmptyAllTrash() ) ); 00675 break; 00676 case EmptyTrash: 00677 action = new KAction( d->mParentWidget ); 00678 action->setText( i18n( "E&mpty Trash" ) ); 00679 d->mActions.insert( EmptyTrash, action ); 00680 d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_trash" ), action ); 00681 connect( action, SIGNAL( triggered( bool ) ), this, SLOT( slotEmptyTrash() ) ); 00682 break; 00683 default: 00684 Q_ASSERT( false ); // should never happen 00685 break; 00686 } 00687 00688 return action; 00689 } 00690 00691 KAction* StandardMailActionManager::createAction( StandardActionManager::Type type ) 00692 { 00693 return d->mGenericManager->createAction( type ); 00694 } 00695 00696 void StandardMailActionManager::createAllActions() 00697 { 00698 createAction( MarkMailAsRead ); 00699 createAction( MarkMailAsUnread ); 00700 createAction( MarkMailAsImportant ); 00701 createAction( MarkMailAsActionItem ); 00702 createAction( MarkAllMailAsRead ); 00703 createAction( MarkAllMailAsUnread ); 00704 createAction( MarkAllMailAsImportant ); 00705 createAction( MarkAllMailAsActionItem ); 00706 createAction( MoveToTrash ); 00707 createAction( MoveAllToTrash ); 00708 createAction( RemoveDuplicates ); 00709 createAction( EmptyAllTrash ); 00710 createAction( EmptyTrash ); 00711 00712 d->mGenericManager->createAllActions(); 00713 00714 d->updateActions(); 00715 } 00716 00717 KAction* StandardMailActionManager::action( Type type ) const 00718 { 00719 if ( d->mActions.contains( type ) ) 00720 return d->mActions.value( type ); 00721 00722 return 0; 00723 } 00724 00725 KAction* StandardMailActionManager::action( StandardActionManager::Type type ) const 00726 { 00727 return d->mGenericManager->action( type ); 00728 } 00729 00730 void StandardMailActionManager::setActionText( StandardActionManager::Type type, const KLocalizedString &text ) 00731 { 00732 d->mGenericManager->setActionText( type, text ); 00733 } 00734 00735 void StandardMailActionManager::interceptAction( Type type, bool intercept ) 00736 { 00737 if ( intercept ) 00738 d->mInterceptedActions.insert( type ); 00739 else 00740 d->mInterceptedActions.remove( type ); 00741 } 00742 00743 void StandardMailActionManager::interceptAction( StandardActionManager::Type type, bool intercept ) 00744 { 00745 d->mGenericManager->interceptAction( type, intercept ); 00746 } 00747 00748 Akonadi::Collection::List StandardMailActionManager::selectedCollections() const 00749 { 00750 return d->mGenericManager->selectedCollections(); 00751 } 00752 00753 Akonadi::Item::List StandardMailActionManager::selectedItems() const 00754 { 00755 return d->mGenericManager->selectedItems(); 00756 } 00757 00758 void StandardMailActionManager::setFavoriteCollectionsModel( FavoriteCollectionsModel *favoritesModel ) 00759 { 00760 d->mGenericManager->setFavoriteCollectionsModel( favoritesModel ); 00761 } 00762 00763 void StandardMailActionManager::setFavoriteSelectionModel( QItemSelectionModel *selectionModel ) 00764 { 00765 d->mGenericManager->setFavoriteSelectionModel( selectionModel ); 00766 } 00767 00768 void StandardMailActionManager::setCollectionPropertiesPageNames( const QStringList &names ) 00769 { 00770 d->mGenericManager->setCollectionPropertiesPageNames( names ); 00771 } 00772 00773 #include "standardmailactionmanager.moc"