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