22 #include "standardcalendaractionmanager.h"
24 #include <akonadi/entitytreemodel.h>
27 #include <kactioncollection.h>
28 #include <kcalcore/event.h>
29 #include <kcalcore/journal.h>
30 #include <kcalcore/todo.h>
33 #include <QtGui/QItemSelectionModel>
35 using namespace Akonadi;
37 class StandardCalendarActionManager::Private
41 : mActionCollection( actionCollection ),
42 mParentWidget( parentWidget ),
43 mCollectionSelectionModel( 0 ),
44 mItemSelectionModel( 0 ),
47 KGlobal::locale()->insertCatalog(QLatin1String(
"libakonadi-calendar"));
48 mGenericManager =
new StandardActionManager( actionCollection, parentWidget );
51 mGenericManager->createAllActions();
53 mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setText(
54 i18n(
"Add Calendar Folder..." ) );
55 mGenericManager->action( Akonadi::StandardActionManager::CreateCollection )->setWhatsThis(
56 i18n(
"Add a new calendar folder to the currently selected calendar folder." ) );
58 mGenericManager->setActionText( Akonadi::StandardActionManager::CopyCollections,
59 ki18np(
"Copy Calendar Folder",
"Copy %1 Calendar Folders" ) );
60 mGenericManager->action( Akonadi::StandardActionManager::CopyCollections )->setWhatsThis(
61 i18n(
"Copy the selected calendar folders to the clipboard." ) );
63 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteCollections,
64 ki18np(
"Delete Calendar Folder",
"Delete %1 Calendar Folders" ) );
65 mGenericManager->action( Akonadi::StandardActionManager::DeleteCollections )->setWhatsThis(
66 i18n(
"Delete the selected calendar folders from the calendar." ) );
68 mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeCollections,
69 ki18np(
"Update Calendar Folder",
"Update %1 Calendar Folders" ) );
70 mGenericManager->action( Akonadi::StandardActionManager::SynchronizeCollections )->setWhatsThis(
71 i18n(
"Update the content of the selected calendar folders." ) );
73 mGenericManager->setActionText( Akonadi::StandardActionManager::CutCollections,
74 ki18np(
"Cut Calendar Folder",
"Cut %1 Calendar Folders" ) );
75 mGenericManager->action( Akonadi::StandardActionManager::CutCollections )->setWhatsThis(
76 i18n(
"Cut the selected calendar folders from the calendar." ) );
78 mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties )->setText(
79 i18n(
"Folder Properties..." ) );
80 mGenericManager->action( Akonadi::StandardActionManager::CollectionProperties)->setWhatsThis(
81 i18n(
"Open a dialog to edit the properties of the selected calendar folder." ) );
83 mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
84 ki18np(
"Copy Event",
"Copy %1 Events" ) );
85 mGenericManager->action( Akonadi::StandardActionManager::CopyItems )->setWhatsThis(
86 i18n(
"Copy the selected events to the clipboard." ) );
88 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
89 ki18np(
"Delete Event",
"Delete %1 Events" ) );
90 mGenericManager->action( Akonadi::StandardActionManager::DeleteItems )->setWhatsThis(
91 i18n(
"Delete the selected events from the calendar." ) );
93 mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
94 ki18np(
"Cut Event",
"Cut %1 Events" ) );
95 mGenericManager->action( Akonadi::StandardActionManager::CutItems )->setWhatsThis(
96 i18n(
"Cut the selected events from the calendar." ) );
98 mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setText(
99 i18n(
"Add &Calendar..." ) );
100 mGenericManager->action( Akonadi::StandardActionManager::CreateResource )->setWhatsThis(
101 i18n(
"Add a new calendar<p>"
102 "You will be presented with a dialog where you can select "
103 "the type of the calendar that shall be added.</p>" ) );
105 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteResources,
106 ki18np(
"&Delete Calendar",
"&Delete %1 Calendars" ) );
107 mGenericManager->action( Akonadi::StandardActionManager::DeleteResources )->setWhatsThis(
108 i18n(
"Delete the selected calendars<p>"
109 "The currently selected calendars will be deleted, "
110 "along with all the events, todos and journals they contain.</p>" ) );
112 mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setText(
113 i18n(
"Calendar Properties..." ) );
114 mGenericManager->action( Akonadi::StandardActionManager::ResourceProperties )->setWhatsThis(
115 i18n(
"Open a dialog to edit properties of the selected calendar." ) );
117 mGenericManager->setActionText( Akonadi::StandardActionManager::SynchronizeResources,
118 ki18np(
"Update Calendar",
"Update %1 Calendars" ) );
119 mGenericManager->action( Akonadi::StandardActionManager::SynchronizeResources )->setWhatsThis(
120 i18n(
"Updates the content of all folders of the selected calendars." ) );
122 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText(
123 i18n(
"&Copy to Calendar" ) );
124 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setWhatsThis(
125 i18n(
"Copy the selected event to a different calendar." ) );
127 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText(
128 i18n(
"&Move to Calendar" ) );
129 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setWhatsThis(
130 i18n(
"Move the selected event to a different calendar." ) );
133 mGenericManager->setContextText(
134 StandardActionManager::CreateCollection, StandardActionManager::DialogTitle,
135 i18nc(
"@title:window",
"New Calendar Folder" ) );
137 mGenericManager->setContextText(
138 StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageText,
139 ki18n(
"Could not create calendar folder: %1" ) );
141 mGenericManager->setContextText(
142 StandardActionManager::CreateCollection, StandardActionManager::ErrorMessageTitle,
143 i18n(
"Calendar folder creation failed" ) );
145 mGenericManager->setContextText(
146 StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxText,
147 ki18np(
"Do you really want to delete this calendar folder and all its sub-folders?",
148 "Do you really want to delete %1 calendar folders and all their sub-folders?" ) );
150 mGenericManager->setContextText(
151 StandardActionManager::DeleteCollections, StandardActionManager::MessageBoxTitle,
152 ki18ncp(
"@title:window",
"Delete calendar folder?",
"Delete calendar folders?" ) );
154 mGenericManager->setContextText(
155 StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageText,
156 ki18n(
"Could not delete calendar folder: %1" ) );
158 mGenericManager->setContextText(
159 StandardActionManager::DeleteCollections, StandardActionManager::ErrorMessageTitle,
160 i18n(
"Calendar folder deletion failed" ) );
162 mGenericManager->setContextText(
163 StandardActionManager::CollectionProperties, StandardActionManager::DialogTitle,
164 ki18nc(
"@title:window",
"Properties of Calendar Folder %1" ) );
166 mGenericManager->setContextText(
167 StandardActionManager::DeleteItems, StandardActionManager::MessageBoxText,
168 ki18np(
"Do you really want to delete the selected event?",
169 "Do you really want to delete %1 events?" ) );
171 mGenericManager->setContextText(
172 StandardActionManager::DeleteItems, StandardActionManager::MessageBoxTitle,
173 ki18ncp(
"@title:window",
"Delete Event?",
"Delete Events?" ) );
175 mGenericManager->setContextText(
176 StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText,
177 ki18n(
"Could not delete event: %1" ) );
179 mGenericManager->setContextText(
180 StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageTitle,
181 i18n(
"Event deletion failed" ) );
183 mGenericManager->setContextText(
184 StandardActionManager::CreateResource, StandardActionManager::DialogTitle,
185 i18nc(
"@title:window",
"Add Calendar" ) );
187 mGenericManager->setContextText(
188 StandardActionManager::CreateResource, StandardActionManager::ErrorMessageText,
189 ki18n(
"Could not create calendar: %1" ) );
191 mGenericManager->setContextText(
192 StandardActionManager::CreateResource, StandardActionManager::ErrorMessageTitle,
193 i18n(
"Calendar creation failed" ) );
195 mGenericManager->setContextText(
196 StandardActionManager::DeleteResources, StandardActionManager::MessageBoxText,
197 ki18np(
"Do you really want to delete this calendar?",
198 "Do you really want to delete %1 calendars?" ) );
200 mGenericManager->setContextText(
201 StandardActionManager::DeleteResources, StandardActionManager::MessageBoxTitle,
202 ki18ncp(
"@title:window",
"Delete Calendar?",
"Delete Calendars?" ) );
204 mGenericManager->setContextText(
205 StandardActionManager::Paste, StandardActionManager::ErrorMessageText,
206 ki18n(
"Could not paste event: %1" ) );
208 mGenericManager->setContextText(
209 StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle,
210 i18n(
"Paste failed" ) );
212 mGenericManager->setMimeTypeFilter( QStringList() << QLatin1String(
"text/calendar" ) );
213 mGenericManager->setCapabilityFilter( QStringList() << QLatin1String(
"Resource" ) );
218 delete mGenericManager;
221 static bool hasWritableCollection(
const QModelIndex &index,
const QString &mimeType )
223 const Akonadi::Collection collection =
224 index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
225 if ( collection.isValid() ) {
226 if ( collection.contentMimeTypes().contains( mimeType ) &&
232 const QAbstractItemModel *model = index.model();
236 for (
int row = 0; row < model->rowCount( index ); ++row ) {
237 if ( hasWritableCollection( model->index( row, 0, index ), mimeType ) )
244 bool hasWritableCollection(
const QString &mimeType )
const
246 if ( !mCollectionSelectionModel )
249 const QAbstractItemModel *collectionModel = mCollectionSelectionModel->model();
250 for (
int row = 0; row < collectionModel->rowCount(); ++row ) {
251 if ( hasWritableCollection( collectionModel->index( row, 0, QModelIndex() ), mimeType ) )
260 if ( !mItemSelectionModel )
264 const int itemCount = mItemSelectionModel->selectedRows().count();
265 if ( itemCount == 1 ) {
266 const QModelIndex index = mItemSelectionModel->selectedRows().first();
267 if ( index.isValid() ) {
268 const QString mimeType = index.data( EntityTreeModel::MimeTypeRole ).toString();
269 if ( mimeType == KCalCore::Event::eventMimeType() ) {
270 mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
271 ki18np(
"Copy Event",
"Copy %1 Events" ) );
272 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n(
"Copy Event To" ) );
273 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n(
"Copy Event To" ) );
274 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
275 ki18np(
"Delete Event",
"Delete %1 Events" ) );
276 mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
277 ki18np(
"Cut Event",
"Cut %1 Events" ) );
278 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n(
"Move Event To" ) );
279 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n(
"Move Event To" ) );
282 }
else if ( mimeType == KCalCore::Todo::todoMimeType() ) {
283 mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
284 ki18np(
"Copy To-do",
"Copy %1 To-dos" ) );
285 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n(
"Copy To-do To" ) );
286 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n(
"Copy To-do To" ) );
287 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
288 ki18np(
"Delete To-do",
"Delete %1 To-dos" ) );
289 mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
290 ki18np(
"Cut To-do",
"Cut %1 To-dos" ) );
291 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n(
"Move To-do To" ) );
292 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n(
"Move To-do To" ) );
295 }
else if ( mimeType == KCalCore::Journal::journalMimeType() ) {
296 mGenericManager->setActionText( Akonadi::StandardActionManager::CopyItems,
297 ki18np(
"Copy Journal",
"Copy %1 Journals" ) );
298 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToMenu )->setText( i18n(
"Copy Journal To" ) );
299 mGenericManager->action( Akonadi::StandardActionManager::CopyItemToDialog )->setText( i18n(
"Copy Journal To" ) );
300 mGenericManager->setActionText( Akonadi::StandardActionManager::DeleteItems,
301 ki18np(
"Delete Journal",
"Delete %1 Journals" ) );
302 mGenericManager->setActionText( Akonadi::StandardActionManager::CutItems,
303 ki18np(
"Cut Journal",
"Cut %1 Journals" ) );
304 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToMenu )->setText( i18n(
"Move Journal To" ) );
305 mGenericManager->action( Akonadi::StandardActionManager::MoveItemToDialog )->setText( i18n(
"Move Journal To" ) );
321 bool canEditItem =
true;
324 canEditItem = canEditItem && (itemCount == 1);
327 const QModelIndexList rows = mItemSelectionModel->selectedRows();
328 if ( rows.count() == 1 ) {
329 const QModelIndex index = rows.first();
330 const Collection parentCollection = index.data( EntityTreeModel::ParentCollectionRole ).value<Collection>();
331 if ( parentCollection.isValid() )
332 canEditItem = canEditItem && (parentCollection.rights() & Collection::CanChangeItem);
341 if ( itemCount == 1 ) {
342 const Akonadi::Item item = mGenericManager->selectedItems().first();
344 if ( item.isValid() && item.hasPayload<KCalCore::Todo::Ptr>() ) {
350 emit mParent->actionStateUpdated();
353 void slotCreateEvent()
358 void slotCreateTodo()
363 void slotCreateSubTodo()
368 void slotCreateJournal()
373 void slotEditIncidence()
378 KActionCollection *mActionCollection;
379 QWidget *mParentWidget;
380 StandardActionManager *mGenericManager;
381 QItemSelectionModel *mCollectionSelectionModel;
382 QItemSelectionModel *mItemSelectionModel;
383 QHash<StandardCalendarActionManager::Type, KAction*> mActions;
384 QSet<StandardCalendarActionManager::Type> mInterceptedActions;
391 d( new Private( actionCollection, parent, this ) )
402 d->mCollectionSelectionModel = selectionModel;
403 d->mGenericManager->setCollectionSelectionModel( selectionModel );
405 connect( selectionModel->model(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
406 SLOT(updateActions()) );
407 connect( selectionModel->model(), SIGNAL(rowsRemoved(QModelIndex,
int,
int)),
408 SLOT(updateActions()) );
409 connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
410 SLOT(updateActions()) );
416 d->mItemSelectionModel = selectionModel;
417 d->mGenericManager->setItemSelectionModel( selectionModel );
419 connect( selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
420 SLOT(updateActions()) );
427 if ( d->mActions.contains( type ) )
428 return d->mActions.value( type );
433 action =
new KAction( d->mParentWidget );
434 action->setIcon( KIcon( QLatin1String(
"appointment-new" ) ) );
435 action->setText( i18n(
"New E&vent..." ) );
436 action->setWhatsThis( i18n(
"Create a new event" ) );
438 d->mActionCollection->addAction( QString::fromLatin1(
"akonadi_event_create" ), action );
439 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(slotCreateEvent()) );
442 action =
new KAction( d->mParentWidget );
443 action->setIcon( KIcon( QLatin1String(
"task-new" ) ) );
444 action->setText( i18n(
"New &To-do..." ) );
445 action->setWhatsThis( i18n(
"Create a new To-do" ) );
447 d->mActionCollection->addAction( QString::fromLatin1(
"akonadi_todo_create" ), action );
448 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(slotCreateTodo()) );
451 action =
new KAction( d->mParentWidget );
452 action->setIcon( KIcon( QLatin1String(
"new_subtodo" ) ) );
453 action->setText( i18n(
"New Su&b-to-do..." ) );
454 action->setWhatsThis( i18n(
"Create a new Sub-to-do" ) );
456 d->mActionCollection->addAction( QString::fromLatin1(
"akonadi_subtodo_create" ), action );
457 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(slotCreateSubTodo()) );
460 action =
new KAction( d->mParentWidget );
461 action->setIcon( KIcon( QLatin1String(
"journal-new" ) ) );
462 action->setText( i18n(
"New &Journal..." ) );
463 action->setWhatsThis( i18n(
"Create a new Journal" ) );
465 d->mActionCollection->addAction( QString::fromLatin1(
"akonadi_journal_create" ), action );
466 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(slotCreateJournal()) );
469 action =
new KAction( d->mParentWidget );
470 action->setText( i18n(
"&Edit..." ) );
471 action->setWhatsThis( i18n(
"Edit the selected incidence." ) );
473 d->mActionCollection->addAction( QString::fromLatin1(
"akonadi_incidence_edit" ), action );
474 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(slotEditIncidence()) );
486 return d->mGenericManager->createAction( type );
497 d->mGenericManager->createAllActions();
503 if ( d->mActions.contains( type ) )
504 return d->mActions.value( type );
511 return d->mGenericManager->action( type );
516 d->mGenericManager->setActionText( type, text );
522 d->mInterceptedActions.insert( type );
524 d->mInterceptedActions.remove( type );
529 d->mGenericManager->interceptAction( type, intercept );
534 return d->mGenericManager->selectedCollections();
539 return d->mGenericManager->selectedItems();
544 d->mGenericManager->setContextText( type, context, text );
549 d->mGenericManager->setContextText( type, context, text );
552 void StandardCalendarActionManager::setCollectionPropertiesPageNames(
const QStringList &names )
554 d->mGenericManager->setCollectionPropertiesPageNames( names );
557 #include "standardcalendaractionmanager.moc"