• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

korganizer

  • sources
  • kde-4.12
  • kdepim
  • korganizer
calendarview.cpp
Go to the documentation of this file.
1 /*
2  This file is part of KOrganizer.
3 
4  Copyright (c) 1997, 1998, 1999 Preston Brown <preston.brown@yale.edu>
5  Fester Zigterman <F.J.F.ZigtermanRustenburg@student.utwente.nl>
6  Ian Dawes <iadawes@globalserve.net>
7  Laszlo Boloni <boloni@cs.purdue.edu>
8 
9  Copyright (C) 2000-2004 Cornelius Schumacher <schumacher@kde.org>
10  Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
11  Copyright (C) 2005 Rafal Rzepecki <divide@users.sourceforge.net>
12 
13  This program is free software; you can redistribute it and/or modify
14  it under the terms of the GNU General Public License as published by
15  the Free Software Foundation; either version 2 of the License, or
16  (at your option) any later version.
17 
18  This program is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  GNU General Public License for more details.
22 
23  You should have received a copy of the GNU General Public License along
24  with this program; if not, write to the Free Software Foundation, Inc.,
25  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 
27  As a special exception, permission is given to link this program
28  with any edition of Qt, and distribute the resulting executable,
29  without including the source code for Qt in the source distribution.
30 */
31 
32 #include "calendarview.h"
33 #include "calprinter.h"
34 #include "datechecker.h"
35 #include "datenavigator.h"
36 #include "datenavigatorcontainer.h"
37 #include "exportwebdialog.h"
38 #include "kocorehelper.h"
39 #include "kodaymatrix.h"
40 #include "kodialogmanager.h"
41 #include "koeventviewerdialog.h"
42 #include "koglobals.h"
43 #include "kohelper.h"
44 #include "koprefs.h"
45 #include "koviewmanager.h"
46 #include "htmlexportsettings.h"
47 #include "navigatorbar.h"
48 #include "views/agendaview/koagendaview.h"
49 #include "views/monthview/monthview.h"
50 #include "views/multiagendaview/multiagendaview.h"
51 #include "views/todoview/kotodoview.h"
52 #include "kocheckableproxymodel.h"
53 #include "akonadicollectionview.h"
54 
55 #include <calendarsupport/categoryconfig.h>
56 #include <calendarsupport/collectiongeneralpage.h>
57 #include <calendarsupport/collectionselection.h>
58 #include <calendarsupport/kcalprefs.h>
59 #include <calendarsupport/utils.h>
60 #include <calendarsupport/next/incidenceviewer.h>
61 
62 #include <incidenceeditor-ng/incidencedefaults.h>
63 #include <incidenceeditor-ng/incidencedialog.h>
64 #include <incidenceeditor-ng/incidencedialogfactory.h>
65 
66 #include <libkdepim/widgets/pimmessagebox.h>
67 #include <akonadi/calendar/freebusymanager.h>
68 #include <akonadi/calendar/history.h>
69 #include <Akonadi/Calendar/IncidenceChanger>
70 #include <Akonadi/Calendar/CalendarSettings>
71 #include <Akonadi/Calendar/CalendarClipboard>
72 
73 #include <pimcommon/acl/collectionaclpage.h>
74 #include <pimcommon/acl/imapaclattribute.h>
75 
76 #include <Akonadi/CollectionPropertiesDialog>
77 #include <Akonadi/Control>
78 #include <Akonadi/AttributeFactory>
79 #include <Akonadi/Calendar/TodoPurger>
80 
81 #include <KCalCore/CalFilter>
82 #include <KCalCore/FileStorage>
83 #include <KCalCore/ICalFormat>
84 #include <KCalCore/VCalFormat>
85 
86 #include <KCalUtils/ICalDrag>
87 #include <KCalUtils/Stringify>
88 #include <KCalUtils/DndFactory>
89 
90 #include <KHolidays/Holidays>
91 
92 #include <KFileDialog>
93 #include <KNotification>
94 #include <KRun>
95 #include <KVBox>
96 
97 #include <QApplication>
98 #include <QClipboard>
99 #include <QItemSelectionModel>
100 #include <QSplitter>
101 #include <QStackedWidget>
102 #include <QVBoxLayout>
103 
104 CalendarView::CalendarView( QWidget *parent ) : CalendarViewBase( parent ),
105  mCheckableProxyModel( 0 ),
106  mETMCollectionView( 0 )
107 {
108  Akonadi::Control::widgetNeedsAkonadi( this );
109  mChanger = new Akonadi::IncidenceChanger( this );
110  mChanger->setDefaultCollection( Akonadi::Collection( CalendarSupport::KCalPrefs::instance()->defaultCalendarId() ) );
111 
112  mChanger->setDestinationPolicy( static_cast<Akonadi::IncidenceChanger::DestinationPolicy>( KOPrefs::instance()->destination() ) );
113  mCalendar = Akonadi::ETMCalendar::Ptr( new Akonadi::ETMCalendar() );
114  mCalendar->setObjectName( QLatin1String("KOrg Calendar") );
115  mCalendarClipboard = new Akonadi::CalendarClipboard( mCalendar, mChanger, this );
116  mITIPHandler = new Akonadi::ITIPHandler( this );
117  mITIPHandler->setCalendar( mCalendar );
118  connect( mCalendarClipboard, SIGNAL(cutFinished(bool,QString)), SLOT(onCutFinished()) );
119 
120  Akonadi::AttributeFactory::registerAttribute<PimCommon::ImapAclAttribute>();
121 
122  mViewManager = new KOViewManager( this );
123  mDialogManager = new KODialogManager( this );
124  mTodoPurger = new Akonadi::TodoPurger( this );
125  mTodoPurger->setCalendar( mCalendar );
126  mTodoPurger->setIncidenceChager( mChanger );
127  connect(mTodoPurger, SIGNAL(todosPurged(bool,int,int)),
128  SLOT(onTodosPurged(bool,int,int)));
129 
130  mReadOnly = false;
131  mSplitterSizesValid = false;
132 
133  mCalPrinter = 0;
134 
135  mDateNavigator = new DateNavigator( this );
136  mDateChecker = new DateChecker( this );
137 
138  QVBoxLayout *topLayout = new QVBoxLayout( this );
139  topLayout->setMargin( 0 );
140 
141  // create the main layout frames.
142  mPanner = new QSplitter( Qt::Horizontal, this );
143  mPanner->setObjectName( QLatin1String("CalendarView::Panner") );
144  topLayout->addWidget( mPanner );
145 
146  mLeftSplitter = new QSplitter( Qt::Vertical, mPanner );
147  mLeftSplitter->setObjectName( QLatin1String("CalendarView::LeftFrame") );
148  // The GUI checkboxes of "show widget XYZ" are confusing when the QSplitter
149  // hides the widget magically. I know I blamed Akonadi for not showing my
150  // calendar more than once.
151  mLeftSplitter->setChildrenCollapsible( false );
152 
153  mDateNavigatorContainer = new DateNavigatorContainer( mLeftSplitter );
154  mDateNavigatorContainer->setObjectName( QLatin1String("CalendarView::DateNavigator") );
155 
156  mTodoList = new KOTodoView( true/*sidebar*/, mLeftSplitter );
157  mTodoList->setObjectName(QLatin1String( "todolist") );
158 
159  mEventViewerBox = new KVBox( mLeftSplitter );
160  mEventViewerBox->setMargin( 0 );
161  mEventViewer = new CalendarSupport::IncidenceViewer( mCalendar.data(), mEventViewerBox );
162  mEventViewer->setObjectName( QLatin1String("EventViewer") );
163 
164  KVBox *rightBox = new KVBox( mPanner );
165  rightBox->layout()->setMargin( 0 );
166  mNavigatorBar = new NavigatorBar( rightBox );
167  mRightFrame = new QStackedWidget( rightBox );
168  mMessageWidget = new CalendarSupport::MessageWidget( rightBox );
169 
170  rightBox->setStretchFactor( mRightFrame, 1 );
171 
172  mLeftFrame = mLeftSplitter;
173  mLeftFrame->installEventFilter( this );
174 
175  mChanger->setGroupwareCommunication( CalendarSupport::KCalPrefs::instance()->useGroupwareCommunication() );
176  connect( mChanger,
177  SIGNAL(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
178  SLOT(slotCreateFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
179 
180  connect( mChanger,
181  SIGNAL(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)),
182  SLOT(slotDeleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)) );
183 
184  connect( mChanger,
185  SIGNAL(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
186  SLOT(slotModifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
187 
188  // Signals emitted by mDateNavigator
189  connect( mDateNavigator, SIGNAL(datesSelected(KCalCore::DateList,QDate)),
190  SLOT(showDates(KCalCore::DateList,QDate)) );
191 
192  connect( mDateNavigatorContainer, SIGNAL(newEventSignal(QDate)),
193  SLOT(newEvent(QDate)) );
194  connect( mDateNavigatorContainer, SIGNAL(newTodoSignal(QDate)),
195  SLOT(newTodo(QDate)) );
196  connect( mDateNavigatorContainer, SIGNAL(newJournalSignal(QDate)),
197  SLOT(newJournal(QDate)) );
198 
199  // Signals emitted by mNavigatorBar
200  connect( mNavigatorBar, SIGNAL(prevYearClicked()),
201  mDateNavigator, SLOT(selectPreviousYear()) );
202  connect( mNavigatorBar, SIGNAL(nextYearClicked()),
203  mDateNavigator, SLOT(selectNextYear()) );
204  connect( mNavigatorBar, SIGNAL(prevMonthClicked()),
205  mDateNavigator, SLOT(selectPreviousMonth()) );
206  connect( mNavigatorBar, SIGNAL(nextMonthClicked()),
207  mDateNavigator, SLOT(selectNextMonth()) );
208  connect( mNavigatorBar, SIGNAL(monthSelected(int)),
209  mDateNavigator, SLOT(selectMonth(int)) );
210  connect( mNavigatorBar, SIGNAL(yearSelected(int)),
211  mDateNavigator, SLOT(selectYear(int)) );
212 
213  // Signals emitted by mDateNavigatorContainer
214  connect( mDateNavigatorContainer, SIGNAL(weekClicked(QDate,QDate)),
215  SLOT(selectWeek(QDate,QDate)) );
216 
217  connect( mDateNavigatorContainer, SIGNAL(prevMonthClicked(QDate,QDate,QDate)),
218  mDateNavigator, SLOT(selectPreviousMonth(QDate,QDate,QDate)) );
219  connect( mDateNavigatorContainer, SIGNAL(nextMonthClicked(QDate,QDate,QDate)),
220  mDateNavigator, SLOT(selectNextMonth(QDate,QDate,QDate)) );
221  connect( mDateNavigatorContainer, SIGNAL(prevYearClicked()),
222  mDateNavigator, SLOT(selectPreviousYear()) );
223  connect( mDateNavigatorContainer, SIGNAL(nextYearClicked()),
224  mDateNavigator, SLOT(selectNextYear()) );
225  connect( mDateNavigatorContainer, SIGNAL(monthSelected(int)),
226  mDateNavigator, SLOT(selectMonth(int)) );
227  connect( mDateNavigatorContainer, SIGNAL(yearSelected(int)),
228  mDateNavigator, SLOT(selectYear(int)) );
229  connect( mDateNavigatorContainer, SIGNAL(goPrevious()),
230  mDateNavigator, SLOT(selectPrevious()) );
231  connect( mDateNavigatorContainer, SIGNAL(goNext()),
232  mDateNavigator, SLOT(selectNext()) );
233 
234  connect( mDateNavigatorContainer, SIGNAL(datesSelected(KCalCore::DateList,QDate)),
235  mDateNavigator, SLOT(selectDates(KCalCore::DateList,QDate)) );
236 
237  connect( mViewManager, SIGNAL(datesSelected(KCalCore::DateList)),
238  mDateNavigator, SLOT(selectDates(KCalCore::DateList)) );
239 
240  connect( mDateNavigatorContainer, SIGNAL(incidenceDropped(Akonadi::Item,QDate)),
241  SLOT(addIncidenceOn(Akonadi::Item,QDate)) );
242  connect( mDateNavigatorContainer, SIGNAL(incidenceDroppedMove(Akonadi::Item,QDate)),
243  SLOT(moveIncidenceTo(Akonadi::Item,QDate)) );
244 
245  connect( mDateChecker, SIGNAL(dayPassed(QDate)),
246  mTodoList, SLOT(dayPassed(QDate)) );
247  connect( mDateChecker, SIGNAL(dayPassed(QDate)),
248  SIGNAL(dayPassed(QDate)) );
249  connect( mDateChecker, SIGNAL(dayPassed(QDate)),
250  mDateNavigatorContainer, SLOT(updateToday()) );
251 
252  connect( this, SIGNAL(configChanged()),
253  mDateNavigatorContainer, SLOT(updateConfig()) );
254 
255  connect( this, SIGNAL(incidenceSelected(Akonadi::Item,QDate)),
256  mEventViewer, SLOT(setIncidence(Akonadi::Item,QDate)) );
257 
258  //TODO: do a pretty Summary,
259  QString s;
260  s = i18n( "<p><em>No Item Selected</em></p>"
261  "<p>Select an event, to-do or journal entry to view its details "
262  "here.</p>" );
263 
264  mEventViewer->setDefaultMessage( s );
265  mEventViewer->setWhatsThis(
266  i18n( "View the details of events, journal entries or to-dos "
267  "selected in KOrganizer's main view here." ) );
268  mEventViewer->setIncidence( Akonadi::Item(), QDate() );
269 
270  mViewManager->connectTodoView( mTodoList );
271  mViewManager->connectView( mTodoList );
272 
273  KOGlobals::self()->setHolidays( new KHolidays::HolidayRegion( KOPrefs::instance()->mHolidays ) );
274 
275  connect( QApplication::clipboard(), SIGNAL(dataChanged()), SLOT(checkClipboard()) );
276 
277  connect( mTodoList, SIGNAL(incidenceSelected(Akonadi::Item,QDate)),
278  this, SLOT(processTodoListSelection(Akonadi::Item,QDate)) );
279  disconnect( mTodoList, SIGNAL(incidenceSelected(Akonadi::Item,QDate)),
280  this, SLOT(processMainViewSelection(Akonadi::Item,QDate)) );
281 
282  {
283  static bool pageRegistered = false;
284 
285  if ( !pageRegistered ) {
286  Akonadi::CollectionPropertiesDialog::registerPage(
287  new CalendarSupport::CollectionGeneralPageFactory );
288  Akonadi::CollectionPropertiesDialog::registerPage( new PimCommon::CollectionAclPageFactory );
289  pageRegistered = true;
290  }
291  }
292 
293  Akonadi::FreeBusyManager::self()->setCalendar( mCalendar );
294 
295  mCalendar->registerObserver( this );
296  mDateNavigatorContainer->setCalendar( mCalendar );
297  mTodoList->setCalendar( mCalendar );
298  mEventViewer->setCalendar( mCalendar.data() );
299 }
300 
301 CalendarView::~CalendarView()
302 {
303  mCalendar->unregisterObserver( this );
304  mCalendar->setFilter( 0 ); // So calendar doesn't deleted it twice
305  qDeleteAll( mFilters );
306  qDeleteAll( mExtensions );
307 
308  delete mDialogManager;
309  delete mViewManager;
310  delete mEventViewer;
311 }
312 
313 Akonadi::ETMCalendar::Ptr CalendarView::calendar() const
314 {
315  return mCalendar;
316 }
317 
318 QDate CalendarView::activeDate( bool fallbackToToday )
319 {
320  KOrg::BaseView *curView = mViewManager->currentView();
321  if ( curView ) {
322  if ( curView->selectionStart().isValid() ) {
323  return curView->selectionStart().date();
324  }
325 
326  // Try the view's selectedIncidenceDates()
327  if ( !curView->selectedIncidenceDates().isEmpty() ) {
328  if ( curView->selectedIncidenceDates().first().isValid() ) {
329  return curView->selectedIncidenceDates().first();
330  }
331  }
332  }
333 
334  // When all else fails, use the navigator start date, or today.
335  if ( fallbackToToday ) {
336  return QDate::currentDate();
337  } else {
338  return mDateNavigator->selectedDates().first();
339  }
340 }
341 
342 QDate CalendarView::activeIncidenceDate()
343 {
344  KOrg::BaseView *curView = mViewManager->currentView();
345  if ( curView ) {
346  DateList dates = curView->selectedIncidenceDates();
347  if ( !dates.isEmpty() ) {
348  return dates.first();
349  }
350  }
351 
352  return QDate();
353 }
354 
355 QDate CalendarView::startDate()
356 {
357  DateList dates = mDateNavigator->selectedDates();
358  return dates.first();
359 }
360 
361 QDate CalendarView::endDate()
362 {
363  DateList dates = mDateNavigator->selectedDates();
364  return dates.last();
365 }
366 
367 void CalendarView::createPrinter()
368 {
369  if ( !mCalPrinter ) {
370  mCalPrinter = new CalPrinter( this, mCalendar, new KOCoreHelper() );
371  connect( this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig()) );
372  }
373 }
374 
375 bool CalendarView::saveCalendar( const QString &filename )
376 {
377  // Store back all unsaved data into calendar object
378  mViewManager->currentView()->flushView();
379 
380  KCalCore::FileStorage storage( mCalendar );
381  storage.setFileName( filename );
382  storage.setSaveFormat( new KCalCore::ICalFormat );
383 
384  return storage.save();
385 }
386 
387 void CalendarView::archiveCalendar()
388 {
389  mDialogManager->showArchiveDialog();
390 }
391 
392 void CalendarView::readSettings()
393 {
394  QString str;
395 
396  // read settings from the KConfig, supplying reasonable
397  // defaults where none are to be found
398 
399  KConfig *config = KOGlobals::self()->config();
400 
401  KConfigGroup geometryConfig( config, "KOrganizer Geometry" );
402 
403  QList<int> sizes = geometryConfig.readEntry( "Separator1",QList<int>() );
404  if ( sizes.count() != 2 || sizes.count() == sizes.count( 0 ) ) {
405  sizes << mDateNavigatorContainer->minimumSizeHint().width();
406  sizes << 300;
407  }
408  mPanner->setSizes( sizes );
409 
410  sizes = geometryConfig.readEntry( "Separator2", QList<int>() );
411  if ( !sizes.isEmpty() && sizes.count() != sizes.count( 0 ) ) {
412  mLeftSplitter->setSizes( sizes );
413  }
414 
415  mViewManager->readSettings( config );
416  mTodoList->restoreLayout( config, QLatin1String( "Sidebar Todo View" ), true );
417 
418  readFilterSettings( config );
419 
420  KConfigGroup viewConfig( config, "Views" );
421  int dateCount = viewConfig.readEntry( "ShownDatesCount", 7 );
422  if ( dateCount == 7 ) {
423  mDateNavigator->selectWeek();
424  } else {
425  mDateNavigator->selectDates( mDateNavigator->selectedDates().first(), dateCount );
426  }
427 }
428 
429 void CalendarView::writeSettings()
430 {
431  KConfig *config = KOGlobals::self()->config();
432 
433  KConfigGroup geometryConfig( config, "KOrganizer Geometry" );
434 
435  QList<int> list = mMainSplitterSizes.isEmpty() ? mPanner->sizes() : mMainSplitterSizes;
436  // splitter sizes are invalid (all zero) unless we have been shown once
437  if ( list.count() != list.count( 0 ) && mSplitterSizesValid ) {
438  geometryConfig.writeEntry( "Separator1", list );
439  }
440 
441  list = mLeftSplitter->sizes();
442  if ( list.count() != list.count( 0 ) && mSplitterSizesValid ) {
443  geometryConfig.writeEntry( "Separator2", list );
444  }
445 
446  mViewManager->writeSettings( config );
447  mTodoList->saveLayout( config, QLatin1String( "Sidebar Todo View" ) );
448 
449  Akonadi::CalendarSettings::self()->writeConfig();
450  KOPrefs::instance()->writeConfig();
451  CalendarSupport::KCalPrefs::instance()->writeConfig();
452 
453  writeFilterSettings( config );
454 
455  KConfigGroup viewConfig( config, "Views" );
456  viewConfig.writeEntry( "ShownDatesCount", mDateNavigator->selectedDates().count() );
457 
458  config->sync();
459 }
460 
461 void CalendarView::readFilterSettings( KConfig *config )
462 {
463  qDeleteAll( mFilters );
464  mFilters.clear();
465 
466  KConfigGroup generalConfig( config, "General" );
467  // FIXME: Move the filter loading and saving to the CalFilter class in libkcal
468  QStringList filterList = generalConfig.readEntry( "CalendarFilters", QStringList() );
469  QString currentFilter = generalConfig.readEntry( "Current Filter" );
470 
471  QStringList::ConstIterator it = filterList.constBegin();
472  QStringList::ConstIterator end = filterList.constEnd();
473  while ( it != end ) {
474  KCalCore::CalFilter *filter = new KCalCore::CalFilter( *it );
475  KConfigGroup filterConfig( config, QLatin1String("Filter_") + (*it) );
476  filter->setCriteria( filterConfig.readEntry( "Criteria", 0 ) );
477  filter->setCategoryList( filterConfig.readEntry( "CategoryList", QStringList() ) );
478  if ( filter->criteria() & KCalCore::CalFilter::HideNoMatchingAttendeeTodos ) {
479  filter->setEmailList( CalendarSupport::KCalPrefs::instance()->allEmails() );
480  }
481  filter->setCompletedTimeSpan( filterConfig.readEntry( "HideTodoDays", 0 ) );
482  mFilters.append( filter );
483 
484  ++it;
485  }
486 
487  int pos = filterList.indexOf( currentFilter );
488  mCurrentFilter = 0;
489  if ( pos >= 0 ) {
490  mCurrentFilter = mFilters.at( pos );
491  }
492  updateFilter();
493 }
494 
495 void CalendarView::writeFilterSettings( KConfig *config )
496 {
497  QStringList filterList;
498 
499  foreach ( KCalCore::CalFilter *filter, mFilters ) {
500  filterList << filter->name();
501  KConfigGroup filterConfig( config, QLatin1String("Filter_") + filter->name() );
502  filterConfig.writeEntry( "Criteria", filter->criteria() );
503  filterConfig.writeEntry( "CategoryList", filter->categoryList() );
504  filterConfig.writeEntry( "HideTodoDays", filter->completedTimeSpan() );
505  }
506  KConfigGroup generalConfig( config, "General" );
507  generalConfig.writeEntry( "CalendarFilters", filterList );
508  if ( mCurrentFilter ) {
509  generalConfig.writeEntry( "Current Filter", mCurrentFilter->name() );
510  } else {
511  generalConfig.writeEntry( "Current Filter", QString() );
512  }
513 }
514 
515 void CalendarView::goDate( const QDate &date )
516 {
517  mDateNavigator->selectDate( date );
518 }
519 
520 void CalendarView::showDate( const QDate &date )
521 {
522  int dateCount = mDateNavigator->datesCount();
523  if ( dateCount == 7 ) {
524  mDateNavigator->selectWeek( date );
525  } else {
526  mDateNavigator->selectDates( date, dateCount );
527  }
528 }
529 
530 void CalendarView::goToday()
531 {
532  mDateNavigator->selectToday();
533 }
534 
535 void CalendarView::goNext()
536 {
537  if ( dynamic_cast<MonthView*>( mViewManager->currentView() ) ) {
538  const QDate month = mDateNavigatorContainer->monthOfNavigator( 0 );
539  QPair<QDate,QDate> limits = KODayMatrix::matrixLimits( month );
540  mDateNavigator->selectNextMonth( month, limits.first, limits.second );
541  } else {
542  mDateNavigator->selectNext();
543  }
544 }
545 
546 void CalendarView::goPrevious()
547 {
548  if ( dynamic_cast<MonthView*>( mViewManager->currentView() ) ) {
549  const QDate month = mDateNavigatorContainer->monthOfNavigator( 0 );
550  QPair<QDate,QDate> limits = KODayMatrix::matrixLimits( month );
551  mDateNavigator->selectPreviousMonth( month, limits.first, limits.second );
552  } else {
553  mDateNavigator->selectPrevious();
554  }
555 }
556 
557 void CalendarView::updateConfig()
558 {
559  updateConfig( QByteArray( "korganizer" ) );
560 }
561 
562 void CalendarView::updateConfig( const QByteArray &receiver )
563 {
564  if ( receiver != "korganizer" ) {
565  return;
566  }
567 
568  if ( mCalPrinter ) {
569  mCalPrinter->deleteLater();
570  mCalPrinter = 0;
571  }
572 
573  KOGlobals::self()->setHolidays( new KHolidays::HolidayRegion( KOPrefs::instance()->mHolidays ) );
574 
575  // Only set a new time zone if it changed. This prevents the window
576  // from being modified on start
577  KDateTime::Spec newTimeSpec = CalendarSupport::KCalPrefs::instance()->timeSpec();
578  if ( mCalendar->viewTimeSpec() != newTimeSpec ) {
579 
580  const QString question( i18n( "The time zone setting was changed. "
581  "Do you want to keep the absolute time of "
582  "the items in your calendar, which will show "
583  "them to be at a different time than "
584  "before, or move them to be at the old time "
585  "also in the new time zone?" ) );
586  int rc = KMessageBox::questionYesNo( this, question,
587  i18n( "Keep Absolute Times?" ),
588  KGuiItem( i18n( "Keep Times" ) ),
589  KGuiItem( i18n( "Move Times" ) ),
590  QLatin1String("calendarKeepAbsoluteTimes") );
591  if ( rc == KMessageBox::Yes ) {
592  // keep the absolute time - note the new viewing time zone in the calendar
593  mCalendar->setViewTimeSpec( newTimeSpec );
594  } else {
595  // only set the new timezone, wihtout shifting events, they will be
596  // interpreted as being in the new timezone now
597  mCalendar->shiftTimes( mCalendar->viewTimeSpec(), newTimeSpec );
598  }
599  }
600 
601  // config changed lets tell the date navigator the new modes
602  // if there weren't changed they are ignored
603  updateHighlightModes();
604 
605  emit configChanged();
606 
607  //switch beetween merged, side by side and tabbed agenda if needed
608  mViewManager->updateMultiCalendarDisplay();
609 
610  // To make the "fill window" configurations work
611  mViewManager->raiseCurrentView();
612 
613  mChanger->setDestinationPolicy(
614  static_cast<Akonadi::IncidenceChanger::DestinationPolicy>(
615  KOPrefs::instance()->destination() ) );
616 
617  mChanger->setGroupwareCommunication( CalendarSupport::KCalPrefs::instance()->useGroupwareCommunication() );
618 }
619 
620 void CalendarView::slotCreateFinished( int changeId,
621  const Akonadi::Item &item,
622  Akonadi::IncidenceChanger::ResultCode resultCode,
623  const QString &errorString )
624 {
625  Q_UNUSED( changeId );
626  if ( resultCode == Akonadi::IncidenceChanger::ResultCodeSuccess ) {
627  changeIncidenceDisplay( item, Akonadi::IncidenceChanger::ChangeTypeCreate );
628  updateUnmanagedViews();
629  checkForFilteredChange( item );
630  } else {
631  kError() << "Incidence not added, job reported error: " << errorString;
632  }
633 }
634 
635 void CalendarView::slotModifyFinished( int changeId,
636  const Akonadi::Item &item,
637  Akonadi::IncidenceChanger::ResultCode resultCode,
638  const QString &errorString )
639 {
640  Q_UNUSED( changeId );
641  if ( resultCode != Akonadi::IncidenceChanger::ResultCodeSuccess ) {
642  kError() << "Incidence not modified, job reported error: " << errorString;
643  return;
644  }
645 
646  Q_ASSERT( item.isValid() );
647  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( item );
648  Q_ASSERT( incidence );
649  QSet<KCalCore::IncidenceBase::Field> dirtyFields = incidence->dirtyFields();
650  incidence->resetDirtyFields();
651  // Record completed todos in journals, if enabled. we should to this here in
652  // favor of the todolist. users can mark a task as completed in an editor
653  // as well.
654  if ( incidence->type() == Incidence::TypeTodo &&
655  KOPrefs::instance()->recordTodosInJournals() &&
656  ( dirtyFields.contains( KCalCore::Incidence::FieldCompleted ) ) ) {
657  KCalCore::Todo::Ptr todo = incidence.dynamicCast<KCalCore::Todo>();
658  if ( todo->isCompleted() || todo->recurs() ) {
659  QString timeStr = KGlobal::locale()->formatTime( QTime::currentTime() );
660  QString description = i18n( "Todo completed: %1 (%2)", incidence->summary(), timeStr );
661 
662  KCalCore::Journal::List journals = calendar()->journals( QDate::currentDate() );
663 
664  if ( journals.isEmpty() ) {
665  Journal::Ptr journal( new Journal );
666  journal->setDtStart(
667  KDateTime::currentDateTime( CalendarSupport::KCalPrefs::instance()->timeSpec() ) );
668 
669  QString dateStr = KGlobal::locale()->formatDate( QDate::currentDate() );
670  journal->setSummary( i18n( "Journal of %1", dateStr ) );
671  journal->setDescription( description );
672 
673  if ( mChanger->createIncidence( journal, item.parentCollection(), this ) == -1 ) {
674  kError() << "Unable to add Journal";
675  return;
676  }
677 
678  } else { // journal list is not empty
679  Akonadi::Item journalItem = mCalendar->item( journals.first()->uid() );
680  Journal::Ptr journal = CalendarSupport::journal( journalItem );
681  Journal::Ptr oldJournal( journal->clone() );
682  journal->setDescription( journal->description().append( QLatin1Char('\n') + description ) );
683  mChanger->modifyIncidence( journalItem, oldJournal, this );
684 
685  }
686  }
687  }
688 
689  changeIncidenceDisplay( item, Akonadi::IncidenceChanger::ChangeTypeCreate );
690  updateUnmanagedViews();
691  checkForFilteredChange( item );
692 }
693 
694 void CalendarView::slotDeleteFinished( int changeId,
695  const QVector<Akonadi::Item::Id> &itemIdList,
696  Akonadi::IncidenceChanger::ResultCode resultCode,
697  const QString &errorString )
698 {
699  Q_UNUSED( changeId );
700  if ( resultCode == Akonadi::IncidenceChanger::ResultCodeSuccess ) {
701  foreach( Akonadi::Item::Id id, itemIdList ) {
702  Akonadi::Item item = mCalendar->item( id );
703  if ( item.isValid() )
704  changeIncidenceDisplay( item, Akonadi::IncidenceChanger::ChangeTypeDelete );
705  }
706  updateUnmanagedViews();
707  } else {
708  kError() << "Incidence not deleted, job reported error: " << errorString;
709  }
710 }
711 
712 void CalendarView::checkForFilteredChange( const Akonadi::Item &item )
713 {
714  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( item );
715  KCalCore::CalFilter *filter = calendar()->filter();
716  if ( filter && !filter->filterIncidence( incidence ) ) {
717  // Incidence is filtered and thus not shown in the view, tell the
718  // user so that he isn't surprised if his new event doesn't show up
719  mMessageWidget->setText( i18n( "The item \"%1\" is filtered by your current filter rules, "
720  "so it will be hidden and not appear in the view.",
721  incidence->summary() ) );
722  mMessageWidget->show();
723  }
724 }
725 
726 void CalendarView::startMultiModify( const QString &text )
727 {
728  mChanger->startAtomicOperation( text );
729 }
730 
731 void CalendarView::endMultiModify()
732 {
733  mChanger->endAtomicOperation();
734 }
735 
736 void CalendarView::changeIncidenceDisplay( const Akonadi::Item &item,
737  Akonadi::IncidenceChanger::ChangeType changeType )
738 {
739  if ( mDateNavigatorContainer->isVisible() ) {
740  mDateNavigatorContainer->updateView();
741  }
742 
743  mDialogManager->updateSearchDialog();
744 
745  if ( CalendarSupport::hasIncidence( item ) ) {
746  // If there is an event view visible update the display
747  mViewManager->currentView()->changeIncidenceDisplay( item, changeType );
748  } else {
749  mViewManager->currentView()->updateView();
750  }
751 }
752 
753 void CalendarView::updateView( const QDate &start, const QDate &end,
754  const QDate &preferredMonth,
755  const bool updateTodos )
756 {
757  const bool currentViewIsTodoView = mViewManager->currentView()->identifier() == "DefaultTodoView";
758 
759  if ( updateTodos && !currentViewIsTodoView && mTodoList->isVisible() ) {
760  // Update the sidepane todoView
761  mTodoList->updateView();
762  }
763 
764  if ( start.isValid() && end.isValid() && !( currentViewIsTodoView && !updateTodos ) ) {
765  mViewManager->updateView( start, end, preferredMonth );
766  }
767 
768  if ( mDateNavigatorContainer->isVisible() ) {
769  mDateNavigatorContainer->updateView();
770  }
771 }
772 
773 void CalendarView::updateView()
774 {
775  const DateList tmpList = mDateNavigator->selectedDates();
776  const QDate month = mDateNavigatorContainer->monthOfNavigator();
777 
778  // We assume that the navigator only selects consecutive days.
779  updateView( tmpList.first(), tmpList.last(), month );
780 }
781 
782 void CalendarView::updateUnmanagedViews()
783 {
784  if ( mDateNavigatorContainer->isVisible() ) {
785  mDateNavigatorContainer->updateDayMatrix();
786  }
787 }
788 
789 int CalendarView::msgItemDelete( const Akonadi::Item &item )
790 {
791  return KMessageBox::warningContinueCancel(
792  this,
793  i18nc( "@info",
794  "Do you really want to permanently remove the item \"%1\"?",
795  CalendarSupport::incidence( item )->summary() ),
796  i18nc( "@title:window", "Delete Item?" ),
797  KStandardGuiItem::del() );
798 }
799 
800 void CalendarView::edit_cut()
801 {
802  const Akonadi::Item item = selectedIncidence();
803  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( item );
804  if ( !incidence ) {
805  kError() << "Null incidence";
806  return;
807  }
808 
809  mCalendarClipboard->cutIncidence( incidence, Akonadi::CalendarClipboard::AskMode );
810 }
811 
812 void CalendarView::edit_copy()
813 {
814  const Akonadi::Item item = selectedIncidence();
815 
816  if ( !item.isValid() ) {
817  KNotification::beep();
818  kError() << "Invalid item";
819  return;
820  }
821 
822  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( item );
823  Q_ASSERT( incidence );
824  if ( !mCalendarClipboard->copyIncidence( incidence, Akonadi::CalendarClipboard::AskMode ) )
825  kError() << "Error copying incidence";
826 
827  checkClipboard();
828 }
829 
830 void CalendarView::edit_paste()
831 {
832 // If in agenda and month view, use the selected time and date from there.
833 // In all other cases, use the navigator's selected date.
834 
835  QDateTime endDT;
836  KDateTime finalDateTime;
837  bool useEndTime = false;
838  KCalUtils::DndFactory::PasteFlags pasteFlags = 0;
839 
840  KOrg::BaseView *curView = mViewManager->currentView();
841  KOAgendaView *agendaView = mViewManager->agendaView();
842  MonthView *monthView = mViewManager->monthView();
843 
844  if ( !curView ) {
845  kWarning() << "No view is selected, can't paste";
846  return;
847  }
848 
849  if ( curView == agendaView && agendaView->selectionStart().isValid() ) {
850  const QDate date = agendaView->selectionStart().date();
851  endDT = agendaView->selectionEnd();
852  useEndTime = !agendaView->selectedIsSingleCell();
853  if ( agendaView->selectedIsAllDay() ) {
854  finalDateTime = KDateTime( date );
855  } else {
856  finalDateTime = KDateTime( date, agendaView->selectionStart().time() );
857  }
858  } else if ( curView == monthView && monthView->selectionStart().isValid() ) {
859  finalDateTime = KDateTime( monthView->selectionStart().date() );
860  pasteFlags = KCalUtils::DndFactory::FlagPasteAtOriginalTime;
861  } else if ( !mDateNavigator->selectedDates().isEmpty() &&
862  curView->supportsDateNavigation() ) {
863  // default to the selected date from the navigator
864  finalDateTime = KDateTime( mDateNavigator->selectedDates().first() );
865  pasteFlags = KCalUtils::DndFactory::FlagPasteAtOriginalTime;
866  }
867 
868  if ( !finalDateTime.isValid() && curView->supportsDateNavigation() ) {
869  KMessageBox::sorry(
870  this,
871  i18n( "Paste failed: unable to determine a valid target date." ) );
872  return;
873  }
874 
875  KCalUtils::DndFactory factory( mCalendar );
876 
877  Incidence::List pastedIncidences = factory.pasteIncidences( finalDateTime, pasteFlags );
878  Incidence::List::Iterator it;
879 
880  for ( it = pastedIncidences.begin(); it != pastedIncidences.end(); ++it ) {
881  // FIXME: use a visitor here
882  if ( ( *it )->type() == Incidence::TypeEvent ) {
883  KCalCore::Event::Ptr pastedEvent = ( *it ).staticCast<Event>();
884  // only use selected area if event is of the same type (all-day or non-all-day
885  // as the current selection is
886  if ( agendaView && endDT.isValid() && useEndTime ) {
887  if ( ( pastedEvent->allDay() && agendaView->selectedIsAllDay() ) ||
888  ( !pastedEvent->allDay() && !agendaView->selectedIsAllDay() ) ) {
889  KDateTime kdt( endDT, CalendarSupport::KCalPrefs::instance()->timeSpec() );
890  pastedEvent->setDtEnd( kdt.toTimeSpec( pastedEvent->dtEnd().timeSpec() ) );
891  }
892  }
893 
894  pastedEvent->setRelatedTo( QString() );
895  mChanger->createIncidence( KCalCore::Event::Ptr( pastedEvent->clone() ),
896  Akonadi::Collection(), this );
897  } else if ( ( *it )->type() == Incidence::TypeTodo ) {
898  KCalCore::Todo::Ptr pastedTodo = ( *it ).staticCast<Todo>();
899  Akonadi::Item _selectedTodoItem = selectedTodo();
900 
901  // if we are cutting a hierarchy only the root
902  // should be son of _selectedTodo
903  KCalCore::Todo::Ptr _selectedTodo = CalendarSupport::todo( _selectedTodoItem );
904  if ( _selectedTodo && pastedTodo->relatedTo().isEmpty() ) {
905  pastedTodo->setRelatedTo( _selectedTodo->uid() );
906  }
907 
908  // When pasting multiple incidences, don't ask which collection to use, for each one
909  mChanger->createIncidence( KCalCore::Todo::Ptr( pastedTodo->clone() ),
910  Akonadi::Collection(), this );
911  } else if ( ( *it )->type() == Incidence::TypeJournal ) {
912  // When pasting multiple incidences, don't ask which collection to use, for each one
913  mChanger->createIncidence( KCalCore::Incidence::Ptr( ( *it )->clone() ),
914  Akonadi::Collection(), this );
915  }
916  }
917 }
918 
919 void CalendarView::edit_options()
920 {
921  mDialogManager->showOptionsDialog();
922 }
923 
924 void CalendarView::dateTimesForNewEvent( QDateTime &startDt, QDateTime &endDt,
925  bool &allDay )
926 {
927  mViewManager->currentView()->eventDurationHint( startDt, endDt, allDay );
928 
929  if ( !startDt.isValid() || !endDt.isValid() ) {
930  startDt.setDate( activeDate( true ) );
931  startDt.setTime( CalendarSupport::KCalPrefs::instance()->mStartTime.time() );
932 
933  int addSecs =
934  ( CalendarSupport::KCalPrefs::instance()->mDefaultDuration.time().hour() * 3600 ) +
935  ( CalendarSupport::KCalPrefs::instance()->mDefaultDuration.time().minute() * 60 );
936  endDt = startDt.addSecs( addSecs );
937  }
938 }
939 
940 IncidenceEditorNG::IncidenceDialog *CalendarView::incidenceDialog(const Akonadi::Item &item)
941 {
942  IncidenceEditorNG::IncidenceDialog *dialog = mDialogManager->createDialog(item);
943  connect(dialog, SIGNAL(incidenceCreated(Akonadi::Item)), SLOT(handleIncidenceCreated(Akonadi::Item)));
944  return dialog;
945 }
946 
947 IncidenceEditorNG::IncidenceDialog *CalendarView::newEventEditor( const KCalCore::Event::Ptr &event )
948 {
949  Akonadi::Item item;
950  item.setPayload( event );
951  IncidenceEditorNG::IncidenceDialog *dialog = incidenceDialog( item );
952 
953  dialog->load( item );
954 
955  mDialogManager->connectTypeAhead(
956  dialog, qobject_cast<KOEventView*>( viewManager()->currentView() ) );
957 
958  return dialog;
959 }
960 
961 void CalendarView::newEvent()
962 {
963  newEvent( QDateTime(), QDateTime() );
964 }
965 
966 void CalendarView::newEvent( const QDate &dt )
967 {
968  QDateTime startDt( dt, CalendarSupport::KCalPrefs::instance()->mStartTime.time() );
969  QTime duration = CalendarSupport::KCalPrefs::instance()->defaultDuration().time();
970  QTime time = startDt.time();
971 
972  time = time.addSecs( duration.hour() * 3600 +
973  duration.minute() * 60 +
974  duration.second() );
975  QDateTime endDt( startDt );
976  endDt.setTime( time );
977  newEvent( startDt, endDt );
978 }
979 
980 void CalendarView::newEvent( const QDateTime &startDt )
981 {
982  newEvent( startDt, startDt );
983 }
984 
985 void CalendarView::newEvent( const QDateTime &startDtParam, const QDateTime &endDtParam,
986  bool allDay )
987 {
988  // Let the current view change the default start/end datetime
989  QDateTime startDt( startDtParam );
990  QDateTime endDt( endDtParam );
991 
992  // Adjust the start/end date times (i.e. replace invalid values by defaults,
993  // and let the view adjust the type.
994  dateTimesForNewEvent( startDt, endDt, allDay );
995 
996  IncidenceEditorNG::IncidenceDefaults defaults =
997  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
998  defaults.setStartDateTime( KDateTime( startDt ) );
999  defaults.setEndDateTime( KDateTime( endDt ) );
1000 
1001  KCalCore::Event::Ptr event( new Event );
1002  defaults.setDefaults( event );
1003  event->setAllDay( allDay );
1004 
1005  IncidenceEditorNG::IncidenceDialog *eventEditor = newEventEditor( event );
1006  Q_ASSERT( eventEditor );
1007 
1008  // Fallsback to the default collection defined in config
1009  eventEditor->selectCollection( defaultCollection( KCalCore::Event::eventMimeType() ) );
1010 }
1011 
1012 void CalendarView::newEvent( const QString &summary, const QString &description,
1013  const QStringList &attachments, const QStringList &attendees,
1014  const QStringList &attachmentMimetypes, bool inlineAttachment )
1015 {
1016  // Adjust the start/end date times (i.e. replace invalid values by defaults,
1017  // and let the view adjust the type.
1018  QDateTime startDt;
1019  QDateTime endDt;
1020  bool allDay = false;
1021  dateTimesForNewEvent( startDt, endDt, allDay );
1022 
1023  IncidenceEditorNG::IncidenceDefaults defaults =
1024  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1025  defaults.setStartDateTime( KDateTime( startDt ) );
1026  defaults.setEndDateTime( KDateTime( endDt ) );
1027  // if attach or attendee list is empty, these methods don't do anything, so
1028  // it's safe to call them in every case
1029  defaults.setAttachments( attachments, attachmentMimetypes, QStringList(), inlineAttachment );
1030  defaults.setAttendees( attendees );
1031 
1032  KCalCore::Event::Ptr event( new Event );
1033  defaults.setDefaults( event );
1034 
1035  event->setSummary( summary );
1036  event->setDescription( description );
1037  event->setAllDay( allDay );
1038  newEventEditor( event );
1039 }
1040 
1041 void CalendarView::newTodo( const QString &summary, const QString &description,
1042  const QStringList &attachments, const QStringList &attendees,
1043  const QStringList &attachmentMimetypes,
1044  bool inlineAttachment )
1045 {
1046  Akonadi::Collection defaultCol = defaultCollection( Todo::todoMimeType() );
1047 
1048  IncidenceEditorNG::IncidenceDialogFactory::createTodoEditor(
1049  summary, description, attachments,
1050  attendees, attachmentMimetypes,
1051  QStringList()/* attachment labels */,
1052  inlineAttachment, defaultCol,
1053  this/* parent */ );
1054 }
1055 
1056 void CalendarView::newTodo()
1057 {
1058  newTodo( Akonadi::Collection() );
1059 }
1060 
1061 void CalendarView::newTodo( const Akonadi::Collection &collection )
1062 {
1063  IncidenceEditorNG::IncidenceDefaults defaults =
1064  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1065 
1066  bool allDay = true;
1067  if ( mViewManager->currentView()->isEventView() ) {
1068  QDateTime startDt;
1069  QDateTime endDt;
1070  dateTimesForNewEvent( startDt, endDt, allDay );
1071 
1072  defaults.setStartDateTime( KDateTime( startDt ) );
1073  defaults.setEndDateTime( KDateTime( endDt ) );
1074  }
1075 
1076  KCalCore::Todo::Ptr todo( new Todo );
1077  defaults.setDefaults( todo );
1078  todo->setAllDay( allDay );
1079 
1080  Akonadi::Item item;
1081  item.setPayload( todo );
1082 
1083  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item, collection );
1084 
1085  dialog->load( item );
1086 }
1087 
1088 void CalendarView::newTodo( const QDate &date )
1089 {
1090  IncidenceEditorNG::IncidenceDefaults defaults =
1091  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1092  defaults.setEndDateTime( KDateTime( date, QTime::currentTime() ) );
1093 
1094  KCalCore::Todo::Ptr todo( new Todo );
1095  defaults.setDefaults( todo );
1096  todo->setAllDay( true );
1097 
1098  Akonadi::Item item;
1099  item.setPayload( todo );
1100 
1101  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item );
1102  dialog->load( item );
1103 }
1104 
1105 void CalendarView::newJournal()
1106 {
1107  newJournal( QString(), activeDate( true ) );
1108 }
1109 
1110 void CalendarView::newJournal( const QDate &date )
1111 {
1112  newJournal( QString(), date.isValid() ? date : activeDate( true ) );
1113 }
1114 
1115 void CalendarView::newJournal( const Akonadi::Collection &collection )
1116 {
1117  IncidenceEditorNG::IncidenceDefaults defaults =
1118  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1119 
1120  if ( mViewManager->currentView()->isEventView() ) {
1121  QDateTime startDt;
1122  QDateTime endDt;
1123  bool allDay = true;
1124  dateTimesForNewEvent( startDt, endDt, allDay );
1125 
1126  defaults.setStartDateTime( KDateTime( startDt ) );
1127  defaults.setEndDateTime( KDateTime( endDt ) );
1128  }
1129 
1130  Journal::Ptr journal( new Journal );
1131  defaults.setDefaults( journal );
1132 
1133  Akonadi::Item item;
1134  item.setPayload( journal );
1135  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item, collection );
1136  dialog->load( item );
1137 }
1138 
1139 void CalendarView::newJournal( const QString &text, const QDate &date )
1140 {
1141  IncidenceEditorNG::IncidenceDefaults defaults =
1142  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1143 
1144  Journal::Ptr journal( new Journal );
1145  defaults.setStartDateTime( KDateTime( date ) );
1146  defaults.setDefaults( journal );
1147 
1148  journal->setSummary( text );
1149 
1150  Akonadi::Item item;
1151  item.setPayload( journal );
1152 
1153  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item );
1154  dialog->load( item );
1155 }
1156 
1157 KOrg::BaseView *CalendarView::currentView() const
1158 {
1159  return mViewManager->currentView();
1160 }
1161 
1162 void CalendarView::configureCurrentView()
1163 {
1164  KOrg::BaseView *const view = currentView();
1165  if ( view && view->hasConfigurationDialog() ) {
1166  view->showConfigurationDialog( this );
1167  }
1168 }
1169 
1170 void CalendarView::newSubTodo()
1171 {
1172  const Akonadi::Item item = selectedTodo();
1173  if ( CalendarSupport::hasTodo( item ) ) {
1174  newSubTodo( item );
1175  }
1176 }
1177 
1178 void CalendarView::newSubTodo( const Akonadi::Collection &collection )
1179 {
1180  if ( !CalendarSupport::hasTodo( selectedTodo() ) ) {
1181  kWarning() << "CalendarSupport::hasTodo() is false";
1182  return;
1183  }
1184 
1185  IncidenceEditorNG::IncidenceDefaults defaults =
1186  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1187  defaults.setRelatedIncidence( CalendarSupport::incidence( selectedTodo() ) );
1188 
1189  KCalCore::Todo::Ptr todo( new Todo );
1190  defaults.setDefaults( todo );
1191 
1192  Akonadi::Item item;
1193  item.setPayload( todo );
1194 
1195  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item, collection );
1196  dialog->load( item );
1197 }
1198 
1199 void CalendarView::newSubTodo( const Akonadi::Item &parentTodo )
1200 {
1201  IncidenceEditorNG::IncidenceDefaults defaults =
1202  IncidenceEditorNG::IncidenceDefaults::minimalIncidenceDefaults();
1203  defaults.setRelatedIncidence( CalendarSupport::incidence( parentTodo ) );
1204 
1205  KCalCore::Todo::Ptr todo( new Todo );
1206  defaults.setDefaults( todo );
1207 
1208  Q_ASSERT( !todo->relatedTo().isEmpty() );
1209 
1210  Akonadi::Item item;
1211  item.setPayload( todo );
1212 
1213  // Don't use parentTodo.parentCollection() because that can be a search folder.
1214  Akonadi::Collection collection = mCalendar->collection( parentTodo.storageCollectionId() );
1215  IncidenceEditorNG::IncidenceDialog *dialog = createIncidenceEditor( item, collection );
1216  dialog->load( item );
1217 }
1218 
1219 void CalendarView::newFloatingEvent()
1220 {
1221  const QDate date = activeDate();
1222  newEvent( QDateTime( date, QTime( 12, 0, 0 ) ),
1223  QDateTime( date, QTime( 12, 0, 0 ) ), true );
1224 }
1225 
1226 bool CalendarView::addIncidence( const QString &ical )
1227 {
1228  KCalCore::ICalFormat format;
1229  format.setTimeSpec( mCalendar->timeSpec() );
1230  Incidence::Ptr incidence( format.fromString( ical ) );
1231  return addIncidence( incidence );
1232 }
1233 
1234 bool CalendarView::addIncidence( const Incidence::Ptr &incidence )
1235 {
1236  return incidence ? mChanger->createIncidence( incidence, Akonadi::Collection(), this ) != -1 : false;
1237 }
1238 
1239 void CalendarView::appointment_show()
1240 {
1241  const Akonadi::Item item = selectedIncidence();
1242  if ( CalendarSupport::hasIncidence( item ) ) {
1243  showIncidence( item );
1244  } else {
1245  KNotification::beep();
1246  }
1247 }
1248 
1249 void CalendarView::appointment_edit()
1250 {
1251  const Akonadi::Item item = selectedIncidence();
1252  if ( CalendarSupport::hasIncidence( item ) ) {
1253  editIncidence( item );
1254  } else {
1255  KNotification::beep();
1256  }
1257 }
1258 
1259 void CalendarView::appointment_delete()
1260 {
1261  const Akonadi::Item item = selectedIncidence();
1262  if ( CalendarSupport::hasIncidence( item ) ) {
1263  deleteIncidence( item );
1264  } else {
1265  KNotification::beep();
1266  }
1267 }
1268 
1269 void CalendarView::todo_unsub()
1270 {
1271  const Akonadi::Item aTodo = selectedTodo();
1272  if ( incidence_unsub( aTodo ) ) {
1273  updateView();
1274  }
1275 }
1276 
1277 bool CalendarView::incidence_unsub( const Akonadi::Item &item )
1278 {
1279  const Incidence::Ptr inc = CalendarSupport::incidence( item );
1280 
1281  if ( !inc || inc->relatedTo().isEmpty() ) {
1282  kDebug() << "Refusing to unparent this to-do" << inc;
1283  return false;
1284  }
1285 
1286  Incidence::Ptr oldInc( inc->clone() );
1287  inc->setRelatedTo( QString() );
1288  mChanger->modifyIncidence( item, oldInc, this );
1289 
1290  return true;
1291 }
1292 
1293 bool CalendarView::makeSubTodosIndependent( )
1294 {
1295  bool status = false;
1296  const Akonadi::Item aTodo = selectedTodo();
1297 
1298  if( makeChildrenIndependent( aTodo ) ) {
1299  updateView();
1300  status = true;
1301  }
1302  return status;
1303 }
1304 
1305 bool CalendarView::makeChildrenIndependent( const Akonadi::Item &item )
1306 {
1307  const Incidence::Ptr inc = CalendarSupport::incidence( item );
1308 
1309  Akonadi::Item::List subIncs = mCalendar->childItems( item.id() );
1310 
1311  if ( !inc || subIncs.isEmpty() ) {
1312  kDebug() << "Refusing to make children independent" << inc;
1313  return false;
1314  }
1315  startMultiModify ( i18n( "Make sub-to-dos independent" ) );
1316 
1317  foreach ( const Akonadi::Item &item, subIncs ) {
1318  incidence_unsub( item );
1319  }
1320 
1321  endMultiModify();
1322  return true;
1323 }
1324 
1325 bool CalendarView::deleteIncidence( Akonadi::Item::Id id, bool force )
1326 {
1327  Akonadi::Item item = mCalendar->item( id );
1328  if ( !CalendarSupport::hasIncidence( item ) ) {
1329  kError() << "CalendarView::deleteIncidence(): Item does not contain incidence.";
1330  return false;
1331  }
1332  return deleteIncidence( item, force );
1333 }
1334 
1335 void CalendarView::toggleAlarm( const Akonadi::Item &item )
1336 {
1337  const Incidence::Ptr incidence = CalendarSupport::incidence( item );
1338  if ( !incidence ) {
1339  kError() << "Null incidence";
1340  return;
1341  }
1342  Incidence::Ptr oldincidence( incidence->clone() );
1343 
1344  Alarm::List alarms = incidence->alarms();
1345  Alarm::List::ConstIterator it;
1346  for ( it = alarms.constBegin(); it != alarms.constEnd(); ++it ) {
1347  (*it)->toggleAlarm();
1348  }
1349  if ( alarms.isEmpty() ) {
1350  // Add an alarm if it didn't have one
1351  Alarm::Ptr alm = incidence->newAlarm();
1352  alm->setType( Alarm::Display );
1353  alm->setEnabled( true );
1354  int duration; // in secs
1355  switch( CalendarSupport::KCalPrefs::instance()->mReminderTimeUnits ) {
1356  default:
1357  case 0: // mins
1358  duration = CalendarSupport::KCalPrefs::instance()->mReminderTime * 60;
1359  break;
1360  case 1: // hours
1361  duration = CalendarSupport::KCalPrefs::instance()->mReminderTime * 60 * 60;
1362  break;
1363  case 2: // days
1364  duration = CalendarSupport::KCalPrefs::instance()->mReminderTime * 60 * 60 * 24;
1365  break;
1366  }
1367  if ( incidence->type() == Incidence::TypeEvent ) {
1368  alm->setStartOffset( KCalCore::Duration( -duration ) );
1369  } else {
1370  alm->setEndOffset( KCalCore::Duration( -duration ) );
1371  }
1372  }
1373  mChanger->startAtomicOperation( i18n( "Toggle Reminder" ) );
1374  mChanger->modifyIncidence( item, oldincidence, this );
1375  mChanger->endAtomicOperation();
1376 }
1377 
1378 void CalendarView::toggleTodoCompleted( const Akonadi::Item &todoItem )
1379 {
1380  const Incidence::Ptr incidence = CalendarSupport::incidence( todoItem );
1381 
1382  if ( !incidence ) {
1383  kError() << "Null incidence";
1384  return;
1385  }
1386  if ( incidence->type() != Incidence::TypeTodo ) {
1387  kDebug() << "called for a non-Todo incidence";
1388  return;
1389  }
1390 
1391  KCalCore::Todo::Ptr todo = CalendarSupport::todo( todoItem );
1392  Q_ASSERT( todo );
1393  KCalCore::Todo::Ptr oldtodo( todo->clone() );
1394 
1395  if ( todo->isCompleted() ) {
1396  todo->setPercentComplete( 0 );
1397  } else {
1398  todo->setCompleted( KDateTime::currentDateTime(
1399  CalendarSupport::KCalPrefs::instance()->timeSpec() ) );
1400  }
1401 
1402  mChanger->startAtomicOperation( i18n( "Toggle To-do Completed") );
1403  mChanger->modifyIncidence( todoItem, oldtodo, this );
1404  mChanger->endAtomicOperation();
1405 }
1406 
1407 void CalendarView::copyIncidenceToResource( const Akonadi::Item &item, const QString &resourceId )
1408 {
1409 #ifdef AKONADI_PORT_DISABLED
1410  if ( !incidence ) {
1411  kError() << "Null incidence";
1412  return;
1413  }
1414 
1415  KCalCore::CalendarResources *const resources = KOrg::StdCalendar::self();
1416  KCalCore::CalendarResourceManager *const manager = resources->resourceManager();
1417 
1418  // Find the resource the incidence should be copied to
1419  ResourceCalendar *newCal = 0;
1420  KCalCore::CalendarResourceManager::iterator it;
1421  for ( it = manager->begin(); it != manager->end(); ++it ) {
1422  ResourceCalendar *const resource = *it;
1423  if ( resource->identifier() == resourceId ) {
1424  newCal = resource;
1425  break;
1426  }
1427  }
1428  if ( !newCal ) {
1429  return;
1430  }
1431 
1432  // Clone a new Incidence from the selected Incidence and give it a new Uid.
1433  Incidence::Ptr newInc;
1434  if ( incidence->type() == Incidence::TypeEvent ) {
1435  KCalCore::Event::Ptr nEvent( static_cast<KCalCore::Event::Ptr >( incidence )->clone() );
1436  nEvent->setUid( KCalCore::CalFormat::createUniqueId() );
1437  newInc = nEvent;
1438  } else if ( incidence->type() == Incidence::TypeTodo ) {
1439  KCalCore::Todo::Ptr nTodo( static_cast<KCalCore::Todo::Ptr >( incidence )->clone() );
1440  nTodo->setUid( KCalCore::CalFormat::createUniqueId() );
1441  newInc = nTodo;
1442  } else if ( incidence->type() == Incidence::TypeJournal ) {
1443  KCalCore::Journal::Ptr nJournal( static_cast<KCalCore::Journal::Ptr >( incidence )->clone() );
1444  nJournal->setUid( KCalCore::CalFormat::createUniqueId() );
1445  newInc = nJournal;
1446  } else {
1447  kWarning() << "Trying to copy an incidence type that cannot be copied";
1448  return;
1449  }
1450 
1451  if ( resources->addIncidence( newInc, newCal ) ) {
1452  incidenceAddFinished( newInc, true );
1453  KMessageBox::information(
1454  this,
1455  i18nc( "@info",
1456  "\"%1\" was successfully copied to %2.",
1457  incidence->summary(),
1458  newCal->resourceName() ),
1459  i18nc( "@title:window", "Copying Succeeded" ),
1460  "CalendarIncidenceCopy" );
1461  } else {
1462  KMessageBox::error(
1463  this,
1464  i18nc( "@info",
1465  "Unable to copy the item \"%1\" to %2.",
1466  incidence->summary(),
1467  newCal->resourceName() ),
1468  i18nc( "@title:window", "Copying Failed" ) );
1469  }
1470 #else
1471  Q_UNUSED( resourceId );
1472  Q_UNUSED( item );
1473  kDebug() << "AKONADI PORT: Disabled code in " << Q_FUNC_INFO;
1474 #endif
1475 }
1476 
1477 void CalendarView::moveIncidenceToResource( const Akonadi::Item &item, const QString &resourceId )
1478 {
1479 #ifdef AKONADI_PORT_DISABLED
1480  if ( !incidence ) {
1481  kError() << "Null incidence";
1482  return;
1483  }
1484 
1485  KCalCore::CalendarResources *const resources = KOrg::StdCalendar::self();
1486  KCalCore::CalendarResourceManager *const manager = resources->resourceManager();
1487 
1488  // Find the resource the incidence should be moved to
1489  ResourceCalendar *newCal = 0;
1490  KCalCore::CalendarResourceManager::iterator it;
1491  for ( it = manager->begin(); it != manager->end(); ++it ) {
1492  ResourceCalendar *const resource = *it;
1493  if ( resource->identifier() == resourceId ) {
1494  newCal = resource;
1495  break;
1496  }
1497  }
1498  if ( !newCal ) {
1499  return;
1500  }
1501 
1502  // Clone a new Incidence from the selected Incidence and give it a new Uid.
1503  Incidence *newInc;
1504  if ( incidence->type() == Incidence::TypeEvent ) {
1505  KCalCore::Event::Ptr nEvent = static_cast<KCalCore::Event::Ptr >( incidence )->clone();
1506  nEvent->setUid( KCalCore::CalFormat::createUniqueId() );
1507  newInc = nEvent;
1508  } else if ( incidence->type() == Incidence::TypeTodo ) {
1509  KCalCore::Todo::Ptr nTodo = static_cast<KCalCore::Todo::Ptr >( incidence )->clone();
1510  nTodo->setUid( KCalCore::CalFormat::createUniqueId() );
1511  newInc = nTodo;
1512  } else if ( incidence->type() == Incidence::TypeJournal ) {
1513  KCalCore::Journal::Ptr nJournal = static_cast<KCalCore::Journal::Ptr >( incidence )->clone();
1514  nJournal->setUid( KCalCore::CalFormat::createUniqueId() );
1515  newInc = nJournal;
1516  } else {
1517  kWarning() << "Trying to move an incidence type that cannot be moved";
1518  return;
1519  }
1520 
1521  if ( resources->addIncidence( newInc, newCal ) ) {
1522  incidenceAddFinished( newInc, true );
1523  ResourceCalendar *const oldCal = resources->resource( incidence );
1524  if ( !oldCal || resources->deleteIncidence( incidence ) ) {
1525  KMessageBox::error(
1526  this,
1527  i18nc( "@info",
1528  "Unable to remove the item \"%1\" from %2. "
1529  "However, a copy of this item has been put into %3.",
1530  incidence->summary(),
1531  oldCal->resourceName(),
1532  newCal->resourceName() ),
1533  i18nc( "@title:window", "Moving Failed" ) );
1534  } else {
1535  incidenceDeleteFinished( incidence, true );
1536  KMessageBox::information(
1537  this,
1538  i18nc( "@info",
1539  "\"%1\" was successfully moved from %2 to %3.",
1540  incidence->summary(),
1541  oldCal->resourceName(),
1542  newCal->resourceName() ),
1543  i18nc( "@title:window", "Moving Succeeded" ),
1544  "CalendarIncidenceMove" );
1545  }
1546  } else {
1547  KMessageBox::error(
1548  this,
1549  i18nc( "@info",
1550  "Unable to add the item \"%1\" into %2. "
1551  "This item has not been moved.",
1552  incidence->summary(),
1553  newCal->resourceName() ),
1554  i18nc( "@title:window", "Moving Failed" ) );
1555  }
1556 #else
1557  Q_UNUSED( resourceId );
1558  Q_UNUSED( item );
1559  kDebug() << "AKONADI PORT: Disabled code in " << Q_FUNC_INFO;
1560 #endif
1561 }
1562 
1563 void CalendarView::dissociateOccurrences( const Akonadi::Item &item, const QDate &date )
1564 {
1565  const Incidence::Ptr incidence = CalendarSupport::incidence( item );
1566 
1567  if ( !incidence ) {
1568  kError() << "Null incidence";
1569  return;
1570  }
1571 
1572  KDateTime thisDateTime( date, CalendarSupport::KCalPrefs::instance()->timeSpec() );
1573  bool isFirstOccurrence = !incidence->recurrence()->getPreviousDateTime( thisDateTime ).isValid();
1574 
1575  int answer;
1576  bool doOnlyThis = false;
1577  bool doFuture = false;
1578 
1579  if ( isFirstOccurrence ) {
1580  answer = KMessageBox::questionYesNo(
1581  this,
1582  i18n( "Do you want to dissociate "
1583  "the occurrence on %1 "
1584  "from the recurrence?",
1585  KGlobal::locale()->formatDate( date ) ),
1586  i18n( "KOrganizer Confirmation" ),
1587  KGuiItem( i18n( "&Dissociate" ) ),
1588  KStandardGuiItem::cancel() );
1589 
1590  doOnlyThis = ( answer == KMessageBox::Yes );
1591  } else {
1592  answer = KMessageBox::questionYesNoCancel(
1593  this,
1594  i18n( "Do you want to dissociate "
1595  "the occurrence on %1 "
1596  "from the recurrence or also "
1597  "dissociate future ones?",
1598  KGlobal::locale()->formatDate( date ) ),
1599  i18n( "KOrganizer Confirmation" ),
1600  KGuiItem( i18n( "&Only Dissociate This One" ) ),
1601  KGuiItem( i18n( "&Also Dissociate Future Ones" ) ) );
1602 
1603  doOnlyThis = ( answer == KMessageBox::Yes );
1604  doFuture = ( answer == KMessageBox::No );
1605  }
1606 
1607  if ( doOnlyThis ) {
1608  dissociateOccurrence( item, date, false );
1609  } else if ( doFuture ) {
1610  dissociateOccurrence( item, date, true );
1611  }
1612 }
1613 void CalendarView::dissociateOccurrence( const Akonadi::Item &item, const QDate &date, bool thisAndFuture )
1614 {
1615  const Incidence::Ptr incidence = CalendarSupport::incidence( item );
1616 
1617  if ( thisAndFuture ) {
1618  startMultiModify( i18n( "Dissociate future occurrences" ) );
1619  } else {
1620  startMultiModify( i18n( "Dissociate occurrence" ) );
1621  }
1622  KDateTime occurrenceDate( incidence->dtStart() );
1623  occurrenceDate.setDate(date);
1624  kDebug() << "create exception: " << occurrenceDate;
1625  KCalCore::Incidence::Ptr newInc( KCalCore::Calendar::createException(
1626  incidence, occurrenceDate, thisAndFuture) );
1627  if ( newInc ) {
1628  mChanger->createIncidence( newInc, item.parentCollection(), this );
1629  } else {
1630  if ( thisAndFuture ) {
1631  KMessageBox::sorry(
1632  this,
1633  i18n( "Dissociating the future occurrences failed." ),
1634  i18n( "Dissociating Failed" ) );
1635  } else {
1636  KMessageBox::sorry(
1637  this,
1638  i18n( "Dissociating the occurrence failed." ),
1639  i18n( "Dissociating Failed" ) );
1640  }
1641  }
1642  endMultiModify();
1643 }
1644 
1645 void CalendarView::schedule_publish( const Akonadi::Item &item )
1646 {
1647  Akonadi::Item selectedItem = item;
1648  if ( !item.hasPayload<KCalCore::Incidence::Ptr>() ) {
1649  selectedItem = selectedIncidence();
1650  }
1651 
1652  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( selectedItem );
1653  if ( incidence )
1654  mITIPHandler->publishInformation( incidence, this );
1655 }
1656 
1657 void CalendarView::schedule_request( const Akonadi::Item &incidence )
1658 {
1659  schedule( iTIPRequest, incidence );
1660 }
1661 
1662 void CalendarView::schedule_refresh( const Akonadi::Item &incidence )
1663 {
1664  schedule( iTIPRefresh, incidence );
1665 }
1666 
1667 void CalendarView::schedule_cancel( const Akonadi::Item &incidence )
1668 {
1669  schedule( iTIPCancel, incidence );
1670 }
1671 
1672 void CalendarView::schedule_add( const Akonadi::Item &incidence )
1673 {
1674  schedule( iTIPAdd, incidence );
1675 }
1676 
1677 void CalendarView::schedule_reply( const Akonadi::Item &incidence )
1678 {
1679  schedule( iTIPReply, incidence );
1680 }
1681 
1682 void CalendarView::schedule_counter( const Akonadi::Item &incidence )
1683 {
1684  schedule( iTIPCounter, incidence );
1685 }
1686 
1687 void CalendarView::schedule_declinecounter( const Akonadi::Item &incidence )
1688 {
1689  schedule( iTIPDeclineCounter, incidence );
1690 }
1691 
1692 void CalendarView::schedule_forward( const Akonadi::Item &item )
1693 {
1694  Akonadi::Item selectedItem = item;
1695  if ( !item.hasPayload<KCalCore::Incidence::Ptr>() ) {
1696  selectedItem = selectedIncidence();
1697  }
1698 
1699  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( selectedItem );
1700 
1701  if ( incidence )
1702  mITIPHandler->sendAsICalendar( incidence, this );
1703 }
1704 
1705 void CalendarView::mailFreeBusy( int daysToPublish )
1706 {
1707  Akonadi::FreeBusyManager::self()->mailFreeBusy( daysToPublish, this );
1708 }
1709 
1710 void CalendarView::uploadFreeBusy()
1711 {
1712  Akonadi::FreeBusyManager::self()->publishFreeBusy( this );
1713 }
1714 
1715 void CalendarView::schedule( KCalCore::iTIPMethod method, const Akonadi::Item &item )
1716 {
1717  Akonadi::Item selectedItem = item;
1718  if ( !item.hasPayload<KCalCore::Incidence::Ptr>() ) {
1719  selectedItem = selectedIncidence();
1720  }
1721 
1722  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( selectedItem );
1723 
1724  if ( incidence )
1725  mITIPHandler->sendiTIPMessage( method, incidence, this );
1726 }
1727 
1728 void CalendarView::openAddressbook()
1729 {
1730  KRun::runCommand( QLatin1String("kaddressbook"), topLevelWidget() );
1731 }
1732 
1733 bool CalendarView::isReadOnly() const
1734 {
1735  return mReadOnly;
1736 }
1737 
1738 void CalendarView::setReadOnly( bool readOnly )
1739 {
1740  if ( mReadOnly != readOnly ) {
1741  mReadOnly = readOnly;
1742  emit readOnlyChanged( mReadOnly );
1743  }
1744 }
1745 
1746 void CalendarView::print()
1747 {
1748  createPrinter();
1749 
1750  KOrg::BaseView *currentView = mViewManager->currentView();
1751 
1752  CalPrinter::PrintType printType = CalPrinter::Month;
1753 
1754  Incidence::List selectedIncidences;
1755  if ( currentView ) {
1756  printType = currentView->printType();
1757  Akonadi::Item::List selectedViewIncidences = currentView->selectedIncidences();
1758  foreach ( const Akonadi::Item &item, selectedViewIncidences ) {
1759  if ( item.hasPayload<KCalCore::Incidence::Ptr>() ) {
1760  selectedIncidences.append( item.payload<KCalCore::Incidence::Ptr>() );
1761  }
1762  }
1763  }
1764 
1765  DateList tmpDateList = mDateNavigator->selectedDates();
1766  mCalPrinter->print( printType, tmpDateList.first(), tmpDateList.last(), selectedIncidences );
1767 }
1768 
1769 void CalendarView::printPreview()
1770 {
1771  createPrinter();
1772 
1773  KOrg::BaseView *currentView = mViewManager->currentView();
1774 
1775  CalPrinter::PrintType printType = CalPrinter::Month;
1776 
1777  Incidence::List selectedIncidences;
1778  if ( currentView ) {
1779  printType = currentView->printType();
1780  Akonadi::Item::List selectedViewIncidences = currentView->selectedIncidences();
1781  foreach ( const Akonadi::Item &item, selectedViewIncidences ) {
1782  if ( item.hasPayload<KCalCore::Incidence::Ptr>() ) {
1783  selectedIncidences.append( item.payload<KCalCore::Incidence::Ptr>() );
1784  }
1785  }
1786  }
1787 
1788  DateList tmpDateList = mDateNavigator->selectedDates();
1789  mCalPrinter->print( printType, tmpDateList.first(), tmpDateList.last(),
1790  selectedIncidences, true );
1791 }
1792 
1793 void CalendarView::exportWeb()
1794 {
1795  KOrg::HTMLExportSettings *settings = new KOrg::HTMLExportSettings( QLatin1String("KOrganizer") );
1796  Q_ASSERT(settings);
1797  // Manually read in the config, because parameterized kconfigxt objects don't
1798  // seem to load the config theirselves
1799  settings->readConfig();
1800  ExportWebDialog *dlg = new ExportWebDialog( settings, this );
1801  connect( dlg, SIGNAL(exportHTML(KOrg::HTMLExportSettings*)),
1802  this, SIGNAL(exportHTML(KOrg::HTMLExportSettings*)) );
1803  dlg->show();
1804 }
1805 
1806 void CalendarView::exportICalendar()
1807 {
1808  QString filename =
1809  KFileDialog::getSaveFileName( KUrl( QLatin1String("icalout.ics") ), i18n( "*.ics|iCalendars" ), this );
1810  if ( !filename.isEmpty() ) {
1811  // Force correct extension
1812  if ( filename.right( 4 ) != QLatin1String(".ics") ) {
1813  filename += QLatin1String(".ics");
1814  }
1815 
1816  if ( QFile( filename ).exists() ) {
1817  if ( KMessageBox::No == KMessageBox::warningYesNo(
1818  this,
1819  i18n( "Do you want to overwrite %1?", filename ) ) ) {
1820  return;
1821  }
1822  }
1823  KCalCore::ICalFormat *format = new KCalCore::ICalFormat;
1824 
1825  KCalCore::FileStorage storage( mCalendar, filename, format );
1826  if ( !storage.save() ) {
1827  QString errmess;
1828  if ( format->exception() ) {
1829  errmess = KCalUtils::Stringify::errorMessage( *format->exception() );
1830  } else {
1831  errmess = i18nc( "save failure cause unknown", "Reason unknown" );
1832  }
1833  KMessageBox::error(
1834  this,
1835  i18nc( "@info",
1836  "Cannot write iCalendar file %1. %2",
1837  filename, errmess ) );
1838  }
1839  }
1840 }
1841 
1842 void CalendarView::exportVCalendar()
1843 {
1844  if ( !mCalendar->journals().isEmpty() ) {
1845  int result = KMessageBox::warningContinueCancel(
1846  this,
1847  i18n( "The journal entries cannot be exported to a vCalendar file." ),
1848  i18n( "Data Loss Warning" ),
1849  KGuiItem( i18n( "Proceed" ) ),
1850  KStandardGuiItem::cancel(),
1851  QLatin1String( "dontaskVCalExport" ),
1852  KMessageBox::Notify );
1853  if ( result != KMessageBox::Continue ) {
1854  return;
1855  }
1856  }
1857 
1858  QString filename = KFileDialog::getSaveFileName( KUrl( QLatin1String("vcalout.vcs") ),
1859  i18n( "*.vcs|vCalendars" ), this );
1860  if ( !filename.isEmpty() ) {
1861  // Force correct extension
1862  if ( filename.right( 4 ) != QLatin1String(".vcs") ) {
1863  filename += QLatin1String(".vcs");
1864  }
1865  if ( QFile( filename ).exists() ) {
1866  if ( KMessageBox::No == KMessageBox::warningYesNo(
1867  this,
1868  i18n( "Do you want to overwrite %1?", filename ) ) ) {
1869  return;
1870  }
1871  }
1872  KCalCore::VCalFormat *format = new KCalCore::VCalFormat;
1873 
1874  KCalCore::FileStorage storage( mCalendar, filename, format );
1875  if ( !storage.save() ) {
1876  QString errmess;
1877  if ( format->exception() ) {
1878  errmess = KCalUtils::Stringify::errorMessage( *format->exception() );
1879  } else {
1880  errmess = i18nc( "save failure cause unknown", "Reason unknown" );
1881  }
1882  KMessageBox::error(
1883  this,
1884  i18nc( "@info",
1885  "Cannot write vCalendar file %1. %2",
1886  filename, errmess ) );
1887  }
1888  }
1889 }
1890 
1891 void CalendarView::eventUpdated( const Akonadi::Item & )
1892 {
1893  // Don't call updateView here. The code, which has caused the update of the
1894  // event is responsible for updating the view.
1895 // updateView();
1896 }
1897 
1898 void CalendarView::adaptNavigationUnits()
1899 {
1900  if ( mViewManager->currentView()->isEventView() ) {
1901  int days = mViewManager->currentView()->currentDateCount();
1902  if ( days == 1 ) {
1903  emit changeNavStringPrev( i18n( "&Previous Day" ) );
1904  emit changeNavStringNext( i18n( "&Next Day" ) );
1905  } else {
1906  emit changeNavStringPrev( i18n( "&Previous Week" ) );
1907  emit changeNavStringNext( i18n( "&Next Week" ) );
1908  }
1909  }
1910 }
1911 
1912 void CalendarView::processMainViewSelection( const Akonadi::Item &item, const QDate &date )
1913 {
1914  if ( CalendarSupport::hasIncidence( item ) ) {
1915  mTodoList->clearSelection();
1916  }
1917  processIncidenceSelection( item, date );
1918 }
1919 
1920 void CalendarView::processTodoListSelection( const Akonadi::Item &item, const QDate &date )
1921 {
1922  if ( CalendarSupport::hasIncidence( item ) && mViewManager->currentView() ) {
1923  mViewManager->currentView()->clearSelection();
1924  }
1925  processIncidenceSelection( item, date );
1926 }
1927 
1928 void CalendarView::processIncidenceSelection( const Akonadi::Item &item, const QDate &date )
1929 {
1930  Incidence::Ptr incidence = CalendarSupport::incidence( item );
1931  if ( item != mSelectedIncidence ) {
1932  // This signal also must be emitted if incidence is 0
1933  emit incidenceSelected( item, date );
1934  }
1935 
1936  if ( !incidence ) {
1937  mSelectedIncidence = item;
1938  return;
1939  }
1940  if ( item == mSelectedIncidence ) {
1941  if ( !incidence->recurs() || mSaveDate == date ) {
1942  return;
1943  }
1944  }
1945 
1946  mSelectedIncidence = item;
1947  mSaveDate = date;
1948 
1949  bool todo = false;
1950  bool subtodo = false;
1951 
1952  const bool organizerEvents =
1953  CalendarSupport::KCalPrefs::instance()->thatIsMe( incidence->organizer()->email() );
1954  const bool groupEvents = incidence->attendeeByMails( CalendarSupport::KCalPrefs::instance()->allEmails() );
1955 
1956  if ( incidence->type() == Incidence::TypeTodo ) {
1957  todo = true;
1958  subtodo = ( incidence->relatedTo() != QString() );
1959  }
1960  emit todoSelected( todo );
1961  emit subtodoSelected( subtodo );
1962  emit organizerEventsSelected( organizerEvents );
1963  emit groupEventsSelected( groupEvents );
1964 }
1965 
1966 void CalendarView::checkClipboard()
1967 {
1968  emit pasteEnabled( mCalendarClipboard->pasteAvailable() );
1969 }
1970 
1971 void CalendarView::showDates( const DateList &selectedDates, const QDate &preferredMonth )
1972 {
1973  mDateNavigatorContainer->selectDates( selectedDates, preferredMonth );
1974  mNavigatorBar->selectDates( selectedDates );
1975 
1976  if ( mViewManager->currentView() ) {
1977  updateView( selectedDates.first(), selectedDates.last(), preferredMonth, false );
1978  } else {
1979  mViewManager->showAgendaView();
1980  }
1981 }
1982 
1983 void CalendarView::editFilters()
1984 {
1985  mDialogManager->showFilterEditDialog( &mFilters );
1986 }
1987 
1988 void CalendarView::updateFilter()
1989 {
1990  QStringList filters;
1991 
1992  int pos = mFilters.indexOf( mCurrentFilter );
1993  if ( pos < 0 ) {
1994  mCurrentFilter = 0;
1995  }
1996 
1997  filters << i18n( "No filter" );
1998  foreach ( KCalCore::CalFilter *filter, mFilters ) {
1999  if ( filter ) {
2000  filters << filter->name();
2001  }
2002  }
2003 
2004  // account for the additional "No filter" at the beginning! if the
2005  // filter is not in the list, pos == -1...
2006  emit filtersUpdated( filters, pos + 1 );
2007 
2008  mCalendar->setFilter( mCurrentFilter );
2009 }
2010 
2011 void CalendarView::filterActivated( int filterNo )
2012 {
2013  KCalCore::CalFilter *newFilter = 0;
2014  if ( filterNo > 0 && filterNo <= int( mFilters.count() ) ) {
2015  newFilter = mFilters.at( filterNo - 1 );
2016  }
2017  if ( newFilter != mCurrentFilter ) {
2018  mCurrentFilter = newFilter;
2019  mCalendar->setFilter( mCurrentFilter );
2020  mViewManager->addChange( EventViews::EventView::FilterChanged );
2021  updateView();
2022  }
2023  emit filterChanged();
2024 }
2025 
2026 bool CalendarView::isFiltered() const
2027 {
2028  return mCurrentFilter != 0;
2029 }
2030 
2031 QString CalendarView::currentFilterName() const
2032 {
2033  if ( mCurrentFilter ) {
2034  return mCurrentFilter->name();
2035  } else {
2036  return i18n( "No filter" );
2037  }
2038 }
2039 
2040 void CalendarView::takeOverEvent()
2041 {
2042  const Akonadi::Item item = currentSelection();
2043  Incidence::Ptr incidence = CalendarSupport::incidence( item );
2044 
2045  if ( incidence ) {
2046  return;
2047  }
2048 
2049  incidence->setOrganizer(
2050  Person::Ptr( new Person( CalendarSupport::KCalPrefs::instance()->fullName(),
2051  CalendarSupport::KCalPrefs::instance()->email() ) ) );
2052  incidence->recreate();
2053  incidence->setReadOnly( false );
2054 
2055  //PENDING(AKONADI_PORT) call mChanger?
2056 
2057  updateView();
2058 }
2059 
2060 void CalendarView::showIntro()
2061 {
2062  kDebug() << "To be implemented.";
2063 }
2064 
2065 void CalendarView::showDateNavigator( bool show )
2066 {
2067  if ( show ) {
2068  mDateNavigatorContainer->show();
2069  mDateNavigatorContainer->updateView();
2070  } else {
2071  mDateNavigatorContainer->hide();
2072  }
2073 }
2074 
2075 void CalendarView::showTodoView( bool show )
2076 {
2077  if ( show ) {
2078  mTodoList->show();
2079  mTodoList->updateView();
2080  } else {
2081  mTodoList->hide();
2082  }
2083 }
2084 
2085 void CalendarView::showEventViewer( bool show )
2086 {
2087  if ( show ) {
2088  mEventViewerBox->show();
2089  } else {
2090  mEventViewerBox->hide();
2091  }
2092 }
2093 
2094 void CalendarView::addView( KOrg::BaseView *view )
2095 {
2096  mViewManager->addView( view );
2097 }
2098 
2099 void CalendarView::showView( KOrg::BaseView *view )
2100 {
2101  mViewManager->showView( view );
2102 }
2103 
2104 void CalendarView::addExtension( CalendarViewExtension::Factory *factory )
2105 {
2106  CalendarViewExtension *extension = factory->create( mLeftSplitter );
2107  mExtensions.append( extension );
2108  if ( !mETMCollectionView ) {
2109  mETMCollectionView = qobject_cast<AkonadiCollectionView*>( extension );
2110  }
2111 }
2112 
2113 void CalendarView::showLeftFrame( bool show )
2114 {
2115  if ( show ) {
2116  mMainSplitterSizes.clear();
2117  mLeftFrame->show();
2118  emit calendarViewExpanded( false );
2119  } else {
2120  // mPanner splitter sizes are useless if mLeftFrame is hidden, so remember them beforehand.
2121  if ( mMainSplitterSizes.isEmpty() ) {
2122  mMainSplitterSizes = mPanner->sizes();
2123  }
2124 
2125  mLeftFrame->hide();
2126  emit calendarViewExpanded( true );
2127  }
2128 }
2129 
2130 Akonadi::Item CalendarView::selectedTodo()
2131 {
2132  const Akonadi::Item item = currentSelection();
2133  if ( const KCalCore::Todo::Ptr t = CalendarSupport::todo( item ) ) {
2134  return item;
2135  }
2136 
2137  Akonadi::Item incidence;
2138 
2139  const Akonadi::Item::List selectedIncidences = mTodoList->selectedIncidences();
2140  if ( !selectedIncidences.isEmpty() ) {
2141  incidence = selectedIncidences.first();
2142  }
2143  if ( const KCalCore::Todo::Ptr t = CalendarSupport::todo( item ) ) {
2144  return item;
2145  }
2146  return Akonadi::Item();
2147 }
2148 
2149 void CalendarView::dialogClosing( const Akonadi::Item & )
2150 {
2151 }
2152 
2153 Akonadi::Item CalendarView::currentSelection()
2154 {
2155  return mViewManager->currentSelection();
2156 }
2157 
2158 Akonadi::Item CalendarView::selectedIncidence()
2159 {
2160  Akonadi::Item item = currentSelection();
2161  if ( !item.isValid() ) {
2162  Akonadi::Item::List selectedIncidences = mTodoList->selectedIncidences();
2163  if ( !selectedIncidences.isEmpty() ) {
2164  item = selectedIncidences.first();
2165  }
2166  }
2167  return item;
2168 }
2169 
2170 void CalendarView::showIncidence()
2171 {
2172  showIncidence( selectedIncidence() );
2173 }
2174 
2175 void CalendarView::editIncidence()
2176 {
2177  editIncidence( selectedIncidence() );
2178 }
2179 
2180 bool CalendarView::editIncidence( Akonadi::Item::Id id )
2181 {
2182  Akonadi::Item item = mCalendar->item( id );
2183  return editIncidence( item );
2184 }
2185 
2186 bool CalendarView::showIncidence( Akonadi::Item::Id id )
2187 {
2188  Akonadi::Item item = mCalendar->item( id );
2189  if ( !CalendarSupport::hasIncidence( item ) ) {
2190  return false;
2191  }
2192  showIncidence( item );
2193  return true;
2194 }
2195 
2196 bool CalendarView::showIncidenceContext( Akonadi::Item::Id id )
2197 {
2198  Akonadi::Item item = mCalendar->item( id );
2199  if ( !CalendarSupport::hasIncidence( item ) ) {
2200  return false;
2201  }
2202  showIncidenceContext( item );
2203  return true;
2204 }
2205 
2206 void CalendarView::deleteIncidence()
2207 {
2208  deleteIncidence( selectedIncidence() );
2209 }
2210 
2211 void CalendarView::cutIncidence( const Akonadi::Item &incidence )
2212 {
2213  Q_UNUSED( incidence );
2214  edit_cut();
2215 }
2216 
2217 void CalendarView::copyIncidence( const Akonadi::Item &incidence )
2218 {
2219  Q_UNUSED( incidence );
2220  edit_copy();
2221 }
2222 
2223 void CalendarView::pasteIncidence()
2224 {
2225  edit_paste();
2226 }
2227 
2228 void CalendarView::showIncidence( const Akonadi::Item &item )
2229 {
2230  KOEventViewerDialog *eventViewer = new KOEventViewerDialog( mCalendar.data(), this );
2231  eventViewer->setIncidence( item, QDate() );
2232  // Disable the Edit button for read-only Incidences.
2233  if ( !mCalendar->hasRight( item, Akonadi::Collection::CanChangeItem ) ) {
2234  eventViewer->enableButton( KDialog::User1, false );
2235  }
2236 
2237  eventViewer->show();
2238 }
2239 
2240 void CalendarView::showIncidenceContext( const Akonadi::Item &item )
2241 {
2242  Incidence::Ptr incidence = CalendarSupport::incidence( item );
2243  if ( CalendarSupport::hasEvent( item ) ) {
2244  if ( !viewManager()->currentView()->inherits( "KOEventView" ) ) {
2245  viewManager()->showAgendaView();
2246  }
2247  // just select the appropriate date
2248  mDateNavigator->selectWeek(
2249  incidence->dtStart().toTimeSpec(
2250  CalendarSupport::KCalPrefs::instance()->timeSpec() ).date() );
2251  return;
2252  } else if ( CalendarSupport::hasJournal( item ) ) {
2253  if ( !viewManager()->currentView()->inherits( "KOJournalView" ) ) {
2254  viewManager()->showJournalView();
2255  }
2256  } else if ( CalendarSupport::hasTodo( item ) ) {
2257  if ( !viewManager()->currentView()->inherits( "KOTodoView" ) ) {
2258  viewManager()->showTodoView();
2259  }
2260  }
2261  Akonadi::Item::List list;
2262  list.append( item );
2263  viewManager()->currentView()->showIncidences( list, QDate() );
2264 }
2265 
2266 bool CalendarView::editIncidence( const Akonadi::Item &item, bool isCounter )
2267 {
2268  Q_UNUSED( isCounter );
2269  Incidence::Ptr incidence = CalendarSupport::incidence( item );
2270  if ( !incidence ) {
2271  kError() << "Null incidence";
2272  KNotification::beep();
2273  return false;
2274  }
2275 
2276  if ( !mCalendar->hasRight( item, Akonadi::Collection::CanChangeItem ) ) {
2277  showIncidence( item );
2278  return true;
2279  }
2280 
2281 
2282  IncidenceEditorNG::IncidenceDialog *dialog = incidenceDialog( item );
2283 
2284  // connectIncidenceEditor( dialog ); // TODO: This as well
2285  dialog->load( item, activeIncidenceDate() ); // Show the dialog as soon as it loads the item.
2286 
2287  return true;
2288 }
2289 
2290 void CalendarView::deleteSubTodosIncidence ( const Akonadi::Item &todoItem )
2291 {
2292  const KCalCore::Todo::Ptr todo = CalendarSupport::todo( todoItem );
2293  if ( !todo ) {
2294  return;
2295  }
2296  Akonadi::Item::List subTodos = mCalendar->childItems( todoItem.id() );
2297  foreach ( const Akonadi::Item &item, subTodos ) {
2298  if ( CalendarSupport::hasTodo( item ) ) {
2299  deleteSubTodosIncidence ( item );
2300  }
2301  }
2302 
2303  if ( !mChanger->deletedRecently( todoItem.id() ) ) {
2304  mChanger->deleteIncidence( todoItem, this );
2305  }
2306 }
2307 
2308 void CalendarView::deleteTodoIncidence ( const Akonadi::Item &todoItem, bool force )
2309 {
2310  const KCalCore::Todo::Ptr todo = CalendarSupport::todo( todoItem );
2311  if ( !todo ) {
2312  return ;
2313  }
2314 
2315  // it a simple todo, ask and delete it.
2316  if ( mCalendar->childItems( todoItem.id() ).isEmpty() ) {
2317  bool doDelete = true;
2318  if ( !force && KOPrefs::instance()->mConfirm ) {
2319  doDelete = ( msgItemDelete( todoItem ) == KMessageBox::Continue );
2320  }
2321  if ( doDelete && !mChanger->deletedRecently( todoItem.id() ) ) {
2322  mChanger->deleteIncidence( todoItem, this );
2323  }
2324  return;
2325  }
2326 
2327  /* Ok, this to-do has sub-to-dos, ask what to do */
2328  int km = KMessageBox::No;
2329  if ( !force ) {
2330  km = KMessageBox::questionYesNoCancel(
2331  this,
2332  i18n( "The item \"%1\" has sub-to-dos. "
2333  "Do you want to delete just this item and "
2334  "make all its sub-to-dos independent, or "
2335  "delete the to-do with all its sub-to-dos?",
2336  todo->summary() ),
2337  i18n( "KOrganizer Confirmation" ),
2338  KGuiItem( i18n( "Delete Only This" ) ),
2339  KGuiItem( i18n( "Delete All" ) ) );
2340  }
2341  // Delete only the father
2342  if ( km == KMessageBox::Yes ) {
2343  startMultiModify( i18n( "Delete parent to-do" ) );
2344  makeChildrenIndependent( todoItem );
2345  if ( !mChanger->deletedRecently( todoItem.id() ) ) {
2346  mChanger->deleteIncidence( todoItem, this );
2347  }
2348  } else if ( km == KMessageBox::No ) {
2349  startMultiModify( i18n( "Delete parent to-do and sub-to-dos" ) );
2350  // Delete all
2351  // we have to hide the delete confirmation for each itemDate
2352  deleteSubTodosIncidence ( todoItem );
2353  }
2354  endMultiModify();
2355 }
2356 
2357 bool CalendarView::deleteIncidence( const Akonadi::Item &item, bool force )
2358 {
2359  Incidence::Ptr incidence = CalendarSupport::incidence( item );
2360  if ( !incidence ) {
2361  if ( !force ) {
2362  kError() << "Null incidence";
2363  KNotification::beep();
2364  }
2365  kError() << "CalendarView::deleteIncidence(): Unable do delete, incidence is null.";
2366  return false;
2367  }
2368 
2369  if ( mChanger->deletedRecently( item.id() ) ) {
2370  // it was deleted already but the etm wasn't notified yet
2371  kWarning() << "CalendarView::deleteIncidence(): item with id" << item.id()
2372  << "was deleted recently, skipping";
2373  return true;
2374  }
2375 
2376  if ( !mCalendar->hasRight( item, Akonadi::Collection::CanDeleteItem ) ) {
2377  if ( !force ) {
2378  KMessageBox::information(
2379  this,
2380  i18n( "The item \"%1\" is marked read-only "
2381  "and cannot be deleted; it probably "
2382  "belongs to a read-only calendar.",
2383  incidence->summary() ),
2384  i18n( "Removing not possible" ),
2385  QLatin1String("deleteReadOnlyIncidence") );
2386  }
2387  kWarning() << "CalendarView::deleteIncidence(): No rights to delete item";
2388  return false;
2389  }
2390 
2391  //If it is a todo, there are specific delete function
2392 
2393  if ( incidence && incidence->type() == Incidence::TypeTodo ) {
2394  deleteTodoIncidence( item, force );
2395  return true;
2396  }
2397 
2398  if ( incidence->recurs() ) {
2399  QDate itemDate = mViewManager->currentSelectionDate();
2400  int km = KMessageBox::Ok;
2401  if ( !force ) {
2402  if ( !itemDate.isValid() ) {
2403  kDebug() << "Date Not Valid";
2404  km = KMessageBox::warningContinueCancel(
2405  this,
2406  i18n( "The calendar item \"%1\" recurs over multiple dates; "
2407  "are you sure you want to delete it "
2408  "and all its recurrences?", incidence->summary() ),
2409  i18n( "KOrganizer Confirmation" ),
2410  KGuiItem( i18n( "Delete All" ) ) );
2411  } else {
2412  KDateTime itemDateTime( itemDate, CalendarSupport::KCalPrefs::instance()->timeSpec() );
2413  bool isFirst = !incidence->recurrence()->getPreviousDateTime( itemDateTime ).isValid();
2414  bool isLast = !incidence->recurrence()->getNextDateTime( itemDateTime ).isValid();
2415 
2416  QString message;
2417  KGuiItem itemFuture( i18n( "Also Delete &Future" ) );
2418 
2419  if ( !isFirst && !isLast ) {
2420  itemFuture.setEnabled( true );
2421  message = i18n( "The calendar item \"%1\" recurs over multiple dates. "
2422  "Do you want to delete only the current one on %2, also "
2423  "future occurrences, or all its occurrences?",
2424  incidence->summary(),
2425  KGlobal::locale()->formatDate( itemDate ) );
2426  } else {
2427  itemFuture.setEnabled( false );
2428  message = i18n( "The calendar item \"%1\" recurs over multiple dates. "
2429  "Do you want to delete only the current one on %2 "
2430  "or all its occurrences?",
2431  incidence->summary(),
2432  KGlobal::locale()->formatDate( itemDate ) );
2433  }
2434 
2435  if ( !( isFirst && isLast ) ) {
2436  km = PIMMessageBox::fourBtnMsgBox(
2437  this,
2438  QMessageBox::Warning,
2439  message,
2440  i18n( "KOrganizer Confirmation" ),
2441  KGuiItem ( i18n( "Delete C&urrent" ) ),
2442  itemFuture,
2443  KGuiItem( i18n( "Delete &All" ) ) );
2444  } else {
2445  km = msgItemDelete( item );
2446  }
2447  }
2448  }
2449  Incidence::Ptr oldIncidence( incidence->clone() );
2450  switch( km ) {
2451  case KMessageBox::Ok: // Continue // all
2452  case KMessageBox::Continue:
2453  mChanger->deleteIncidence( item, this );
2454  break;
2455 
2456  case KMessageBox::Yes: // just this one
2457  incidence->recurrence()->addExDate( itemDate );
2458  mChanger->modifyIncidence( item, oldIncidence, this );
2459 
2460  break;
2461  case KMessageBox::No: // all future items
2462  Recurrence *recur = incidence->recurrence();
2463  recur->setEndDate( itemDate.addDays( -1 ) );
2464  mChanger->modifyIncidence( item, oldIncidence, this );
2465  break;
2466  }
2467  } else {
2468  bool doDelete = true;
2469  if ( !force && KOPrefs::instance()->mConfirm ) {
2470  doDelete = ( msgItemDelete( item ) == KMessageBox::Continue );
2471  }
2472  if ( doDelete ) {
2473  mChanger->deleteIncidence( item, this );
2474  processIncidenceSelection( Akonadi::Item(), QDate() );
2475  }
2476  }
2477  return true;
2478 }
2479 
2480 
2481 void CalendarView::purgeCompleted()
2482 {
2483  if ( checkedCollections().isEmpty() ) {
2484  showMessage( i18n( "All calendars are unchecked in the Calendar Manager. No to-do was purged." ), KMessageWidget::Warning );
2485  return;
2486  }
2487 
2488  if ( mCalendar->rawTodos().isEmpty() ) {
2489  showMessage( i18n( "There are no completed to-dos to purge." ), KMessageWidget::Information );
2490  return;
2491  }
2492 
2493  int result = KMessageBox::warningContinueCancel(
2494  this,
2495  i18n( "Delete all completed to-dos from checked calendars?" ),
2496  i18n( "Purge To-dos" ),
2497  KGuiItem( i18n( "Purge" ) ) );
2498 
2499  if ( result == KMessageBox::Continue ) {
2500  mTodoPurger->purgeCompletedTodos();
2501  }
2502 }
2503 
2504 void CalendarView::warningChangeFailed( const Akonadi::Item &item )
2505 {
2506  Incidence::Ptr incidence = CalendarSupport::incidence( item );
2507  if ( incidence ) {
2508  KMessageBox::sorry(
2509  this,
2510  i18nc( "@info",
2511  "Unable to edit \"%1\" because it is locked by another process.",
2512  incidence->summary() ) );
2513  }
2514 }
2515 
2516 void CalendarView::showErrorMessage( const QString &msg )
2517 {
2518  KMessageBox::error( this, msg );
2519 }
2520 
2521 void CalendarView::updateCategories()
2522 {
2523  QStringList allCats( CalendarSupport::categories( mCalendar->rawIncidences() ) );
2524  allCats.sort();
2525 
2526  CalendarSupport::CategoryConfig cc( KOPrefs::instance() );
2527 
2528  QStringList categories( cc.customCategories() );
2529  for ( QStringList::ConstIterator si = allCats.constBegin(); si != allCats.constEnd(); ++si ) {
2530  if ( !categories.contains( *si ) ) {
2531  categories.append( *si );
2532  }
2533  }
2534  cc.setCustomCategories( categories );
2535  cc.writeConfig();
2536  // Make the category editor update the list!
2537  emit categoriesChanged();
2538 }
2539 
2540 void CalendarView::addIncidenceOn( const Akonadi::Item &itemadd, const QDate &dt )
2541 {
2542  if ( !CalendarSupport::hasIncidence( itemadd ) ) {
2543  KMessageBox::sorry(
2544  this,
2545  i18n( "Unable to copy the item to %1.", dt.toString() ),
2546  i18n( "Copying Failed" ) );
2547  return;
2548  }
2549  Akonadi::Item item = mCalendar->item( itemadd.id() );
2550  if ( !item.isValid() ) {
2551  item = itemadd;
2552  }
2553  // Create a copy of the incidence, since the incadd doesn't belong to us.
2554  Incidence::Ptr incidence( CalendarSupport::incidence( item )->clone() );
2555  incidence->recreate();
2556 
2557  if ( const KCalCore::Event::Ptr event = incidence.dynamicCast<KCalCore::Event>() ) {
2558 
2559  // Adjust date
2560  KDateTime start = event->dtStart();
2561  KDateTime end = event->dtEnd();
2562 
2563  int duration = start.daysTo( end );
2564  start.setDate( dt );
2565  end.setDate( dt.addDays( duration ) );
2566 
2567  event->setDtStart( start );
2568  event->setDtEnd( end );
2569 
2570  } else if ( const KCalCore::Todo::Ptr todo = incidence.dynamicCast<KCalCore::Todo>() ) {
2571  KDateTime due = todo->dtDue();
2572  due.setDate( dt );
2573 
2574  todo->setDtDue( due );
2575  }
2576 
2577  mChanger->createIncidence( incidence, Akonadi::Collection(), this );
2578 }
2579 
2580 void CalendarView::moveIncidenceTo( const Akonadi::Item &itemmove, const QDate &dt )
2581 {
2582  if ( !CalendarSupport::hasIncidence( itemmove ) ) {
2583  KMessageBox::sorry(
2584  this,
2585  i18n( "Unable to move the item to %1.", dt.toString() ),
2586  i18n( "Moving Failed" ) );
2587  return;
2588  }
2589  Akonadi::Item item = mCalendar->item( itemmove.id() );
2590  if ( !item.isValid() ) {
2591  addIncidenceOn( itemmove, dt );
2592  return;
2593  }
2594  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( itemmove );
2595 
2596  KCalCore::Incidence::Ptr oldIncidence( incidence->clone() );
2597 
2598  if ( const KCalCore::Event::Ptr event = incidence.dynamicCast<KCalCore::Event>() ) {
2599  // Adjust date
2600  KDateTime start = event->dtStart();
2601  KDateTime end = event->dtEnd();
2602 
2603  int duration = start.daysTo( end );
2604  start.setDate( dt );
2605  end.setDate( dt.addDays( duration ) );
2606 
2607  event->setDtStart( start );
2608  event->setDtEnd( end );
2609 
2610  } if ( const KCalCore::Todo::Ptr todo = incidence.dynamicCast<KCalCore::Todo>() ) {
2611  KDateTime due = todo->dtDue();
2612  due.setDate( dt );
2613 
2614  todo->setDtDue( due );
2615  }
2616  mChanger->modifyIncidence( itemmove, oldIncidence, this );
2617 }
2618 
2619 void CalendarView::resourcesChanged()
2620 {
2621  mViewManager->addChange( EventViews::EventView::ResourcesChanged );
2622  updateView();
2623 }
2624 
2625 bool CalendarView::eventFilter( QObject *watched, QEvent *event )
2626 {
2627  if ( watched == mLeftFrame && event->type() == QEvent::Show ) {
2628  mSplitterSizesValid = true;
2629  }
2630  return KOrg::CalendarViewBase::eventFilter( watched, event );
2631 }
2632 
2633 void CalendarView::updateHighlightModes() {
2634 
2635  KOrg::BaseView *view = mViewManager->currentView();
2636  if ( view ) {
2637  bool hiEvents;
2638  bool hiTodos;
2639  bool hiJournals;
2640 
2641  view->getHighlightMode( hiEvents, hiTodos, hiJournals );
2642  mDateNavigatorContainer->setHighlightMode( hiEvents,
2643  hiTodos,
2644  hiJournals );
2645  }
2646 }
2647 
2648 void CalendarView::selectWeek( const QDate &date, const QDate &preferredMonth )
2649 {
2650  if ( KOPrefs::instance()->mWeekNumbersShowWork &&
2651  mViewManager->rangeMode() == KOViewManager::WORK_WEEK_RANGE ) {
2652  mDateNavigator->selectWorkWeek( date );
2653  } else {
2654  mDateNavigator->selectWeek( date, preferredMonth );
2655  }
2656 }
2657 
2658 void CalendarView::changeFullView( bool fullView )
2659 {
2660  if ( mViewManager->currentView() ) {
2661  if ( mViewManager->currentView()->identifier() == "DefaultTodoView" ) {
2662  showLeftFrame( !fullView );
2663  } else if ( mViewManager->currentView()->identifier() == "DefaultMonthView" ) {
2664  showLeftFrame( !fullView );
2665  fullView ? mNavigatorBar->show() : mNavigatorBar->hide();
2666  }
2667  }
2668 }
2669 
2670 Akonadi::Collection CalendarView::defaultCollection( const QLatin1String &mimeType ) const
2671 {
2672  // 1. Try the view collection ( used in multi-agenda view )
2673  Akonadi::Collection collection = mCalendar->collection( mViewManager->currentView()->collectionId() );
2674  bool supportsMimeType = collection.contentMimeTypes().contains( mimeType ) || mimeType == "";
2675  bool hasRights = collection.rights() & Akonadi::Collection::CanCreateItem;
2676  if ( collection.isValid() && supportsMimeType && hasRights )
2677  return collection;
2678 
2679  // 2. Try the selected collection
2680  collection = selectedCollection();
2681  supportsMimeType = collection.contentMimeTypes().contains( mimeType ) || mimeType == "";
2682  hasRights = collection.rights() & Akonadi::Collection::CanCreateItem;
2683  if ( collection.isValid() && supportsMimeType && hasRights )
2684  return collection;
2685 
2686  // 3. Try the checked collections
2687  Akonadi::Collection::List collections = checkedCollections();
2688  foreach( const Akonadi::Collection &checkedCollection, collections ) {
2689  supportsMimeType = checkedCollection.contentMimeTypes().contains( mimeType ) || mimeType == "";
2690  hasRights = checkedCollection.rights() & Akonadi::Collection::CanCreateItem;
2691  if ( checkedCollection.isValid() && supportsMimeType && hasRights )
2692  return checkedCollection;
2693  }
2694 
2695  // 4. Try the configured default collection
2696  collection = mCalendar->collection( CalendarSupport::KCalPrefs::instance()->defaultCalendarId() );
2697  supportsMimeType = collection.contentMimeTypes().contains( mimeType ) || mimeType == "";
2698  hasRights = collection.rights() & Akonadi::Collection::CanCreateItem;
2699  if ( collection.isValid() && supportsMimeType && hasRights )
2700  return collection;
2701 
2702 
2703  // 5. Return a invalid collection, the editor will use the first one in the combo
2704  return Akonadi::Collection();
2705 }
2706 
2707 IncidenceEditorNG::IncidenceDialog *CalendarView::createIncidenceEditor(
2708  const Akonadi::Item &item, const Akonadi::Collection &collection )
2709 {
2710  IncidenceEditorNG::IncidenceDialog *dialog = incidenceDialog( item );
2711  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( item );
2712  Q_ASSERT( incidence );
2713 
2714  if ( collection.isValid() ) {
2715  dialog->selectCollection( collection );
2716  } else {
2717  dialog->selectCollection( defaultCollection( incidence->mimeType() ) );
2718  }
2719 
2720  return dialog;
2721 }
2722 
2723 Akonadi::History *CalendarView::history() const
2724 {
2725  return mChanger->history();
2726 }
2727 
2728 void CalendarView::onCutFinished()
2729 {
2730  checkClipboard();
2731 }
2732 
2733 void CalendarView::setCheckableProxyModel( KOCheckableProxyModel *model )
2734 {
2735  if ( mCheckableProxyModel )
2736  mCheckableProxyModel->disconnect( this );
2737 
2738  mCheckableProxyModel = model;
2739  connect( model, SIGNAL(aboutToToggle(bool)), SLOT(onCheckableProxyAboutToToggle(bool)) );
2740  connect( model, SIGNAL(toggled(bool)), SLOT(onCheckableProxyToggled(bool)) );
2741 }
2742 
2743 void CalendarView::onCheckableProxyAboutToToggle( bool newState )
2744 {
2745  // Someone unchecked a collection, save the view state now.
2746  if ( !newState ) {
2747  mTodoList->saveViewState();
2748  KOTodoView *todoView = mViewManager->todoView();
2749  if ( todoView )
2750  todoView->saveViewState();
2751  }
2752 }
2753 
2754 void CalendarView::onCheckableProxyToggled( bool newState )
2755 {
2756  // Someone checked a collection, restore the view state now.
2757  if ( newState ) {
2758  mTodoList->restoreViewState();
2759  KOTodoView *todoView = mViewManager->todoView();
2760  if ( todoView )
2761  todoView->restoreViewState();
2762  }
2763 }
2764 
2765 void CalendarView::onTodosPurged(bool success, int numDeleted, int numIgnored)
2766 {
2767  QString message;
2768  KMessageWidget::MessageType type = KMessageWidget::Information;
2769  if (success) {
2770  if (numDeleted == 0 && numIgnored > 0) {
2771  type = KMessageWidget::Warning;
2772  message = i18n("0 completed to-dos were purged.") + QLatin1Char('\n') +
2773  i18np("%1 to-do was ignored because it has uncompleted or read-only children.",
2774  "%1 to-dos were ignored because they have uncompleted or read-only children.", numIgnored);
2775  } else if (numDeleted > 0 && numIgnored == 0) {
2776  message = i18np("%1 completed to-do was purged.", "%1 completed to-dos were purged.", numDeleted);
2777  } else if (numDeleted == 0 && numIgnored == 0) {
2778  message = i18n("There are no completed to-dos to purge.");
2779  } else {
2780  type = KMessageWidget::Warning;
2781  message = i18np("%1 completed to-do was purged.", "%1 completed to-dos were purged.", numDeleted) + QLatin1Char('\n') +
2782  i18np("%1 to-do was ignored because it has uncompleted or read-only children.",
2783  "%1 to-dos were ignored because they have uncompleted or read-only children.", numIgnored);
2784  }
2785  } else {
2786  message = i18n("An error occurred while purging completed to-dos: %1", mTodoPurger->lastError());
2787  type = KMessageWidget::Error;
2788  }
2789 
2790  showMessage(message, type);
2791 }
2792 
2793 void CalendarView::showMessage(const QString &message, KMessageWidget::MessageType type)
2794 {
2795  mMessageWidget->setText(message);
2796  mMessageWidget->setMessageType(type);
2797  mMessageWidget->show();
2798 }
2799 
2800 Akonadi::Collection CalendarView::selectedCollection() const
2801 {
2802  return mETMCollectionView ? mETMCollectionView->selectedCollection() : Akonadi::Collection();
2803 }
2804 
2805 Akonadi::Collection::List CalendarView::checkedCollections() const
2806 {
2807  Akonadi::Collection::List collections;
2808  if ( mETMCollectionView )
2809  collections = mETMCollectionView->checkedCollections();
2810 
2811  // If the default calendar is here, it should be first.
2812  int count = collections.count();
2813  Akonadi::Collection::Id id = CalendarSupport::KCalPrefs::instance()->defaultCalendarId();
2814  for( int i=0; i<count; ++i ) {
2815  if ( id == collections[i].id() ) {
2816  collections.move( i, 0 );
2817  break;
2818  }
2819  }
2820 
2821  return collections;
2822 }
2823 
2824 void CalendarView::handleIncidenceCreated(const Akonadi::Item &item)
2825 {
2826  Akonadi::Collection collection = item.parentCollection();
2827  if (!collection.isValid()) {
2828  kWarning() << "Item was creating in an invalid collection !? item id=" << item.id();
2829  return;
2830  }
2831 
2832  const bool collectionIsChecked = mETMCollectionView->isChecked(collection);
2833 
2834  if (!collectionIsChecked) {
2835  QString message;
2836  if (mETMCollectionView->isVisible()) {
2837  message = i18n("You created an incidence in a calendar that is currently filtered out.\n"
2838  "On the left sidebar, enable it in the calendar manager to see the incidence.");
2839  } else {
2840  message = i18n("You created an incidence in a calendar that is currently filtered out.\n"
2841  "You can enabled it through the calendar manager (Settings->Sidebar->Show Calendar Manager)");
2842  }
2843 
2844  mMessageWidget->setText(message);
2845  mMessageWidget->setMessageType(KMessageWidget::Information);
2846  mMessageWidget->show();
2847  }
2848 }
2849 
2850 #include "calendarview.moc"
koagendaview.h
CalendarView::activeIncidenceDate
QDate activeIncidenceDate()
Returns the date of the selected incidence.
Definition: calendarview.cpp:342
KOViewManager::showJournalView
void showJournalView()
Definition: koviewmanager.cpp:590
CalendarView::dialogClosing
void dialogClosing(const Akonadi::Item &incidence)
Definition: calendarview.cpp:2149
CalendarView::handleIncidenceCreated
void handleIncidenceCreated(const Akonadi::Item &item)
Definition: calendarview.cpp:2824
CalendarView::showLeftFrame
void showLeftFrame(bool show=true)
Definition: calendarview.cpp:2113
KOrg::BaseView::mChanger
Akonadi::IncidenceChanger * mChanger
Definition: baseview.h:397
CalendarView::writeFilterSettings
void writeFilterSettings(KConfig *config)
write settings for calendar filters
Definition: calendarview.cpp:495
KOTodoView::updateView
virtual void updateView()
Definition: kotodoview.cpp:144
KOViewManager::showAgendaView
void showAgendaView()
Definition: koviewmanager.cpp:464
KOEventViewerDialog::setIncidence
void setIncidence(const Akonadi::Item &incidence, const QDate &date)
Definition: koeventviewerdialog.cpp:61
KOViewManager::rangeMode
RangeMode rangeMode() const
Return the current range mode: week, work week, day or nextX days, etc.
Definition: koviewmanager.h:131
KOrg::BaseView::clearSelection
virtual void clearSelection()
Clear selection.
Definition: baseview.cpp:181
koglobals.h
CalendarView::showDateNavigator
void showDateNavigator(bool)
Definition: calendarview.cpp:2065
KOAgendaView
KOAgendaView is the agenda-like view that displays events in a single or multi-day view...
Definition: koagendaview.h:36
KODialogManager::connectTypeAhead
void connectTypeAhead(IncidenceEditorNG::IncidenceDialog *editor, KOEventView *view)
Definition: kodialogmanager.cpp:183
CalendarView::updateView
void updateView()
Definition: calendarview.cpp:773
CalendarView::dissociateOccurrences
void dissociateOccurrences(const Akonadi::Item &incidence, const QDate &date)
Definition: calendarview.cpp:1563
CalendarView::configChanged
void configChanged()
when change is made to options dialog, the topwidget will catch this and emit this signal which notif...
CalendarView::filterChanged
void filterChanged()
DateNavigatorContainer::monthOfNavigator
QDate monthOfNavigator(int navigatorIndex=0) const
Returns the month of the specified KDateNavigator.
Definition: datenavigatorcontainer.cpp:370
KOrg::BaseView::identifier
QByteArray identifier() const
Definition: baseview.cpp:153
DateChecker
Definition: datechecker.h:34
KODayMatrix::matrixLimits
static QPair< QDate, QDate > matrixLimits(const QDate &month)
returns the first and last date of the 6*7 matrix that displays month
Definition: kodaymatrix.cpp:886
DateNavigator::selectToday
void selectToday()
Definition: datenavigator.cpp:154
DateNavigatorContainer
Definition: datenavigatorcontainer.h:38
CalendarView::goPrevious
void goPrevious()
Move to the previous date(s) in the current view.
Definition: calendarview.cpp:546
koeventviewerdialog.h
CalendarView::newEvent
void newEvent()
create new event without having a date hint.
Definition: calendarview.cpp:961
KOViewManager::showTodoView
void showTodoView()
Definition: koviewmanager.cpp:573
datechecker.h
KOTodoView::selectedIncidences
virtual Akonadi::Item::List selectedIncidences()
Definition: kotodoview.cpp:115
KOrg::HTMLExportSettings
Definition: htmlexportsettings.h:12
CalendarView::readOnlyChanged
void readOnlyChanged(bool)
Emitted when state of read-only flag changes.
CalendarView::readSettings
void readSettings()
Using the KConfig associated with the kapp variable, read in the settings from the config file...
Definition: calendarview.cpp:392
CalendarView::newSubTodo
void newSubTodo()
create new todo with a parent todo
Definition: calendarview.cpp:1170
KOCoreHelper
Definition: kocorehelper.h:35
datenavigatorcontainer.h
CalendarView::schedule_request
void schedule_request(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1657
KOViewManager::addView
void addView(KOrg::BaseView *, bool isTab=false)
Definition: koviewmanager.cpp:404
CalendarView::addIncidence
bool addIncidence(const QString &ical)
Add an incidence to the active calendar.
Definition: calendarview.cpp:1226
navigatorbar.h
DateNavigator::selectDate
void selectDate(const QDate &)
Definition: datenavigator.cpp:63
DateNavigatorContainer::setHighlightMode
void setHighlightMode(bool highlightEvents, bool highlightTodos, bool highlightJournals) const
Definition: datenavigatorcontainer.cpp:319
KOrg::BaseView::eventDurationHint
virtual bool eventDurationHint(QDateTime &startDt, QDateTime &endDt, bool &allDay)
Sets the default start/end date/time for new events.
Definition: baseview.cpp:185
KOrg::BaseView::supportsDateNavigation
virtual bool supportsDateNavigation() const
Returns true if the view supports navigation through the date navigator ( selecting a date range...
Definition: baseview.h:200
CalendarView::selectedIncidence
Akonadi::Item selectedIncidence()
Returns a pointer to the incidence selected in the current view.
Definition: calendarview.cpp:2158
CalendarView::uploadFreeBusy
void uploadFreeBusy()
Definition: calendarview.cpp:1710
KODialogManager::createDialog
IncidenceEditorNG::IncidenceDialog * createDialog(const Akonadi::Item &item)
Definition: kodialogmanager.cpp:168
QWidget
CalendarViewExtension::Factory
Definition: calendarview.h:82
CalendarView::schedule_cancel
void schedule_cancel(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1667
CalendarView::warningChangeFailed
void warningChangeFailed(const Akonadi::Item &)
Definition: calendarview.cpp:2504
CalendarView::endMultiModify
void endMultiModify()
Definition: calendarview.cpp:731
CalendarView::todo_unsub
void todo_unsub()
Frees a subtodo from it's relation, update the view.
Definition: calendarview.cpp:1269
CalendarView::schedule_add
void schedule_add(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1672
CalendarView::deleteIncidence
void deleteIncidence()
Definition: calendarview.cpp:2206
CalendarView::exportICalendar
void exportICalendar()
Export as iCalendar file.
Definition: calendarview.cpp:1806
KOViewManager::agendaView
KOAgendaView * agendaView() const
Definition: koviewmanager.h:111
KOrg::BaseView::showConfigurationDialog
virtual void showConfigurationDialog(QWidget *parent)
Definition: baseview.cpp:149
kodaymatrix.h
KOTodoView::saveViewState
void saveViewState()
Definition: kotodoview.cpp:218
KOrg::BaseView::isEventView
virtual bool isEventView()
Returns if this view is a view for displaying events.
Definition: baseview.cpp:85
CalendarView::goDate
void goDate(const QDate &date)
Move the current view date to the specified date.
Definition: calendarview.cpp:515
CalendarView::showDates
void showDates(const KCalCore::DateList &, const QDate &preferredMonth=QDate())
Select a view or adapt the current view to display the specified dates.
Definition: calendarview.cpp:1971
CalendarView::writeSettings
void writeSettings()
write current state to config file.
Definition: calendarview.cpp:429
CalendarView::openAddressbook
void openAddressbook()
Definition: calendarview.cpp:1728
KOrg::BaseView::hasConfigurationDialog
virtual bool hasConfigurationDialog() const
Definition: baseview.cpp:113
CalendarView::mailFreeBusy
void mailFreeBusy(int daysToPublish=30)
Definition: calendarview.cpp:1705
CalendarView::exportWeb
void exportWeb()
Export as HTML file.
Definition: calendarview.cpp:1793
KOViewManager::addChange
void addChange(EventViews::EventView::Change change)
Notifies all views that an update is needed.
Definition: koviewmanager.cpp:677
CalendarView::showIncidence
void showIncidence()
Definition: calendarview.cpp:2170
kotodoview.h
CalendarView::dateTimesForNewEvent
void dateTimesForNewEvent(QDateTime &startDt, QDateTime &endDt, bool &allDay)
Adjust the given date/times by valid defaults (selection or configured defaults, if invalid values ar...
Definition: calendarview.cpp:924
kocheckableproxymodel.h
CalendarView::addIncidenceOn
void addIncidenceOn(const Akonadi::Item &incidence, const QDate &)
Definition: calendarview.cpp:2540
KOrg::MonthView
Definition: monthview.h:33
KOViewManager::raiseCurrentView
void raiseCurrentView()
Definition: koviewmanager.cpp:251
CalendarView::updateFilter
void updateFilter()
Definition: calendarview.cpp:1988
CalendarView::edit_copy
void edit_copy()
copy the current appointment(s) to the clipboard
Definition: calendarview.cpp:812
CalendarView::newEventEditor
IncidenceEditorNG::IncidenceDialog * newEventEditor(const KCalCore::Event::Ptr &event)
Definition: calendarview.cpp:947
QObject
KOrg::BaseView::printType
virtual CalPrinterBase::PrintType printType() const
Definition: baseview.cpp:75
CalendarView::calendarViewExpanded
void calendarViewExpanded(bool)
CalendarView::copyIncidenceToResource
void copyIncidenceToResource(const Akonadi::Item &incidence, const QString &resourceId)
Definition: calendarview.cpp:1407
CalendarView::saveCalendar
bool saveCalendar(const QString &filename)
Save calendar data to file.
Definition: calendarview.cpp:375
CalendarView::isReadOnly
bool isReadOnly() const
query if the calendar is read-only.
Definition: calendarview.cpp:1733
CalendarView::showView
void showView(KOrg::BaseView *)
changes the view to be the currently selected view
Definition: calendarview.cpp:2099
CalendarView::msgItemDelete
int msgItemDelete(const Akonadi::Item &incidence)
Definition: calendarview.cpp:789
NavigatorBar::selectDates
void selectDates(const KCalCore::DateList &)
Definition: navigatorbar.cpp:124
CalendarView::processMainViewSelection
void processMainViewSelection(const Akonadi::Item &incidence, const QDate &date)
Definition: calendarview.cpp:1912
CalendarView::checkForFilteredChange
void checkForFilteredChange(const Akonadi::Item &incidence)
Definition: calendarview.cpp:712
KOrg::BaseView::newTodoSignal
void newTodoSignal(const QDate &)
CalendarView::schedule_publish
void schedule_publish(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1645
KOrg::BaseView::flushView
virtual void flushView()
Write all unsaved data back to calendar store.
Definition: baseview.cpp:100
CalendarView::archiveCalendar
void archiveCalendar()
Archive old events of calendar.
Definition: calendarview.cpp:387
KOrg::BaseView::getHighlightMode
virtual void getHighlightMode(bool &highlightEvents, bool &highlightTodos, bool &highlightJournals)
Returns which incidence types should used to embolden day numbers in the date navigator when this vie...
Definition: baseview.cpp:193
KOTodoView::clearSelection
virtual void clearSelection()
Definition: kotodoview.cpp:164
DateNavigatorContainer::setCalendar
void setCalendar(const Akonadi::ETMCalendar::Ptr &)
Associate date navigator with a calendar.
Definition: datenavigatorcontainer.cpp:97
CalendarView::currentFilterName
QString currentFilterName() const
Returns the name of the current filter.
Definition: calendarview.cpp:2031
akonadicollectionview.h
CalendarView::eventFilter
bool eventFilter(QObject *watched, QEvent *event)
Definition: calendarview.cpp:2625
KODialogManager::showFilterEditDialog
void showFilterEditDialog(QList< KCalCore::CalFilter * > *filters)
Definition: kodialogmanager.cpp:152
datenavigator.h
CalendarView::print
void print()
Functions for printing, previewing a print, and setting up printing parameters.
Definition: calendarview.cpp:1746
CalendarView::deleteSubTodosIncidence
void deleteSubTodosIncidence(const Akonadi::Item &todo)
Delete the supplied todo and all sub-todos.
Definition: calendarview.cpp:2290
ExportWebDialog
ExportWebDialog is a class that provides the dialog and functions to export a calendar as web page...
Definition: exportwebdialog.h:38
CalendarView::pasteIncidence
void pasteIncidence()
Pastes the current incidence using the edit_paste() method.
Definition: calendarview.cpp:2223
CalendarView::processTodoListSelection
void processTodoListSelection(const Akonadi::Item &incidence, const QDate &date)
Definition: calendarview.cpp:1920
CalendarView::calendar
Akonadi::ETMCalendar::Ptr calendar() const
Definition: calendarview.cpp:313
CalendarView::toggleAlarm
void toggleAlarm(const Akonadi::Item &incidence)
Definition: calendarview.cpp:1335
CalendarView::schedule_refresh
void schedule_refresh(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1662
KOTodoView::restoreViewState
void restoreViewState()
Definition: kotodoview.cpp:223
DateNavigator::selectWeek
void selectWeek()
Definition: datenavigator.cpp:108
DateNavigator::selectDates
void selectDates(const KCalCore::DateList &, const QDate &preferredMonth=QDate())
Definition: datenavigator.cpp:55
koprefs.h
CalendarView::readFilterSettings
void readFilterSettings(KConfig *config)
read settings for calendar filters
Definition: calendarview.cpp:461
CalendarView::copyIncidence
void copyIncidence(const Akonadi::Item &)
Copies the selected incidence using the edit_copy() method.
Definition: calendarview.cpp:2217
KOGlobals::setHolidays
void setHolidays(KHolidays::HolidayRegion *h)
Set which holidays the user wants to use.
Definition: koglobals.cpp:130
CalendarView::changeIncidenceDisplay
void changeIncidenceDisplay(const Akonadi::Item &incidence, Akonadi::IncidenceChanger::ChangeType)
passes on the message that an event has changed to the currently activated view so that it can make a...
Definition: calendarview.cpp:736
CalendarViewExtension::Factory::create
virtual CalendarViewExtension * create(QWidget *parent)=0
KOrg::CalPrinterBase::Month
Definition: printplugin.h:49
CalendarView::schedule_counter
void schedule_counter(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1682
KOViewManager::currentView
KOrg::BaseView * currentView()
Definition: koviewmanager.cpp:74
KOViewManager::updateMultiCalendarDisplay
void updateMultiCalendarDisplay()
Definition: koviewmanager.cpp:686
DateNavigator::selectedDates
KCalCore::DateList selectedDates()
Definition: datenavigator.cpp:45
CalendarView::exportVCalendar
void exportVCalendar()
Export as vCalendar file.
Definition: calendarview.cpp:1842
CalendarView::resourcesChanged
void resourcesChanged()
Definition: calendarview.cpp:2619
KOAgendaView::selectedIsAllDay
bool selectedIsAllDay()
returns true if selection is for whole day
Definition: koagendaview.cpp:299
CalendarView::selectedTodo
Akonadi::Item selectedTodo()
Definition: calendarview.cpp:2130
CalendarView::endDate
QDate endDate()
Definition: calendarview.cpp:361
CalendarView::makeChildrenIndependent
bool makeChildrenIndependent(const Akonadi::Item &item)
Make all children of incidence independent, not update the view Works with any incidence type...
Definition: calendarview.cpp:1305
CalendarView::appointment_edit
void appointment_edit()
pop up an Appointment Dialog to edit an existing appointment.
Definition: calendarview.cpp:1249
CalendarView::pasteEnabled
void pasteEnabled(bool)
Emitted, when clipboard content changes.
KODialogManager::showArchiveDialog
void showArchiveDialog()
Definition: kodialogmanager.cpp:135
CalendarView::goToday
void goToday()
Move the current view date to today.
Definition: calendarview.cpp:530
CalendarView::appointment_show
void appointment_show()
pop up a dialog to show an existing appointment.
Definition: calendarview.cpp:1239
KOViewManager::todoView
KOTodoView * todoView() const
Definition: koviewmanager.h:113
CalendarViewExtension
Definition: calendarview.h:77
DateNavigator::selectPreviousMonth
void selectPreviousMonth(const QDate &currentMonth=QDate(), const QDate &selectionLowerLimit=QDate(), const QDate &selectionUpperLimit=QDate())
Definition: datenavigator.cpp:178
CalendarView::addExtension
void addExtension(CalendarViewExtension::Factory *)
Adds a calendar view extension widget.
Definition: calendarview.cpp:2104
KOTodoView::setCalendar
virtual void setCalendar(const Akonadi::ETMCalendar::Ptr &)
Definition: kotodoview.cpp:109
CalendarView::onCutFinished
void onCutFinished()
Definition: calendarview.cpp:2728
CalendarView::printPreview
void printPreview()
Definition: calendarview.cpp:1769
CalendarView::activeDate
QDate activeDate(bool fallbackToToday=false)
Returns the best guess at the current active date in the view.
Definition: calendarview.cpp:318
DateNavigator::selectPrevious
void selectPrevious()
Definition: datenavigator.cpp:258
exportwebdialog.h
KOrg::BaseView::selectedIncidences
virtual Akonadi::Item::List selectedIncidences()=0
KOViewManager::monthView
KOrg::MonthView * monthView() const
Definition: koviewmanager.h:114
CalendarView::newTodo
void newTodo()
create new todo
Definition: calendarview.cpp:1056
DateNavigatorContainer::minimumSizeHint
QSize minimumSizeHint() const
Definition: datenavigatorcontainer.cpp:309
KOPrefsBase::recordTodosInJournals
bool recordTodosInJournals() const
Get Record completed to-dos in journal entries.
Definition: koprefs_base.h:1002
CalendarView::currentView
KOrg::BaseView * currentView() const
Definition: calendarview.cpp:1157
CalendarView::moveIncidenceTo
void moveIncidenceTo(const Akonadi::Item &incidence, const QDate &)
Definition: calendarview.cpp:2580
CalendarView::newFloatingEvent
void newFloatingEvent()
Definition: calendarview.cpp:1219
CalendarView::updateHighlightModes
void updateHighlightModes()
Informs the date navigator which incidence types should be used to embolden days, this function is ma...
Definition: calendarview.cpp:2633
CalendarView::processIncidenceSelection
void processIncidenceSelection(const Akonadi::Item &incidence, const QDate &date)
Definition: calendarview.cpp:1928
CalendarView::categoriesChanged
void categoriesChanged()
Emitted when the categories were updated, and thus the categories editor dialog needs to reload the l...
CalendarView::setCheckableProxyModel
void setCheckableProxyModel(KOCheckableProxyModel *)
Definition: calendarview.cpp:2733
CalendarView::slotCreateFinished
void slotCreateFinished(int changeId, const Akonadi::Item &item, Akonadi::IncidenceChanger::ResultCode resultCode, const QString &errorString)
Definition: calendarview.cpp:620
CalendarView::updateConfig
void updateConfig()
options dialog made a changed to the configuration.
Definition: calendarview.cpp:557
KOrg::BaseView::collectionId
virtual Akonadi::Collection::Id collectionId() const
Definition: baseview.h:202
AkonadiCollectionView::checkedCollections
Akonadi::Collection::List checkedCollections() const
Definition: akonadicollectionview.cpp:587
KOTodoView::saveLayout
void saveLayout(KConfig *config, const QString &group) const
Definition: kotodoview.cpp:233
CalPrinter
CalPrinter is a class for printing Calendars.
Definition: calprinter.h:46
CalendarView::slotDeleteFinished
void slotDeleteFinished(int changeId, const QVector< Akonadi::Item::Id > &itemIdList, Akonadi::IncidenceChanger::ResultCode resultCode, const QString &errorString)
Definition: calendarview.cpp:694
KOrg::BaseView::updateView
virtual void updateView()=0
Updates the current display to reflect changes that may have happened in the calendar since the last ...
CalendarView::edit_options
void edit_options()
edit viewing and configuration options.
Definition: calendarview.cpp:919
CalendarView::updateUnmanagedViews
void updateUnmanagedViews()
Definition: calendarview.cpp:782
CalendarView::showEventViewer
void showEventViewer(bool)
Definition: calendarview.cpp:2085
DateNavigator::selectNextMonth
void selectNextMonth(const QDate &currentMonth=QDate(), const QDate &selectionLowerLimit=QDate(), const QDate &selectionUpperLimit=QDate())
Definition: datenavigator.cpp:239
AkonadiCollectionView::selectedCollection
Akonadi::Collection selectedCollection() const
Definition: akonadicollectionview.cpp:573
DateNavigator::datesCount
int datesCount() const
Definition: datenavigator.cpp:50
KOGlobals::self
static KOGlobals * self()
Definition: koglobals.cpp:43
CalendarView::editIncidence
void editIncidence()
Definition: calendarview.cpp:2175
KOEventViewerDialog
Viewer dialog for events.
Definition: koeventviewerdialog.h:44
CalendarView::showDate
void showDate(const QDate &date)
Show the given date without changing date selection length.
Definition: calendarview.cpp:520
KOViewManager::WORK_WEEK_RANGE
Definition: koviewmanager.h:70
KOViewManager::showView
void showView(KOrg::BaseView *)
changes the view to be the currently selected view
Definition: koviewmanager.cpp:171
CalendarView::setReadOnly
void setReadOnly(bool readOnly=true)
set state of calendar to read-only
Definition: calendarview.cpp:1738
NavigatorBar
Definition: navigatorbar.h:33
CalendarView::editFilters
void editFilters()
Definition: calendarview.cpp:1983
KODialogManager::updateSearchDialog
void updateSearchDialog()
Definition: kodialogmanager.cpp:207
CalendarView::organizerEventsSelected
void organizerEventsSelected(bool)
Emitted when state of events selection has changed and user is organizer.
KOrg::BaseView
This class provides an interface for all views being displayed within the main calendar view...
Definition: baseview.h:51
KODialogManager::showOptionsDialog
void showOptionsDialog()
Definition: kodialogmanager.cpp:84
CalendarView::purgeCompleted
void purgeCompleted()
Definition: calendarview.cpp:2481
KOAgendaView::selectedIsSingleCell
bool selectedIsSingleCell()
returns if only a single cell is selected, or a range of cells
Definition: koagendaview.cpp:214
CalendarView::showIncidenceContext
void showIncidenceContext(const Akonadi::Item &incidence)
Show an incidence in context.
Definition: calendarview.cpp:2240
KOrg::BaseView::showIncidences
virtual void showIncidences(const Akonadi::Item::List &incidenceList, const QDate &date)=0
Shows given incidences.
CalendarView::goNext
void goNext()
Move to the next date(s) in the current view.
Definition: calendarview.cpp:535
KOAgendaView::selectionEnd
virtual QDateTime selectionEnd()
end-datetime of selection
Definition: koagendaview.cpp:294
CalendarView::makeSubTodosIndependent
bool makeSubTodosIndependent()
Make all sub-to-dos of the selected todo independent, update the view.
Definition: calendarview.cpp:1293
CalendarView::exportHTML
void exportHTML(KOrg::HTMLExportSettings *)
KOPrefsBase::mConfirm
bool mConfirm
Definition: koprefs_base.h:3121
KOViewManager::updateView
void updateView()
Definition: koviewmanager.cpp:267
KOViewManager::currentSelectionDate
QDate currentSelectionDate()
If there's a selected incidence, it's date is returned, otherwise an invalid QDate is returned...
Definition: koviewmanager.cpp:638
CalendarView::subtodoSelected
void subtodoSelected(bool)
AkonadiCollectionView
This class provides a view of calendar resources.
Definition: akonadicollectionview.h:67
CalendarView::showMessage
void showMessage(const QString &message, KMessageWidget::MessageType)
Definition: calendarview.cpp:2793
DateNavigator
This class controls date navigation.
Definition: datenavigator.h:41
CalendarView::incidenceSelected
void incidenceSelected(const Akonadi::Item &incidence, const QDate &date)
Emitted when an incidence gets selected.
CalendarView::changeNavStringNext
void changeNavStringNext(const QString &)
KOrg::BaseView::newEventSignal
void newEventSignal()
instructs the receiver to create a new event in given collection.
KOrg::BaseView::changeIncidenceDisplay
virtual void changeIncidenceDisplay(const Akonadi::Item &, Akonadi::IncidenceChanger::ChangeType)=0
Updates the current display to reflect the changes to one particular incidence.
KOCheckableProxyModel
A KCheckableProxyModel that emits a signal before and after toggling.
Definition: kocheckableproxymodel.h:37
KOAgendaView::selectionStart
virtual QDateTime selectionStart()
start-datetime of selection
Definition: koagendaview.cpp:289
CalendarView::newJournal
void newJournal()
Definition: calendarview.cpp:1105
CalendarView::deleteTodoIncidence
void deleteTodoIncidence(const Akonadi::Item &todo, bool force=false)
Delete the todo incidence, and its sub-to-dos.
Definition: calendarview.cpp:2308
KOViewManager::currentSelection
Akonadi::Item currentSelection()
Definition: koviewmanager.cpp:625
kohelper.h
CalendarView::schedule
void schedule(KCalCore::iTIPMethod, const Akonadi::Item &incidence)
Definition: calendarview.cpp:1715
KOTodoView
Definition: kotodoview.h:39
CalendarView::CalendarView
CalendarView(QWidget *parent=0)
Constructs a new calendar view widget.
Definition: calendarview.cpp:104
KOViewManager::readSettings
void readSettings(KConfig *config)
Definition: koviewmanager.cpp:79
CalendarView::cutIncidence
void cutIncidence(const Akonadi::Item &)
Cuts the selected incidence using the edit_cut() method.
Definition: calendarview.cpp:2211
CalendarView::history
Akonadi::History * history() const
Definition: calendarview.cpp:2723
CalendarView::changeFullView
void changeFullView(bool fullView)
Use as much of the full window as possible for the view.
Definition: calendarview.cpp:2658
kodialogmanager.h
DateNavigatorContainer::selectDates
void selectDates(const KCalCore::DateList &, const QDate &preferredMonth=QDate())
preferredMonth is useful when the datelist crosses months, if different from -1, it has the month tha...
Definition: datenavigatorcontainer.cpp:161
CalendarView::filtersUpdated
void filtersUpdated(const QStringList &, int)
CalendarView::groupEventsSelected
void groupEventsSelected(bool)
Emitted when state of events selection has changed and user is attendee.
DateNavigatorContainer::updateView
void updateView()
Definition: datenavigatorcontainer.cpp:141
KOPrefs::instance
static KOPrefs * instance()
Get instance of KOPrefs.
Definition: koprefs.cpp:68
CalPrinter::print
void print(int type, const QDate &fd, const QDate &td, Incidence::List selectedIncidences=Incidence::List(), bool preview=false)
Definition: calprinter.cpp:96
CalendarView::isFiltered
bool isFiltered() const
Returns true if there's a filter applied.
Definition: calendarview.cpp:2026
monthview.h
AkonadiCollectionView::isChecked
bool isChecked(const Akonadi::Collection &) const
Definition: akonadicollectionview.cpp:608
CalendarView::takeOverEvent
void takeOverEvent()
Take ownership of selected event.
Definition: calendarview.cpp:2040
calendarview.h
CalendarView::showIntro
void showIntro()
Definition: calendarview.cpp:2060
koviewmanager.h
CalendarView::startDate
QDate startDate()
Definition: calendarview.cpp:355
multiagendaview.h
DateNavigator::selectNext
void selectNext()
Definition: datenavigator.cpp:268
KOrg::BaseView::selectionStart
virtual QDateTime selectionStart()
Returns the start of the selection, or an invalid QDateTime if there is no selection or the view does...
Definition: baseview.h:93
CalendarView::slotModifyFinished
void slotModifyFinished(int changeId, const Akonadi::Item &item, Akonadi::IncidenceChanger::ResultCode resultCode, const QString &errorString)
Definition: calendarview.cpp:635
htmlexportsettings.h
CalendarView::edit_cut
void edit_cut()
cut the current appointment to the clipboard
Definition: calendarview.cpp:800
CalendarView::currentSelection
Akonadi::Item currentSelection()
Returns the item selected in the current view (or an invalid one if none selected) ...
Definition: calendarview.cpp:2153
DateNavigatorContainer::updateDayMatrix
void updateDayMatrix()
Definition: datenavigatorcontainer.cpp:111
CalendarView::todoSelected
void todoSelected(bool)
Emitted, when a todoitem is selected or deselected.
CalendarView::showTodoView
void showTodoView(bool)
Definition: calendarview.cpp:2075
CalendarView::selectWeek
void selectWeek(const QDate &week, const QDate &preferredMonth)
The user clicked on a week number in the date navigator.
Definition: calendarview.cpp:2648
CalendarView::changeNavStringPrev
void changeNavStringPrev(const QString &)
Emitted when the unit of navigation changes.
KOTodoView::restoreLayout
void restoreLayout(KConfig *config, const QString &group, bool minimalDefaults)
Definition: kotodoview.cpp:228
CalendarView::toggleTodoCompleted
void toggleTodoCompleted(const Akonadi::Item &incidence)
Definition: calendarview.cpp:1378
KOViewManager
This class manages the views of the calendar.
Definition: koviewmanager.h:61
KOrg::CalendarViewBase
interface for main calendar view widget
Definition: calendarviewbase.h:35
CalendarView::moveIncidenceToResource
void moveIncidenceToResource(const Akonadi::Item &incidence, const QString &resourceId)
Definition: calendarview.cpp:1477
CalendarView::startMultiModify
void startMultiModify(const QString &text)
Definition: calendarview.cpp:726
DateNavigator::selectWorkWeek
void selectWorkWeek()
Definition: datenavigator.cpp:127
KOrg::BaseView::newJournalSignal
void newJournalSignal(const QDate &)
CalendarView::adaptNavigationUnits
void adaptNavigationUnits()
Adapts navigation units according to the current view's navigation step size.
Definition: calendarview.cpp:1898
CalendarView::checkClipboard
void checkClipboard()
Check if clipboard contains vCalendar event.
Definition: calendarview.cpp:1966
CalendarView::dayPassed
void dayPassed(const QDate &)
Emitted, when a day changed (i.e.
KOrg::BaseView::currentDateCount
virtual int currentDateCount() const =0
Returns the number of currently shown dates.
CalendarView::~CalendarView
virtual ~CalendarView()
Definition: calendarview.cpp:301
kocorehelper.h
KOGlobals::config
KConfig * config() const
Definition: koglobals.cpp:54
CalendarView::schedule_forward
void schedule_forward(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1692
CalendarView::schedule_reply
void schedule_reply(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1677
calprinter.h
CalendarView::addView
void addView(KOrg::BaseView *)
Definition: calendarview.cpp:2094
CalendarView::schedule_declinecounter
void schedule_declinecounter(const Akonadi::Item &incidence=Akonadi::Item())
Definition: calendarview.cpp:1687
CalendarView::showErrorMessage
void showErrorMessage(const QString &)
Definition: calendarview.cpp:2516
KOrg::BaseView::selectedIncidenceDates
virtual KCalCore::DateList selectedIncidenceDates()=0
Returns a list of the dates of selected events.
CalendarView::appointment_delete
void appointment_delete()
pop up dialog confirming deletion of currently selected event in the View.
Definition: calendarview.cpp:1259
CalendarView::viewManager
KOViewManager * viewManager() const
Definition: calendarview.h:136
KOrg::MonthView::selectionStart
QDateTime selectionStart()
Returns the start of the selection, or an invalid QDateTime if there is no selection or the view does...
Definition: monthview.cpp:157
CalendarView::configureCurrentView
void configureCurrentView()
Definition: calendarview.cpp:1162
CalendarView::eventUpdated
void eventUpdated(const Akonadi::Item &incidence)
Definition: calendarview.cpp:1891
CalendarView::updateCategories
void updateCategories()
Calendar configuration was changed, so refresh categories list.
Definition: calendarview.cpp:2521
CalendarView::incidence_unsub
bool incidence_unsub(const Akonadi::Item &item)
Definition: calendarview.cpp:1277
CalendarView::edit_paste
void edit_paste()
paste the current vobject(s) in the clipboard buffer into calendar
Definition: calendarview.cpp:830
KODialogManager
This class manages the dialogs used by the calendar view.
Definition: kodialogmanager.h:54
KOViewManager::writeSettings
void writeSettings(KConfig *config)
Definition: koviewmanager.cpp:128
CalendarView::filterActivated
void filterActivated(int filterNum)
Definition: calendarview.cpp:2011
KOrg::CalPrinterBase::PrintType
PrintType
Definition: printplugin.h:45
CalendarView::incidenceDialog
IncidenceEditorNG::IncidenceDialog * incidenceDialog(const Akonadi::Item &)
Definition: calendarview.cpp:940
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:56:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

korganizer

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



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