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