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

korganizer

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

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