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

akonadi

  • akonadi
  • calendar
standardcalendaractionmanager.cpp
1 /*
2  * Copyright (C) 2010 Casey Link <unnamedrambler@gmail.com>
3  * Copyright (C) 2010 Klaralvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
4  * Copyright (c) 2009 - 2010 Tobias Koenig <tokoe@kde.org>
5  *
6  * This library is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Library General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or (at your
9  * option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14  * License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB. If not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301, USA.
20  */
21 
22 #include "standardcalendaractionmanager.h"
23 
24 #include <akonadi/entitytreemodel.h>
25 
26 #include <kaction.h>
27 #include <kactioncollection.h>
28 #include <kcalcore/event.h>
29 #include <kcalcore/journal.h>
30 #include <kcalcore/todo.h>
31 #include <klocale.h>
32 
33 #include <QItemSelectionModel>
34 
35 using namespace Akonadi;
36 
37 class StandardCalendarActionManager::Private
38 {
39  public:
40  Private( KActionCollection *actionCollection, QWidget *parentWidget, StandardCalendarActionManager *parent )
41  : mActionCollection( actionCollection ),
42  mParentWidget( parentWidget ),
43  mCollectionSelectionModel( 0 ),
44  mItemSelectionModel( 0 ),
45  mParent( parent )
46  {
47  KGlobal::locale()->insertCatalog( QLatin1String( "libakonadi-calendar" ) );
48  mGenericManager = new StandardActionManager( actionCollection, parentWidget );
49  mParent->connect( mGenericManager, SIGNAL(actionStateUpdated()),
50  mParent, SIGNAL(actionStateUpdated()) );
51 
52  mGenericManager->setMimeTypeFilter( QStringList() << QLatin1String( "text/calendar" ) );
53  mGenericManager->setCapabilityFilter( QStringList() << QLatin1String( "Resource" ) );
54  }
55 
56  ~Private()
57  {
58  delete mGenericManager;
59  }
60 
61  void updateGenericAction(StandardActionManager::Type type)
62  {
63  switch(type) {
64  case Akonadi::StandardActionManager::CreateCollection:
65  mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setText(
66  i18n( "Add Calendar Folder..." ) );
67  mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setWhatsThis(
68  i18n( "Add a new calendar folder to the currently selected calendar folder." ) );
69  mGenericManager->setContextText(
70  StandardActionManager::CreateCollection, StandardActionManager::DialogTitle,
71  i18nc( "@title:window", "New Calendar Folder" ) );
72 
73  mGenericManager->setContextText(
74  StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageText,
75  ki18n( "Could not create calendar folder: %1" ) );
76 
77  mGenericManager->setContextText(
78  StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageTitle,
79  i18n( "Calendar folder creation failed" ) );
80 
81  break;
82  case Akonadi::StandardActionManager::CopyCollections:
83  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyCollections,
84  ki18np( "Copy Calendar Folder", "Copy %1 Calendar Folders" ) );
85  mGenericManager->action( Akonadi::StandardActionManager::CopyCollections )->setWhatsThis(
86  i18n( "Copy the selected calendar folders to the clipboard." ) );
87  break;
88  case Akonadi::StandardActionManager::DeleteCollections:
89  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteCollections,
90  ki18np( "Delete Calendar Folder", "Delete %1 Calendar Folders" ) );
91  mGenericManager->action( Akonadi::StandardActionManager::DeleteCollections )->setWhatsThis(
92  i18n( "Delete the selected calendar folders from the calendar." ) );
93  mGenericManager->setContextText(
94  StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxText,
95  ki18np( "Do you really want to delete this calendar folder and all its sub-folders?",
96  "Do you really want to delete %1 calendar folders and all their sub-folders?" ) );
97 
98  mGenericManager->setContextText(
99  StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxTitle,
100  ki18ncp( "@title:window", "Delete calendar folder?", "Delete calendar folders?" ) );
101 
102  mGenericManager->setContextText(
103  StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageText,
104  ki18n( "Could not delete calendar folder: %1" ) );
105 
106  mGenericManager->setContextText(
107  StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageTitle,
108  i18n( "Calendar folder deletion failed" ) );
109 
110  break;
111  case Akonadi::StandardActionManager::SynchronizeCollections:
112  mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollections,
113  ki18np( "Update Calendar Folder", "Update %1 Calendar Folders" ) );
114  mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollections )->setWhatsThis(
115  i18n( "Update the content of the selected calendar folders." ) );
116 
117  break;
118  case Akonadi::StandardActionManager::CutCollections:
119  mGenericManager->setActionText( Akonadi::StandardActionManager::CutCollections,
120  ki18np( "Cut Calendar Folder", "Cut %1 Calendar Folders" ) );
121  mGenericManager->action( Akonadi::StandardActionManager::CutCollections )->setWhatsThis(
122  i18n( "Cut the selected calendar folders from the calendar." ) );
123  break;
124  case Akonadi::StandardActionManager::CollectionProperties:
125  mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties )->setText(
126  i18n( "Folder Properties..." ) );
127  mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties )->setWhatsThis(
128  i18n( "Open a dialog to edit the properties of the selected calendar folder." ) );
129  mGenericManager->setContextText(
130  StandardActionManager::CollectionProperties, StandardActionManager::DialogTitle,
131  ki18nc( "@title:window", "Properties of Calendar Folder %1" ) );
132  break;
133  case Akonadi::StandardActionManager::CopyItems:
134  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
135  ki18np( "Copy Event", "Copy %1 Events" ) );
136  mGenericManager->action( Akonadi::StandardActionManager::CopyItems )->setWhatsThis(
137  i18n( "Copy the selected events to the clipboard." ) );
138 
139  break;
140  case Akonadi::StandardActionManager::DeleteItems:
141  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
142  ki18np( "Delete Event", "Delete %1 Events" ) );
143  mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )->setWhatsThis(
144  i18n( "Delete the selected events from the calendar." ) );
145  mGenericManager->setContextText(
146  StandardActionManager::DeleteItems, StandardActionManager::MessageBoxText,
147  ki18np( "Do you really want to delete the selected event?",
148  "Do you really want to delete %1 events?" ) );
149 
150  mGenericManager->setContextText(
151  StandardActionManager::DeleteItems, StandardActionManager::MessageBoxTitle,
152  ki18ncp( "@title:window", "Delete Event?", "Delete Events?" ) );
153 
154  mGenericManager->setContextText(
155  StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText,
156  ki18n( "Could not delete event: %1" ) );
157 
158  mGenericManager->setContextText(
159  StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageTitle,
160  i18n( "Event deletion failed" ) );
161  break;
162 
163  case Akonadi::StandardActionManager::CutItems:
164  mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
165  ki18np( "Cut Event", "Cut %1 Events" ) );
166  mGenericManager->action( Akonadi::StandardActionManager::CutItems )->setWhatsThis(
167  i18n( "Cut the selected events from the calendar." ) );
168  break;
169  case Akonadi::StandardActionManager::CreateResource:
170  mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setText(
171  i18n( "Add &Calendar..." ) );
172  mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setWhatsThis(
173  i18n( "Add a new calendar<p>"
174  "You will be presented with a dialog where you can select "
175  "the type of the calendar that shall be added.</p>" ) );
176  mGenericManager->setContextText(
177  StandardActionManager::CreateResource, StandardActionManager::DialogTitle,
178  i18nc( "@title:window", "Add Calendar" ) );
179 
180  mGenericManager->setContextText(
181  StandardActionManager::CreateResource, StandardActionManager::ErrorMessageText,
182  ki18n( "Could not create calendar: %1" ) );
183 
184  mGenericManager->setContextText(
185  StandardActionManager::CreateResource, StandardActionManager::ErrorMessageTitle,
186  i18n( "Calendar creation failed" ) );
187 
188  break;
189  case Akonadi::StandardActionManager::DeleteResources:
190 
191  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteResources,
192  ki18np( "&Delete Calendar", "&Delete %1 Calendars" ) );
193  mGenericManager->action( Akonadi::StandardActionManager::DeleteResources )->setWhatsThis(
194  i18n( "Delete the selected calendars<p>"
195  "The currently selected calendars will be deleted, "
196  "along with all the events, todos and journals they contain.</p>" ) );
197  mGenericManager->setContextText(
198  StandardActionManager::DeleteResources, StandardActionManager::MessageBoxText,
199  ki18np( "Do you really want to delete this calendar?",
200  "Do you really want to delete %1 calendars?" ) );
201 
202  mGenericManager->setContextText(
203  StandardActionManager::DeleteResources, StandardActionManager::MessageBoxTitle,
204  ki18ncp( "@title:window", "Delete Calendar?", "Delete Calendars?" ) );
205 
206  break;
207  case Akonadi::StandardActionManager::ResourceProperties:
208  mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setText(
209  i18n( "Calendar Properties..." ) );
210  mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setWhatsThis(
211  i18n( "Open a dialog to edit properties of the selected calendar." ) );
212  break;
213  case Akonadi::StandardActionManager::SynchronizeResources:
214 
215  mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeResources,
216  ki18np( "Update Calendar", "Update %1 Calendars" ) );
217  mGenericManager->action( Akonadi::StandardActionManager::SynchronizeResources )->setWhatsThis(
218  i18n( "Updates the content of all folders of the selected calendars." ) );
219  break;
220  case Akonadi::StandardActionManager::CopyItemToMenu:
221  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText(
222  i18n( "&Copy to Calendar" ) );
223  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setWhatsThis(
224  i18n( "Copy the selected event to a different calendar." ) );
225  break;
226  case Akonadi::StandardActionManager::MoveItemToMenu:
227  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText(
228  i18n( "&Move to Calendar" ) );
229  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setWhatsThis(
230  i18n( "Move the selected event to a different calendar." ) );
231  break;
232  case StandardActionManager::Paste:
233  mGenericManager->setContextText(
234  StandardActionManager::Paste, StandardActionManager::ErrorMessageText,
235  ki18n( "Could not paste event: %1" ) );
236 
237  mGenericManager->setContextText(
238  StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle,
239  i18n( "Paste failed" ) );
240  break;
241  default:
242  break;
243  }
244  }
245  void updateGenericAllActions()
246  {
247  updateGenericAction(StandardActionManager::CreateCollection);
248  updateGenericAction(StandardActionManager::CopyCollections);
249  updateGenericAction(StandardActionManager::DeleteCollections);
250  updateGenericAction(StandardActionManager::SynchronizeCollections);
251  updateGenericAction(StandardActionManager::CollectionProperties);
252  updateGenericAction(StandardActionManager::CopyItems);
253  updateGenericAction(StandardActionManager::Paste);
254  updateGenericAction(StandardActionManager::DeleteItems);
255  updateGenericAction(StandardActionManager::ManageLocalSubscriptions);
256  updateGenericAction(StandardActionManager::AddToFavoriteCollections);
257  updateGenericAction(StandardActionManager::RemoveFromFavoriteCollections);
258  updateGenericAction(StandardActionManager::RenameFavoriteCollection);
259  updateGenericAction(StandardActionManager::CopyCollectionToMenu);
260  updateGenericAction(StandardActionManager::CopyItemToMenu);
261  updateGenericAction(StandardActionManager::MoveItemToMenu);
262  updateGenericAction(StandardActionManager::MoveCollectionToMenu);
263  updateGenericAction(StandardActionManager::CutItems);
264  updateGenericAction(StandardActionManager::CutCollections);
265  updateGenericAction(StandardActionManager::CreateResource);
266  updateGenericAction(StandardActionManager::DeleteResources);
267  updateGenericAction(StandardActionManager::ResourceProperties);
268  updateGenericAction(StandardActionManager::SynchronizeResources);
269  updateGenericAction(StandardActionManager::ToggleWorkOffline);
270  updateGenericAction(StandardActionManager::CopyCollectionToDialog);
271  updateGenericAction(StandardActionManager::MoveCollectionToDialog);
272  updateGenericAction(StandardActionManager::CopyItemToDialog);
273  updateGenericAction(StandardActionManager::MoveItemToDialog);
274  updateGenericAction(StandardActionManager::SynchronizeCollectionsRecursive);
275  updateGenericAction(StandardActionManager::MoveCollectionsToTrash);
276  updateGenericAction(StandardActionManager::MoveItemsToTrash);
277  updateGenericAction(StandardActionManager::RestoreCollectionsFromTrash);
278  updateGenericAction(StandardActionManager::RestoreItemsFromTrash);
279  updateGenericAction(StandardActionManager::MoveToTrashRestoreCollection);
280  updateGenericAction(StandardActionManager::MoveToTrashRestoreCollectionAlternative);
281  updateGenericAction(StandardActionManager::MoveToTrashRestoreItem);
282  updateGenericAction(StandardActionManager::MoveToTrashRestoreItemAlternative);
283  updateGenericAction(StandardActionManager::SynchronizeFavoriteCollections);
284 
285  }
286 
287 
288  static bool hasWritableCollection( const QModelIndex &index, const QString &mimeType )
289  {
290  const Akonadi::Collection collection =
291  index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
292  if ( collection.isValid() ) {
293  if ( collection.contentMimeTypes().contains( mimeType ) &&
294  ( collection.rights() & Akonadi::Collection::CanCreateItem ) ) {
295  return true;
296  }
297  }
298 
299  const QAbstractItemModel *model = index.model();
300  if ( !model ) {
301  return false;
302  }
303 
304  for ( int row = 0; row < model->rowCount( index ); ++row ) {
305  if ( hasWritableCollection( model->index( row, 0, index ), mimeType ) ) {
306  return true;
307  }
308  }
309 
310  return false;
311  }
312 
313  bool hasWritableCollection( const QString &mimeType ) const
314  {
315  if ( !mCollectionSelectionModel ) {
316  return false;
317  }
318 
319  const QAbstractItemModel *collectionModel = mCollectionSelectionModel->model();
320  for ( int row = 0; row < collectionModel->rowCount(); ++row ) {
321  if ( hasWritableCollection( collectionModel->index( row, 0, QModelIndex() ), mimeType ) ) {
322  return true;
323  }
324  }
325 
326  return false;
327  }
328 
329  void updateActions()
330  {
331  if ( !mItemSelectionModel ) {
332  return;
333  }
334 
335  // update action labels
336  const int itemCount = mItemSelectionModel->selectedRows().count();
337  if ( itemCount == 1 ) {
338  const QModelIndex index = mItemSelectionModel->selectedRows().first();
339  if ( index.isValid() ) {
340  const QString mimeType = index.data( EntityTreeModel::MimeTypeRole ).toString();
341  if ( mimeType == KCalCore::Event::eventMimeType() ) {
342  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItems )) {
343  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
344  ki18np( "Copy Event", "Copy %1 Events" ) );
345  }
346  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )) {
347  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n( "Copy Event To" ) );
348  }
349  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )) {
350  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n( "Copy Event To" ) );
351  }
352  if(mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )) {
353  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
354  ki18np( "Delete Event", "Delete %1 Events" ) );
355  }
356  if(mGenericManager->action( Akonadi::StandardActionManager::CutItems )) {
357  mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
358  ki18np( "Cut Event", "Cut %1 Events" ) );
359  }
360  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )) {
361  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n( "Move Event To" ) );
362  }
363  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )) {
364  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n( "Move Event To" ) );
365  }
366  if ( mActions.contains( StandardCalendarActionManager::EditIncidence ) ) {
367  mActions.value( StandardCalendarActionManager::EditIncidence )->setText( i18n( "Edit Event..." ) );
368  }
369  } else if ( mimeType == KCalCore::Todo::todoMimeType() ) {
370  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItems )) {
371  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
372  ki18np( "Copy To-do", "Copy %1 To-dos" ) );
373  }
374  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )) {
375  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n( "Copy To-do To" ) );
376  }
377  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )) {
378  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n( "Copy To-do To" ) );
379  }
380  if(mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )) {
381  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
382  ki18np( "Delete To-do", "Delete %1 To-dos" ) );
383  }
384  if(mGenericManager->action( Akonadi::StandardActionManager::CutItems )) {
385  mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
386  ki18np( "Cut To-do", "Cut %1 To-dos" ) );
387  }
388  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )) {
389  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n( "Move To-do To" ) );
390  }
391  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )) {
392  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n( "Move To-do To" ) );
393  }
394  if ( mActions.contains( StandardCalendarActionManager::EditIncidence ) ) {
395  mActions.value( StandardCalendarActionManager::EditIncidence )->setText( i18n( "Edit To-do..." ) );
396  }
397  } else if ( mimeType == KCalCore::Journal::journalMimeType() ) {
398  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItems )) {
399  mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
400  ki18np( "Copy Journal", "Copy %1 Journals" ) );
401  }
402  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )) {
403  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n( "Copy Journal To" ) );
404  }
405  if(mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )) {
406  mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n( "Copy Journal To" ) );
407  }
408  if(mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )) {
409  mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
410  ki18np( "Delete Journal", "Delete %1 Journals" ) );
411  }
412  if(mGenericManager->action( Akonadi::StandardActionManager::CutItems )) {
413  mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
414  ki18np( "Cut Journal", "Cut %1 Journals" ) );
415  }
416  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )) {
417  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n( "Move Journal To" ) );
418  }
419  if(mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )) {
420  mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n( "Move Journal To" ) );
421  }
422  if ( mActions.contains( StandardCalendarActionManager::EditIncidence ) ) {
423  mActions.value( StandardCalendarActionManager::EditIncidence )->setText( i18n( "Edit Journal..." ) );
424  }
425  }
426  }
427  }
428 
429  // update action states
430  if ( mActions.contains( StandardCalendarActionManager::CreateEvent ) ) {
431  mActions[ StandardCalendarActionManager::CreateEvent ]->setEnabled( hasWritableCollection( KCalCore::Event::eventMimeType() ) );
432  }
433  if ( mActions.contains( StandardCalendarActionManager::CreateTodo ) ) {
434  mActions[ StandardCalendarActionManager::CreateTodo ]->setEnabled( hasWritableCollection( KCalCore::Todo::todoMimeType() ) );
435  }
436  if ( mActions.contains( StandardCalendarActionManager::CreateJournal ) ) {
437  mActions[ StandardCalendarActionManager::CreateJournal ]->setEnabled( hasWritableCollection( KCalCore::Journal::journalMimeType() ) );
438  }
439 
440  if ( mActions.contains( StandardCalendarActionManager::EditIncidence ) ) {
441  bool canEditItem = true;
442 
443  // only one selected item can be edited
444  canEditItem = canEditItem && ( itemCount == 1 );
445 
446  // check whether parent collection allows changing the item
447  const QModelIndexList rows = mItemSelectionModel->selectedRows();
448  if ( rows.count() == 1 ) {
449  const QModelIndex index = rows.first();
450  const Collection parentCollection = index.data( EntityTreeModel::ParentCollectionRole ).value<Collection>();
451  if ( parentCollection.isValid() ) {
452  canEditItem = canEditItem && ( parentCollection.rights() & Collection::CanChangeItem );
453  }
454  }
455 
456  mActions.value( StandardCalendarActionManager::EditIncidence )->setEnabled( canEditItem );
457  }
458 
459  if ( mActions.contains( StandardCalendarActionManager::CreateSubTodo ) ) {
460  mActions[ StandardCalendarActionManager::CreateSubTodo ]->setEnabled( false );
461  }
462 
463  if ( itemCount == 1 ) {
464  const Akonadi::Item item = mGenericManager->selectedItems().first();
465 
466  if ( item.isValid() && item.hasPayload<KCalCore::Todo::Ptr>() ) {
467  if ( mActions.contains( StandardCalendarActionManager::CreateSubTodo ) ) {
468  mActions[ StandardCalendarActionManager::CreateSubTodo ]->setEnabled( hasWritableCollection( KCalCore::Todo::todoMimeType() ) );
469  }
470  }
471  }
472 
473  emit mParent->actionStateUpdated();
474  }
475 
476  void slotCreateEvent()
477  {
478  // dummy as long as there are no editors available in kdepimlibs/
479  }
480 
481  void slotCreateTodo()
482  {
483  // dummy as long as there are no editors available in kdepimlibs/
484  }
485 
486  void slotCreateSubTodo()
487  {
488  // dummy as long as there are no editors available in kdepimlibs/
489  }
490 
491  void slotCreateJournal()
492  {
493  // dummy as long as there are no editors available in kdepimlibs/
494  }
495 
496  void slotEditIncidence()
497  {
498  // dummy as long as there are no editors available in kdepimlibs/
499  }
500 
501  KActionCollection *mActionCollection;
502  QWidget *mParentWidget;
503  StandardActionManager *mGenericManager;
504  QItemSelectionModel *mCollectionSelectionModel;
505  QItemSelectionModel *mItemSelectionModel;
506  QHash<StandardCalendarActionManager::Type, KAction*> mActions;
507  QSet<StandardCalendarActionManager::Type> mInterceptedActions;
508  StandardCalendarActionManager *mParent;
509 };
510 
511 
512 Akonadi::StandardCalendarActionManager::StandardCalendarActionManager( KActionCollection *actionCollection, QWidget *parent )
513  : QObject( parent ),
514  d( new Private( actionCollection, parent, this ) )
515 {
516 }
517 
518 StandardCalendarActionManager::~StandardCalendarActionManager()
519 {
520  delete d;
521 }
522 
523 void StandardCalendarActionManager::setCollectionSelectionModel( QItemSelectionModel *selectionModel )
524 {
525  d->mCollectionSelectionModel = selectionModel;
526  d->mGenericManager->setCollectionSelectionModel( selectionModel );
527 
528  connect( selectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
529  SLOT(updateActions()) );
530  connect( selectionModel->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
531  SLOT(updateActions()) );
532  connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
533  SLOT(updateActions()) );
534  d->updateActions();
535 }
536 
537 void StandardCalendarActionManager::setItemSelectionModel( QItemSelectionModel *selectionModel )
538 {
539  d->mItemSelectionModel = selectionModel;
540  d->mGenericManager->setItemSelectionModel( selectionModel );
541 
542  connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
543  SLOT(updateActions()) );
544 
545  d->updateActions();
546 }
547 
548 KAction* StandardCalendarActionManager::createAction( StandardCalendarActionManager::Type type )
549 {
550  if ( d->mActions.contains( type ) ) {
551  return d->mActions.value( type );
552  }
553 
554  KAction *action = 0;
555  switch ( type ) {
556  case CreateEvent:
557  action = new KAction( d->mParentWidget );
558  action->setIcon( KIcon( QLatin1String( "appointment-new" ) ) );
559  action->setText( i18n( "New E&vent..." ) );
560  action->setWhatsThis( i18n( "Create a new event" ) );
561  d->mActions.insert( CreateEvent, action );
562  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_event_create" ), action );
563  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotCreateEvent()) );
564  break;
565  case CreateTodo:
566  action = new KAction( d->mParentWidget );
567  action->setIcon( KIcon( QLatin1String( "task-new" ) ) );
568  action->setText( i18n( "New &To-do..." ) );
569  action->setWhatsThis( i18n( "Create a new To-do" ) );
570  d->mActions.insert( CreateTodo, action );
571  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_todo_create" ), action );
572  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotCreateTodo()) );
573  break;
574  case CreateSubTodo:
575  action = new KAction( d->mParentWidget );
576  action->setIcon( KIcon( QLatin1String( "new_subtodo" ) ) );
577  action->setText( i18n( "New Su&b-to-do..." ) );
578  action->setWhatsThis( i18n( "Create a new Sub-to-do" ) );
579  d->mActions.insert( CreateSubTodo, action );
580  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_subtodo_create" ), action );
581  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotCreateSubTodo()) );
582  break;
583  case CreateJournal:
584  action = new KAction( d->mParentWidget );
585  action->setIcon( KIcon( QLatin1String( "journal-new" ) ) );
586  action->setText( i18n( "New &Journal..." ) );
587  action->setWhatsThis( i18n( "Create a new Journal" ) );
588  d->mActions.insert( CreateJournal, action );
589  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_journal_create" ), action );
590  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotCreateJournal()) );
591  break;
592  case EditIncidence:
593  action = new KAction( d->mParentWidget );
594  action->setText( i18n( "&Edit..." ) );
595  action->setWhatsThis( i18n( "Edit the selected incidence." ) );
596  d->mActions.insert( EditIncidence, action );
597  d->mActionCollection->addAction( QString::fromLatin1( "akonadi_incidence_edit" ), action );
598  connect( action, SIGNAL(triggered(bool)), this, SLOT(slotEditIncidence()) );
599  break;
600  default:
601  Q_ASSERT( false ); // should never happen
602  break;
603  }
604 
605  return action;
606 }
607 
608 KAction* StandardCalendarActionManager::createAction( StandardActionManager::Type type )
609 {
610  KAction *act = d->mGenericManager->action(type);
611  if(!act )
612  act = d->mGenericManager->createAction( type );
613  d->updateGenericAction(type);
614  return act;
615 }
616 
617 void StandardCalendarActionManager::createAllActions()
618 {
619  createAction( CreateEvent );
620  createAction( CreateTodo );
621  createAction( CreateSubTodo );
622  createAction( CreateJournal );
623  createAction( EditIncidence );
624 
625  d->mGenericManager->createAllActions();
626  d->updateGenericAllActions();
627  d->updateActions();
628 }
629 
630 KAction* StandardCalendarActionManager::action( StandardCalendarActionManager::Type type ) const
631 {
632  if ( d->mActions.contains( type ) ) {
633  return d->mActions.value( type );
634  }
635 
636  return 0;
637 }
638 
639 KAction* StandardCalendarActionManager::action( StandardActionManager::Type type ) const
640 {
641  return d->mGenericManager->action( type );
642 }
643 
644 void StandardCalendarActionManager::setActionText( StandardActionManager::Type type, const KLocalizedString &text )
645 {
646  d->mGenericManager->setActionText( type, text );
647 }
648 
649 void StandardCalendarActionManager::interceptAction( StandardCalendarActionManager::Type type, bool intercept )
650 {
651  if ( intercept ) {
652  d->mInterceptedActions.insert( type );
653  } else {
654  d->mInterceptedActions.remove( type );
655  }
656 }
657 
658 void StandardCalendarActionManager::interceptAction( StandardActionManager::Type type, bool intercept )
659 {
660  d->mGenericManager->interceptAction( type, intercept );
661 }
662 
663 Akonadi::Collection::List StandardCalendarActionManager::selectedCollections() const
664 {
665  return d->mGenericManager->selectedCollections();
666 }
667 
668 Akonadi::Item::List StandardCalendarActionManager::selectedItems() const
669 {
670  return d->mGenericManager->selectedItems();
671 }
672 
673 void StandardCalendarActionManager::setContextText( StandardActionManager::Type type, StandardActionManager::TextContext context, const QString &text )
674 {
675  d->mGenericManager->setContextText( type, context, text );
676 }
677 
678 void StandardCalendarActionManager::setContextText( StandardActionManager::Type type, StandardActionManager::TextContext context, const KLocalizedString &text )
679 {
680  d->mGenericManager->setContextText( type, context, text );
681 }
682 
683 void StandardCalendarActionManager::setCollectionPropertiesPageNames( const QStringList &names )
684 {
685  d->mGenericManager->setCollectionPropertiesPageNames( names );
686 }
687 
688 #include "standardcalendaractionmanager.moc"
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Nov 26 2012 16:48:21 by doxygen 1.8.1.2 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.3 API Reference

Skip menu "kdepimlibs-4.9.3 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