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