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"