• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.9.1 API Reference
  • KDE Home
  • Contact Us
 

akonadi

  • akonadi
  • kmime
standardmailactionmanager.cpp
1 /*
2  This file is part of Akonadi Contact.
3 
4  Copyright (c) 2009 - 2010 Tobias Koenig <tokoe@kde.org>
5  Copyright (c) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
6  Copyright (c) 2010 Andras Mantia <andras@kdab.com>
7 
8  This library is free software; you can redistribute it and/or modify it
9  under the terms of the GNU Library General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or (at your
11  option) any later version.
12 
13  This library is distributed in the hope that it will be useful, but WITHOUT
14  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
16  License for more details.
17 
18  You should have received a copy of the GNU Library General Public License
19  along with this library; see the file COPYING.LIB. If not, write to the
20  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 */
23 
24 #include "standardmailactionmanager.h"
25 
26 #include "emptytrashcommand_p.h"
27 #include "markascommand_p.h"
28 #include "movetotrashcommand_p.h"
29 #include "removeduplicatescommand_p.h"
30 #include "specialmailcollections.h"
31 
32 #include "akonadi/agentfilterproxymodel.h"
33 #include "akonadi/agentinstance.h"
34 #include "akonadi/agentinstancecreatejob.h"
35 #include "akonadi/agentmanager.h"
36 #include "akonadi/agenttypedialog.h"
37 #include "akonadi/collectionstatistics.h"
38 #include "akonadi/entitytreemodel.h"
39 #include "akonadi/kmime/messagestatus.h"
40 #include "akonadi/mimetypechecker.h"
41 #include "akonadi/subscriptiondialog_p.h"
42 
43 #include <kaction.h>
44 #include <kactioncollection.h>
45 #include <klocale.h>
46 #include <kmessagebox.h>
47 #include <kmime/kmime_message.h>
48 
49 #include <QtCore/QPointer>
50 #include <QtGui/QItemSelectionModel>
51 
52 using namespace Akonadi;
53 
54 class StandardMailActionManager::Private
55 {
56  public:
57  Private( KActionCollection *actionCollection, QWidget *parentWidget, StandardMailActionManager *parent )
58  : mActionCollection( actionCollection ),
59  mParentWidget( parentWidget ),
60  mCollectionSelectionModel( 0 ),
61  mItemSelectionModel( 0 ),
62  mParent( parent )
63  {
64  mGenericManager = new StandardActionManager( actionCollection, parentWidget );
65 
66  mParent->connect( mGenericManager, SIGNAL(actionStateUpdated()),
67  mParent, SIGNAL(actionStateUpdated()) );
68 
69  mGenericManager->createAllActions();
70 
71  mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setText(
72  i18n( "Add Folder..." ) );
73  mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setWhatsThis(
74  i18n( "Add a new folder to the currently selected account." ) );
75 
76  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyCollections,
77  ki18np( "Copy Folder", "Copy %1 Folders" ) );
78  mGenericManager->action( Akonadi::StandardActionManager::CopyCollections )->setWhatsThis(
79  i18n( "Copy the selected folders to the clipboard." ) );
80 
81  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteCollections,
82  ki18np( "Delete Folder", "Delete %1 Folders" ) );
83  mGenericManager->action( Akonadi::StandardActionManager::DeleteCollections )->setWhatsThis(
84  i18n( "Delete the selected folders from the account." ) );
85 
86  mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollections,
87  ki18np( "Update Folder", "Update Folders" ) );
88 
89  mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollections )->setWhatsThis(
90  i18n( "Update the content of the selected folders." ) );
91 
92  mGenericManager->setActionText( Akonadi::StandardActionManager::CutCollections,
93  ki18np( "Cut Folder", "Cut %1 Folders" ) );
94  mGenericManager->action( Akonadi::StandardActionManager::CutCollections )->setWhatsThis(
95  i18n( "Cut the selected folders from the account." ) );
96 
97  mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties )->setText(
98  i18n( "Folder Properties..." ) );
99  mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties)->setWhatsThis(
100  i18n( "Open a dialog to edit the properties of the selected folder." ) );
101 
102  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
103  ki18np( "Copy Email", "Copy %1 Emails" ) );
104  mGenericManager->action( Akonadi::StandardActionManager::CopyItems )->setWhatsThis(
105  i18n( "Copy the selected emails to the clipboard." ) );
106 
107  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
108  ki18np( "Delete Email", "Delete %1 Emails" ) );
109  mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )->setWhatsThis(
110  i18n( "Delete the selected emails from the folder." ) );
111 
112  mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
113  ki18np( "Cut Email", "Cut %1 Emails" ) );
114  mGenericManager->action( Akonadi::StandardActionManager::CutItems )->setWhatsThis(
115  i18n( "Cut the selected emails from the folder." ) );
116 
117  mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setText(
118  i18n( "Add &Account..." ) );
119  mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setWhatsThis(
120  i18n( "Add a new account<p>"
121  "You will be presented with a dialog where you can select "
122  "the type of the account that shall be added.</p>" ) );
123 
124  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteResources,
125  ki18np( "&Delete Account", "&Delete %1 Accounts" ) );
126  mGenericManager->action( Akonadi::StandardActionManager::DeleteResources )->setWhatsThis(
127  i18n( "Delete the selected accounts<p>"
128  "The currently selected accounts will be deleted, "
129  "along with all the emails they contain.</p>" ) );
130 
131  mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setText(
132  i18n( "Account Properties..." ) );
133  mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setWhatsThis(
134  i18n( "Open a dialog to edit properties of the selected account." ) );
135 
136  mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeResources,
137  ki18np( "Update Account", "Update %1 Accounts" ) );
138  mGenericManager->action( Akonadi::StandardActionManager::SynchronizeResources )->setWhatsThis(
139  i18n( "Updates the content of all folders of the selected accounts." ) );
140 
141  mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollectionsRecursive,
142  ki18np( "Update folder and its subfolders", "Update folders and their subfolders" ) );
143 
144  mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollectionsRecursive )->setWhatsThis(
145  i18n( "Update the content of the selected folders and their subfolders." ) );
146 
147  mGenericManager->setContextText(
148  StandardActionManager::CreateCollection, StandardActionManager::DialogTitle,
149  i18nc( "@title:window", "New Folder" ) );
150 
151  mGenericManager->setContextText(
152  StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageText,
153  ki18n( "Could not create folder: %1" ) );
154 
155  mGenericManager->setContextText(
156  StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageTitle,
157  i18n( "Folder creation failed" ) );
158 
159  mGenericManager->setContextText(
160  StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxText,
161  ki18np( "Do you really want to delete this folder and all its sub-folders?",
162  "Do you really want to delete %1 folders and all their sub-folders?" ) );
163 
164  mGenericManager->setContextText(
165  StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxTitle,
166  ki18ncp( "@title:window", "Delete folder?", "Delete folders?" ) );
167 
168  mGenericManager->setContextText(
169  StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageText,
170  ki18n( "Could not delete folder: %1" ) );
171 
172  mGenericManager->setContextText(
173  StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageTitle,
174  i18n( "Folder deletion failed" ) );
175 
176  mGenericManager->setContextText(
177  StandardActionManager::CollectionProperties, StandardActionManager::DialogTitle,
178  ki18nc( "@title:window", "Properties of Folder %1" ) );
179 
180  mGenericManager->setContextText(
181  StandardActionManager::DeleteItems, StandardActionManager::MessageBoxText,
182  ki18np( "Do you really want to delete the selected email?",
183  "Do you really want to delete %1 emails?" ) );
184 
185  mGenericManager->setContextText(
186  StandardActionManager::DeleteItems, StandardActionManager::MessageBoxTitle,
187  ki18ncp( "@title:window", "Delete Email?", "Delete Emails?" ) );
188 
189  mGenericManager->setContextText(
190  StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText,
191  ki18n( "Could not delete email: %1" ) );
192 
193  mGenericManager->setContextText(
194  StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageTitle,
195  i18n( "Email deletion failed" ) );
196 
197  mGenericManager->setContextText(
198  StandardActionManager::CreateResource, StandardActionManager::DialogTitle,
199  i18nc( "@title:window", "Add Account" ) );
200 
201  mGenericManager->setContextText(
202  StandardActionManager::CreateResource, StandardActionManager::ErrorMessageText,
203  ki18n( "Could not create account: %1" ) );
204 
205  mGenericManager->setContextText(
206  StandardActionManager::CreateResource, StandardActionManager::ErrorMessageTitle,
207  i18n( "Account creation failed" ) );
208 
209  mGenericManager->setContextText(
210  StandardActionManager::DeleteResources, StandardActionManager::MessageBoxText,
211  ki18np( "Do you really want to delete this account?",
212  "Do you really want to delete %1 accounts?" ) );
213 
214  mGenericManager->setContextText(
215  StandardActionManager::DeleteResources, StandardActionManager::MessageBoxTitle,
216  ki18ncp( "@title:window", "Delete Account?", "Delete Accounts?" ) );
217 
218  mGenericManager->setContextText(
219  StandardActionManager::Paste, StandardActionManager::ErrorMessageText,
220  ki18n( "Could not paste email: %1" ) );
221 
222  mGenericManager->setContextText(
223  StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle,
224  i18n( "Paste failed" ) );
225 
226  mGenericManager->setMimeTypeFilter( QStringList() << KMime::Message::mimeType() );
227  mGenericManager->setCapabilityFilter( QStringList() << QLatin1String( "Resource" ) );
228  }
229 
230  ~Private()
231  {
232  delete mGenericManager;
233  }
234 
235  void updateActions()
236  {
237  const Akonadi::Item::List selectedItems = mGenericManager->selectedItems();
238  const Akonadi::Collection::List selectedCollections = mGenericManager->selectedCollections();
239 
240  bool itemIsSelected = !selectedItems.isEmpty();
241  bool collectionIsSelected = !selectedCollections.isEmpty();
242 
243  if ( itemIsSelected ) {
244  bool allMarkedAsImportant = true;
245  bool allMarkedAsRead = true;
246  bool allMarkedAsUnread = true;
247  bool allMarkedAsActionItem = true;
248 
249  foreach ( const Akonadi::Item &item, selectedItems ) {
250  Akonadi::MessageStatus status;
251  status.setStatusFromFlags( item.flags() );
252  if ( !status.isImportant() )
253  allMarkedAsImportant = false;
254  if ( !status.isRead() )
255  allMarkedAsRead= false;
256  else
257  allMarkedAsUnread = false;
258  if ( !status.isToAct() )
259  allMarkedAsActionItem = false;
260  }
261 
262  QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsRead );
263  if ( action ) {
264  updateMarkAction( action, allMarkedAsRead );
265  if ( allMarkedAsRead )
266  action->setEnabled(false);
267  else
268  action->setEnabled( true );
269  }
270 
271  action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsUnread );
272  if ( action ) {
273  updateMarkAction( action, allMarkedAsUnread );
274  if ( allMarkedAsUnread )
275  action->setEnabled(false);
276  else
277  action->setEnabled( true );
278  }
279 
280  action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
281  if ( action ) {
282  updateMarkAction( action, allMarkedAsImportant );
283  if ( allMarkedAsImportant )
284  action->setText( i18n( "Remove Important Mark" ) );
285  else
286  action->setText( i18n( "&Mark Mail as Important" ) );
287  action->setEnabled( true );
288  }
289 
290  action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
291  if ( action ) {
292  updateMarkAction( action, allMarkedAsActionItem );
293  if ( allMarkedAsActionItem )
294  action->setText( i18n( "Remove Action Item Mark" ) );
295  else
296  action->setText( i18n( "&Mark Mail as Action Item" ) );
297  action->setEnabled( true );
298  }
299  } else {
300  QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsRead );
301  if ( action )
302  action->setEnabled( false );
303 
304  action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsImportant );
305  if ( action )
306  action->setEnabled( false );
307 
308  action = mActions.value( Akonadi::StandardMailActionManager::MarkMailAsActionItem );
309  if ( action )
310  action->setEnabled( false );
311  }
312 
313  bool enableMarkAllAsRead = false;
314  bool enableMarkAllAsUnread = false;
315  bool canDeleteItem = true;
316  bool isSystemFolder = false;
317  if ( collectionIsSelected ) {
318  foreach( const Collection &collection, selectedCollections )
319  {
320  if ( collection.isValid() ) {
321  const Akonadi::CollectionStatistics stats = collection.statistics();
322  if ( !enableMarkAllAsRead )
323  enableMarkAllAsRead = (stats.unreadCount() > 0);
324  if ( !enableMarkAllAsUnread )
325  enableMarkAllAsUnread = (stats.count() != stats.unreadCount());
326  if ( canDeleteItem )
327  canDeleteItem = collection.rights() & Akonadi::Collection::CanDeleteItem;
328  if ( !isSystemFolder ) {
329  isSystemFolder = (collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Inbox ) ||
330  collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Outbox ) ||
331  collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::SentMail ) ||
332  collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Trash ) ||
333  collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Drafts ) ||
334  collection == SpecialMailCollections::self()->defaultCollection( SpecialMailCollections::Templates ));
335  }
336  //We will not change after that.
337  if ( enableMarkAllAsRead && enableMarkAllAsUnread && !canDeleteItem && isSystemFolder )
338  break;
339  }
340  }
341  }
342  if ( isSystemFolder ) {
343  if ( mGenericManager->action( StandardActionManager::DeleteCollections ) ) {
344  mGenericManager->action( StandardActionManager::DeleteCollections )->setEnabled( false );
345  }
346  }
347 
348  if ( mActions.contains( Akonadi::StandardMailActionManager::MoveToTrash ) )
349  mActions.value( Akonadi::StandardMailActionManager::MoveToTrash )->setEnabled( itemIsSelected && canDeleteItem );
350  if ( mActions.contains( Akonadi::StandardMailActionManager::RemoveDuplicates ) )
351  mActions.value( Akonadi::StandardMailActionManager::RemoveDuplicates )->setEnabled( canDeleteItem );
352 
353  QAction *action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsRead );
354  if ( action ) {
355  action->setEnabled( enableMarkAllAsRead );
356  }
357 
358  action = mActions.value( Akonadi::StandardMailActionManager::MarkAllMailAsUnread );
359  if ( action ) {
360  action->setEnabled( enableMarkAllAsUnread );
361  }
362 
363  emit mParent->actionStateUpdated();
364  }
365 
366  void updateMarkAction( QAction* action, bool allMarked )
367  {
368  QByteArray data = action->data().toByteArray();
369  if ( allMarked ) {
370  if ( !data.startsWith( '!' ) )
371  data.prepend( '!' );
372  } else {
373  if ( data.startsWith( '!' ) )
374  data = data.mid( 1 );
375  }
376  action->setData( data );
377  }
378 
379  void slotMarkAs()
380  {
381  const QAction *action = qobject_cast<QAction*>( mParent->sender() );
382  Q_ASSERT( action );
383 
384  const Akonadi::Item::List items = mGenericManager->selectedItems();
385  if ( items.isEmpty() )
386  return;
387 
388  QByteArray typeStr = action->data().toByteArray();
389  kDebug() << "Mark mail as: " << typeStr;
390 
391  bool invert = false;
392  if ( typeStr.startsWith( '!' ) ) {
393  invert = true;
394  typeStr = typeStr.mid( 1 );
395  }
396 
397  Akonadi::MessageStatus targetStatus;
398  targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
399 
400  StandardMailActionManager::Type type = MarkMailAsRead;
401  if ( typeStr == "U" ) {
402  type = MarkMailAsUnread;
403  targetStatus.setRead( true );
404  invert = true;
405  } else if ( typeStr == "K" )
406  type = MarkMailAsActionItem;
407  else if ( typeStr == "G" )
408  type = MarkMailAsImportant;
409 
410  if ( mInterceptedActions.contains( type ) )
411  return;
412 
413  MarkAsCommand *command = new MarkAsCommand( targetStatus, items, invert, mParent );
414  command->execute();
415  }
416 
417  void slotMarkAllAs()
418  {
419  const QAction *action = qobject_cast<QAction*>( mParent->sender() );
420  Q_ASSERT( action );
421 
422  QByteArray typeStr = action->data().toByteArray();
423  kDebug() << "Mark all as: " << typeStr;
424 
425  const Akonadi::Collection::List collections = mGenericManager->selectedCollections();
426  if ( collections.isEmpty() )
427  return;
428 
429  Akonadi::MessageStatus targetStatus;
430  targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
431 
432  bool invert = false;
433  if ( typeStr.startsWith( '!' ) ) {
434  invert = true;
435  typeStr = typeStr.mid( 1 );
436  }
437 
438  StandardMailActionManager::Type type = MarkAllMailAsRead;
439  if ( typeStr == "U" ) {
440  type = MarkAllMailAsUnread;
441  targetStatus.setRead( true );
442  invert = true;
443  } else if ( typeStr == "K" )
444  type = MarkAllMailAsActionItem;
445  else if ( typeStr == "G" )
446  type = MarkAllMailAsImportant;
447 
448  if ( mInterceptedActions.contains( type ) )
449  return;
450 
451  MarkAsCommand *command = new MarkAsCommand( targetStatus, collections, invert, mParent );
452  command->execute();
453  }
454 
455  void slotMoveToTrash()
456  {
457  if ( mInterceptedActions.contains( StandardMailActionManager::MoveToTrash ) )
458  return;
459 
460  if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
461  return;
462 
463  const Item::List items = mGenericManager->selectedItems();
464  if ( items.isEmpty() )
465  return;
466 
467  MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), items, mParent );
468  command->execute();
469  }
470 
471  void slotMoveAllToTrash()
472  {
473  if ( mInterceptedActions.contains( StandardMailActionManager::MoveAllToTrash ) )
474  return;
475 
476  if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
477  return;
478 
479  const Collection::List collections = mGenericManager->selectedCollections();
480  if ( collections.isEmpty() )
481  return;
482 
483  MoveToTrashCommand *command = new MoveToTrashCommand( mCollectionSelectionModel->model(), collections, mParent );
484  command->execute();
485  }
486 
487  void slotRemoveDuplicates()
488  {
489  if ( mInterceptedActions.contains( StandardMailActionManager::RemoveDuplicates ) )
490  return;
491 
492  const Collection::List collections = mGenericManager->selectedCollections();
493  if ( collections.isEmpty() )
494  return;
495 
496  RemoveDuplicatesCommand *command = new RemoveDuplicatesCommand( mCollectionSelectionModel->model(), collections, mParent );
497  command->execute();
498  }
499 
500  void slotEmptyAllTrash()
501  {
502  if ( mInterceptedActions.contains( StandardMailActionManager::EmptyAllTrash ) )
503  return;
504 
505  EmptyTrashCommand *command = new EmptyTrashCommand( const_cast<QAbstractItemModel*>( mCollectionSelectionModel->model() ), mParent );
506  command->execute();
507  }
508 
509  void slotEmptyTrash()
510  {
511  if ( mInterceptedActions.contains( StandardMailActionManager::EmptyTrash ) )
512  return;
513 
514  if ( mCollectionSelectionModel->selection().indexes().isEmpty() )
515  return;
516 
517  const Collection::List collections = mGenericManager->selectedCollections();
518  if ( collections.count() != 1 )
519  return;
520 
521  EmptyTrashCommand *command = new EmptyTrashCommand( collections.first(), mParent );
522  command->execute();
523  }
524 
525  KActionCollection *mActionCollection;
526  QWidget *mParentWidget;
527  StandardActionManager *mGenericManager;
528  QItemSelectionModel *mCollectionSelectionModel;
529  QItemSelectionModel *mItemSelectionModel;
530  QHash<StandardMailActionManager::Type, KAction*> mActions;
531  QSet<StandardMailActionManager::Type> mInterceptedActions;
532  StandardMailActionManager *mParent;
533 };
534 
535 
536 StandardMailActionManager::StandardMailActionManager( KActionCollection *actionCollection, QWidget *parent )
537  : QObject( parent ), d( new Private( actionCollection, parent, this ) )
538 {
539 }
540 
541 StandardMailActionManager::~StandardMailActionManager()
542 {
543  delete d;
544 }
545 
546 void StandardMailActionManager::setCollectionSelectionModel( QItemSelectionModel *selectionModel )
547 {
548  d->mCollectionSelectionModel = selectionModel;
549  d->mGenericManager->setCollectionSelectionModel( selectionModel );
550 
551  connect( selectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
552  SLOT(updateActions()) );
553  connect( selectionModel->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
554  SLOT(updateActions()) );
555  connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
556  SLOT(updateActions()) );
557 
558  d->updateActions();
559 }
560 
561 void StandardMailActionManager::setItemSelectionModel( QItemSelectionModel* selectionModel )
562 {
563  d->mItemSelectionModel = selectionModel;
564  d->mGenericManager->setItemSelectionModel( selectionModel );
565 
566  connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
567  SLOT(updateActions()) );
568 
569  //to catch item modifications, listen to the model's dataChanged signal as well
570  connect( selectionModel->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
571  SLOT(updateActions()) );
572 
573  d->updateActions();
574 }
575 
576 KAction* StandardMailActionManager::createAction( Type type )
577 {
578  if ( d->mActions.contains( type ) )
579  return d->mActions.value( type );
580 
581  KAction *action = 0;
582 
583  switch ( type ) {
584  case MarkMailAsRead:
585  action = new KAction( d->mParentWidget );
586  action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
587  action->setText( i18n( "&Mark Mail as Read" ) );
588  action->setIconText( i18n( "Mark as Read" ) );
589  action->setWhatsThis( i18n( "Mark selected messages as read" ) );
590  d->mActions.insert( MarkMailAsRead, action );
591  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_read" ), action );
592  action->setData( QByteArray( "R" ) );
593  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
594  break;
595  case MarkMailAsUnread:
596  action = new KAction( d->mParentWidget );
597  action->setText( i18n( "&Mark Mail as Unread" ) );
598  action->setIconText( i18n( "Mark as Unread" ) );
599  action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
600  d->mActions.insert( MarkMailAsUnread, action );
601  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_unread" ), action );
602  action->setShortcut( Qt::CTRL+Qt::Key_U );
603  action->setData( QByteArray( "U" ) );
604  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
605  break;
606  case MarkMailAsImportant:
607  action = new KAction( d->mParentWidget );
608  action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
609  action->setText( i18n( "&Mark Mail as Important" ) );
610  action->setIconText( i18n( "Mark as Important" ) );
611  d->mActions.insert( MarkMailAsImportant, action );
612  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_important" ), action );
613  action->setData( QByteArray( "G" ) );
614  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
615  break;
616  case MarkMailAsActionItem:
617  action = new KAction( d->mParentWidget );
618  action->setText( i18n( "&Mark Mail as Action Item" ) );
619  action->setIconText( i18n( "Mark as Action Item" ) );
620  action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
621  d->mActions.insert( MarkMailAsActionItem, action );
622  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_as_action_item" ), action );
623  action->setData( QByteArray( "K" ) );
624  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAs()) );
625  break;
626  case MarkAllMailAsRead:
627  action = new KAction( d->mParentWidget );
628  action->setIcon( KIcon( QLatin1String( "mail-mark-read" ) ) );
629  action->setText( i18n( "Mark &All Mails as Read" ) );
630  action->setIconText( i18n( "Mark All as Read" ) );
631  d->mActions.insert( MarkAllMailAsRead, action );
632  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_read" ), action );
633  action->setData( QByteArray( "R" ) );
634  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
635  break;
636  case MarkAllMailAsUnread:
637  action = new KAction( d->mParentWidget );
638  action->setText( i18n( "Mark &All Mails as Unread" ) );
639  action->setIconText( i18n( "Mark All as Unread" ) );
640  action->setIcon( KIcon( QLatin1String( "mail-mark-unread" ) ) );
641  d->mActions.insert( MarkAllMailAsUnread, action );
642  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_unread" ), action );
643  action->setData( QByteArray( "U" ) );
644  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
645  break;
646  case MarkAllMailAsImportant:
647  action = new KAction( d->mParentWidget );
648  action->setText( i18n( "Mark &All Mails as Important" ) );
649  action->setIconText( i18n( "Mark All as Important" ) );
650  action->setIcon( KIcon( QLatin1String( "mail-mark-important" ) ) );
651  d->mActions.insert( MarkAllMailAsImportant, action );
652  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_important" ), action );
653  action->setData( QByteArray( "G" ) );
654  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
655  break;
656  case MarkAllMailAsActionItem:
657  action = new KAction( d->mParentWidget );
658  action->setText( i18n( "Mark &All Mails as Action Item" ) );
659  action->setIconText( i18n( "Mark All as Action Item" ) );
660  action->setIcon( KIcon( QLatin1String( "mail-mark-task" ) ) );
661  d->mActions.insert( MarkAllMailAsActionItem, action );
662  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_mark_all_as_action_item" ), action );
663  action->setData( QByteArray("K") );
664  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMarkAllAs()) );
665  break;
666  case MoveToTrash:
667  action = new KAction( d->mParentWidget );
668  action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
669  action->setText( i18n( "Move to &Trash" ) );
670  action->setShortcut( QKeySequence( Qt::Key_Delete ) );
671  action->setWhatsThis( i18n( "Move message to trashcan" ) );
672  d->mActions.insert( MoveToTrash, action );
673  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_to_trash" ), action );
674  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMoveToTrash()) );
675  break;
676  case MoveAllToTrash:
677  action = new KAction( d->mParentWidget );
678  action->setIcon( KIcon( QLatin1String( "user-trash" ) ) );
679  action->setText( i18n( "Move All to &Trash" ) );
680  d->mActions.insert( MoveAllToTrash, action );
681  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_move_all_to_trash" ), action );
682  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotMoveAllToTrash()) );
683  break;
684  case RemoveDuplicates:
685  action = new KAction( d->mParentWidget );
686  action->setText( i18n( "Remove &Duplicate Mails" ) );
687  action->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_Asterisk ) );
688  d->mActions.insert( RemoveDuplicates, action );
689  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_remove_duplicates" ), action );
690  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotRemoveDuplicates()) );
691  break;
692  case EmptyAllTrash:
693  action = new KAction( d->mParentWidget );
694  action->setText( i18n( "Empty All &Trash Folders" ) );
695  d->mActions.insert( EmptyAllTrash, action );
696  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_all_trash" ), action );
697  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotEmptyAllTrash()) );
698  break;
699  case EmptyTrash:
700  action = new KAction( d->mParentWidget );
701  action->setText( i18n( "E&mpty Trash" ) );
702  d->mActions.insert( EmptyTrash, action );
703  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_empty_trash" ), action );
704  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotEmptyTrash()) );
705  break;
706  default:
707  Q_ASSERT( false ); // should never happen
708  break;
709  }
710 
711  return action;
712 }
713 
714 KAction* StandardMailActionManager::createAction( StandardActionManager::Type type )
715 {
716  return d->mGenericManager->createAction( type );
717 }
718 
719 void StandardMailActionManager::createAllActions()
720 {
721  createAction( MarkMailAsRead );
722  createAction( MarkMailAsUnread );
723  createAction( MarkMailAsImportant );
724  createAction( MarkMailAsActionItem );
725  createAction( MarkAllMailAsRead );
726  createAction( MarkAllMailAsUnread );
727  createAction( MarkAllMailAsImportant );
728  createAction( MarkAllMailAsActionItem );
729  createAction( MoveToTrash );
730  createAction( MoveAllToTrash );
731  createAction( RemoveDuplicates );
732  createAction( EmptyAllTrash );
733  createAction( EmptyTrash );
734 
735  d->mGenericManager->createAllActions();
736 
737  d->updateActions();
738 }
739 
740 KAction* StandardMailActionManager::action( Type type ) const
741 {
742  if ( d->mActions.contains( type ) )
743  return d->mActions.value( type );
744 
745  return 0;
746 }
747 
748 KAction* StandardMailActionManager::action( StandardActionManager::Type type ) const
749 {
750  return d->mGenericManager->action( type );
751 }
752 
753 void StandardMailActionManager::setActionText( StandardActionManager::Type type, const KLocalizedString &text )
754 {
755  d->mGenericManager->setActionText( type, text );
756 }
757 
758 void StandardMailActionManager::interceptAction( Type type, bool intercept )
759 {
760  if ( intercept )
761  d->mInterceptedActions.insert( type );
762  else
763  d->mInterceptedActions.remove( type );
764 }
765 
766 void StandardMailActionManager::interceptAction( StandardActionManager::Type type, bool intercept )
767 {
768  d->mGenericManager->interceptAction( type, intercept );
769 }
770 
771 Akonadi::Collection::List StandardMailActionManager::selectedCollections() const
772 {
773  return d->mGenericManager->selectedCollections();
774 }
775 
776 Akonadi::Item::List StandardMailActionManager::selectedItems() const
777 {
778  return d->mGenericManager->selectedItems();
779 }
780 
781 void StandardMailActionManager::setFavoriteCollectionsModel( FavoriteCollectionsModel *favoritesModel )
782 {
783  d->mGenericManager->setFavoriteCollectionsModel( favoritesModel );
784 }
785 
786 void StandardMailActionManager::setFavoriteSelectionModel( QItemSelectionModel *selectionModel )
787 {
788  d->mGenericManager->setFavoriteSelectionModel( selectionModel );
789 }
790 
791 void StandardMailActionManager::setCollectionPropertiesPageNames( const QStringList &names )
792 {
793  d->mGenericManager->setCollectionPropertiesPageNames( names );
794 }
795 
796 Akonadi::StandardActionManager* StandardMailActionManager::standardActionManager() const
797 {
798  return d->mGenericManager;
799 }
800 
801 
802 #include "standardmailactionmanager.moc"
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Sep 24 2012 09:06:28 by doxygen 1.8.1.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Modules
  • Related Pages

kdepimlibs-4.9.1 API Reference

Skip menu "kdepimlibs-4.9.1 API Reference"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal