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

KCalCore Library

  • kcalcore
occurrenceiterator.cpp
Go to the documentation of this file.
1/*
2 This file is part of the kcalcore library.
3
4 Copyright (C) 2013 Christian Mollekopf <mollekopf@kolabsys.com>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20*/
32#include "occurrenceiterator.h"
33#include "calendar.h"
34#include "calfilter.h"
35
36#include <KDebug>
37#include <QDate>
38
39using namespace KCalCore;
40
45//@cond PRIVATE
46class KCalCore::OccurrenceIterator::Private
47{
48public:
49 Private(OccurrenceIterator *qq)
50 : q(qq),
51 occurrenceIt(occurrenceList)
52 {
53 }
54
55 OccurrenceIterator *q;
56 KDateTime start;
57 KDateTime end;
58
59 struct Occurrence
60 {
61 Occurrence()
62 {
63 }
64
65 Occurrence(const Incidence::Ptr &i, const KDateTime &d)
66 : incidence(i), date(d)
67 {
68 }
69
70 Incidence::Ptr incidence;
71 KDateTime date;
72 };
73 QList<Occurrence> occurrenceList;
74 QListIterator<Occurrence> occurrenceIt;
75 Occurrence current;
76
77 /*
78 * KCalCore::CalFilter can't handle individual occurrences.
79 * When filtering completed to-dos, the CalFilter doesn't hide
80 * them if it's a recurring to-do.
81 */
82 bool occurrenceIsHidden(const Calendar &calendar,
83 const Incidence::Ptr &inc,
84 const KDateTime &occurrenceDate)
85 {
86 if ((inc->type() == Incidence::TypeTodo) &&
87 calendar.filter() &&
88 (calendar.filter()->criteria() & KCalCore::CalFilter::HideCompletedTodos)) {
89 if (inc->recurs()) {
90 const Todo::Ptr todo = inc.staticCast<Todo>();
91 if (todo && (occurrenceDate < todo->dtDue())) {
92 return true;
93 }
94 } else if (inc->hasRecurrenceId()) {
95 const Todo::Ptr mainTodo = calendar.todo(inc->uid());
96 if (mainTodo && mainTodo->isCompleted()) {
97 return true;
98 }
99 }
100 }
101 return false;
102 }
103
104 void setupIterator(const Calendar &calendar, const Incidence::List &incidences)
105 {
106 foreach(const Incidence::Ptr &inc, incidences) {
107 if (inc->hasRecurrenceId()) {
108 continue;
109 }
110 if (inc->recurs()) {
111 QHash<KDateTime, Incidence::Ptr> recurrenceIds;
112 KDateTime incidenceRecStart = inc->dateTime(Incidence::RoleRecurrenceStart);
113 foreach(const Incidence::Ptr &exception, calendar.instances(inc)) {
114 if (incidenceRecStart.isValid())
115 recurrenceIds.insert(exception->recurrenceId().toTimeSpec(incidenceRecStart.timeSpec()), exception);
116 }
117 const bool isAllDay = inc->allDay();
118 const DateTimeList occurrences = inc->recurrence()->timesInInterval(start, end);
119 Incidence::Ptr incidence(inc);
120 qint64 offset(0);
121 foreach(KDateTime occurrenceDate, occurrences) { //krazy:exclude=foreach
122 //timesInInterval generates always date-times,
123 //which is not what we want for all-day events
124 occurrenceDate.setDateOnly(isAllDay);
125
126 bool resetIncidence = false;
127 if (recurrenceIds.contains(occurrenceDate)) {
128 // TODO: exclude exceptions where the start/end is not within
129 // (so the occurrence of the recurrence is omitted, but no exception is added)
130 if (recurrenceIds.value(occurrenceDate)->status() == Incidence::StatusCanceled)
131 continue;
132
133 incidence = recurrenceIds.value(occurrenceDate);
134 occurrenceDate = incidence->dtStart();
135 resetIncidence = !incidence->thisAndFuture();
136 offset = incidence->recurrenceId().secsTo_long(incidence->dtStart());
137 } else if (inc != incidence) { //thisAndFuture exception is active
138 occurrenceDate = occurrenceDate.addSecs(offset);
139 }
140 if (!occurrenceIsHidden(calendar, incidence, occurrenceDate)) {
141 occurrenceList << Private::Occurrence(incidence, occurrenceDate);
142 }
143 if (resetIncidence) {
144 incidence = inc;
145 offset = 0;
146 }
147 }
148 } else {
149 occurrenceList << Private::Occurrence(inc, inc->dtStart());
150 }
151 }
152 occurrenceIt = QListIterator<Private::Occurrence>(occurrenceList);
153 }
154};
155//@endcond
156
157static uint qHash(const KDateTime &dt)
158{
159 return qHash(dt.toString());
160}
161
173OccurrenceIterator::OccurrenceIterator(const Calendar &calendar,
174 const KDateTime &start,
175 const KDateTime &end)
176 : d(new KCalCore::OccurrenceIterator::Private(this))
177{
178 d->start = start;
179 d->end = end;
180
181 Event::List events = calendar.rawEvents(start.date(), end.date(), start.timeSpec());
182 if (calendar.filter()) {
183 calendar.filter()->apply(&events);
184 }
185
186 Todo::List todos = calendar.rawTodos(start.date(), end.date(), start.timeSpec());
187 if (calendar.filter()) {
188 calendar.filter()->apply(&todos);
189 }
190
191 Journal::List journals;
192 const Journal::List allJournals = calendar.rawJournals();
193 foreach(const KCalCore::Journal::Ptr &journal, allJournals) {
194 const QDate journalStart = journal->dtStart().toTimeSpec(start.timeSpec()).date();
195 if (journal->dtStart().isValid() &&
196 journalStart >= start.date() &&
197 journalStart <= end.date())
198 journals << journal;
199 }
200
201 if (calendar.filter()) {
202 calendar.filter()->apply(&journals);
203 }
204
205 const Incidence::List incidences =
206 KCalCore::Calendar::mergeIncidenceList(events, todos, journals);
207 d->setupIterator(calendar, incidences);
208}
209
210OccurrenceIterator::OccurrenceIterator(const Calendar &calendar,
211 const Incidence::Ptr &incidence,
212 const KDateTime &start,
213 const KDateTime &end)
214 : d(new KCalCore::OccurrenceIterator::Private(this))
215{
216 Q_ASSERT(incidence);
217 d->start = start;
218 d->end = end;
219 d->setupIterator(calendar, Incidence::List() << incidence);
220}
221
222OccurrenceIterator::~OccurrenceIterator()
223{
224}
225
226bool OccurrenceIterator::hasNext() const
227{
228 return d->occurrenceIt.hasNext();
229}
230
231void OccurrenceIterator::next()
232{
233 d->current = d->occurrenceIt.next();
234}
235
236Incidence::Ptr OccurrenceIterator::incidence() const
237{
238 return d->current.incidence;
239}
240
241KDateTime OccurrenceIterator::occurrenceStartDate() const
242{
243 return d->current.date;
244}
calendar.h
This file is part of the API for handling calendar data and defines the Calendar class.
calfilter.h
This file is part of the API for handling calendar data and defines the CalFilter class.
KCalCore::CalFilter::apply
void apply(Event::List *eventList) const
Applies the filter to a list of Events.
Definition calfilter.cpp:87
KCalCore::CalFilter::criteria
int criteria() const
Returns the inclusive filter criteria.
Definition calfilter.cpp:240
KCalCore::CalFilter::HideCompletedTodos
@ HideCompletedTodos
Remove completed to-dos.
Definition calfilter.h:63
KCalCore::Calendar
Represents the main calendar class.
Definition calendar.h:130
KCalCore::Calendar::instances
virtual Incidence::List instances(const Incidence::Ptr &incidence) const
Returns an unfiltered list of all exceptions of this recurring incidence.
KCalCore::Calendar::mergeIncidenceList
static Incidence::List mergeIncidenceList(const Event::List &events, const Todo::List &todos, const Journal::List &journals)
Create a merged list of Events, Todos, and Journals.
Definition calendar.cpp:1348
KCalCore::Calendar::filter
CalFilter * filter() const
Returns the calendar filter.
KCalCore::Calendar::todo
virtual Todo::Ptr todo(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const =0
Returns the Todo associated with the given unique identifier.
KCalCore::Calendar::rawJournals
virtual Journal::List rawJournals(JournalSortField sortField=JournalSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const =0
Returns a sorted, unfiltered list of all Journals for this Calendar.
KCalCore::Calendar::rawEvents
virtual Event::List rawEvents(EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const =0
Returns a sorted, unfiltered list of all Events for this Calendar.
KCalCore::Calendar::rawTodos
virtual Todo::List rawTodos(TodoSortField sortField=TodoSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const =0
Returns a sorted, unfiltered list of all Todos for this Calendar.
KCalCore::Event::List
QVector< Ptr > List
List of events.
Definition event.h:60
KCalCore::Incidence::List
QVector< Ptr > List
List of incidences.
Definition incidence.h:117
KCalCore::Incidence::Ptr
QSharedPointer< Incidence > Ptr
A shared pointer to an Incidence.
Definition incidence.h:112
KCalCore::Incidence::StatusCanceled
@ StatusCanceled
event or to-do canceled; journal removed
Definition incidence.h:83
KCalCore::Journal::Ptr
QSharedPointer< Journal > Ptr
A shared pointer to a Journal object.
Definition journal.h:49
KCalCore::Journal::List
QVector< Ptr > List
List of journals.
Definition journal.h:54
KCalCore::OccurrenceIterator
Iterate over calendar items in a calendar.
Definition occurrenceiterator.h:47
KCalCore::OccurrenceIterator::incidence
Incidence::Ptr incidence() const
Returns either main incidence or exception, depending on occurrence.
Definition occurrenceiterator.cpp:236
KCalCore::OccurrenceIterator::occurrenceStartDate
KDateTime occurrenceStartDate() const
Returns the start date of the occurrence.
Definition occurrenceiterator.cpp:241
KCalCore::OccurrenceIterator::OccurrenceIterator
OccurrenceIterator(const Calendar &calendar, const KDateTime &start=KDateTime(), const KDateTime &end=KDateTime())
Creates iterator that iterates over all occurrences of all incidences between.
Definition occurrenceiterator.cpp:173
KCalCore::OccurrenceIterator::next
void next()
Advance iterator to the next occurrence.
Definition occurrenceiterator.cpp:231
KCalCore::SortableList
A QList which can be sorted.
Definition sortablelist.h:87
KCalCore::Todo
Provides a To-do in the sense of RFC2445.
Definition todo.h:45
KCalCore::Todo::List
QVector< Ptr > List
List of to-dos.
Definition todo.h:55
KCalCore::Todo::Ptr
QSharedPointer< Todo > Ptr
A shared pointer to a Todo object.
Definition todo.h:50
KCalCore
TODO: KDE5:
Definition alarm.h:47
qHash
static uint qHash(const KDateTime &dt)
Private class that helps to provide binary compatibility between releases.
Definition occurrenceiterator.cpp:157
occurrenceiterator.h
This file is part of the API for handling calendar data and defines the OccurrenceIterator class.
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Wed Jan 24 2024 00:00:00 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KCalCore Library

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

kdepimlibs-4.14.10 API Reference

Skip menu "kdepimlibs-4.14.10 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal