00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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 );
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"