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

Skip menu "kdepimlibs-4.10.5 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • 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