libkcal

todo.cpp
1/*
2 This file is part of libkcal.
3
4 Copyright (c) 2001-2003 Cornelius Schumacher <schumacher@kde.org>
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*/
21
22#include <tdeglobal.h>
23#include <tdelocale.h>
24#include <kdebug.h>
25
26#include "todo.h"
27
28using namespace KCal;
29
30Todo::Todo()
31{
32 mHasDueDate = false;
33 mHasStartDate = false;
34
35 mHasCompletedDate = false;
36 mPercentComplete = 0;
37}
38
39Todo::Todo(const Todo &t) : Incidence(t)
40{
41 mDtDue = t.mDtDue;
42 mHasDueDate = t.mHasDueDate;
43 mHasStartDate = t.mHasStartDate;
44 mCompleted = t.mCompleted;
45 mHasCompletedDate = t.mHasCompletedDate;
46 mPercentComplete = t.mPercentComplete;
47 mDtRecurrence = t.mDtRecurrence;
48}
49
50Todo::~Todo()
51{
52}
53
55{
56 return new Todo( *this );
57}
58
59
60Todo& Todo::operator=( const Todo &t )
61{
62 Incidence::operator=( t );
63 mDtDue = t.mDtDue;
64 mHasDueDate = t.mHasDueDate;
65 mHasStartDate = t.mHasStartDate;
66 mCompleted = t.mCompleted;
67 mHasCompletedDate = t.mHasCompletedDate;
68 mPercentComplete = t.mPercentComplete;
69 mDtRecurrence = t.mDtRecurrence;
70 return *this;
71}
72
73bool Todo::operator==( const Todo& t2 ) const
74{
75 return
76 static_cast<const Incidence&>(*this) == static_cast<const Incidence&>(t2) &&
77 dtDue() == t2.dtDue() &&
78 hasDueDate() == t2.hasDueDate() &&
79 hasStartDate() == t2.hasStartDate() &&
80 completed() == t2.completed() &&
83}
84
85void Todo::setDtDue(const TQDateTime &dtDue, bool first )
86{
87 //int diffsecs = mDtDue.secsTo(dtDue);
88
89 /*if (mReadOnly) return;
90 const Alarm::List& alarms = alarms();
91 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
92 if (alarm->enabled()) {
93 alarm->setTime(alarm->time().addSecs(diffsecs));
94 }
95 }*/
96 if( doesRecur() && !first ) {
97 mDtRecurrence = dtDue;
98 } else {
99 mDtDue = dtDue;
100 // TODO: This doesn't seem right...
103 }
104
105 if ( doesRecur() && dtDue < recurrence()->startDateTime() )
106 setDtStart( dtDue );
107
108 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
109
110 /*const Alarm::List& alarms = alarms();
111 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
112 alarm->setAlarmStart(mDtDue);*/
113
114 updated();
115}
116
117TQDateTime Todo::dtDue( bool first ) const
118{
119 if ( doesRecur() && !first && mDtRecurrence.isValid() ) {
120 return mDtRecurrence;
121 } else if ( hasDueDate() ) {
122 return mDtDue;
123 } else {
124 return TQDateTime();
125 }
126}
127
128TQString Todo::dtDueTimeStr() const
129{
130 return TDEGlobal::locale()->formatTime( dtDue(!doesRecur()).time() );
131}
132
133TQString Todo::dtDueDateStr(bool shortfmt) const
134{
135 return TDEGlobal::locale()->formatDate(dtDue( !doesRecur() ).date(),shortfmt);
136}
137
138// TODO: Add shortfmt param!!!
139TQString Todo::dtDueStr() const
140{
141 return TDEGlobal::locale()->formatDateTime( dtDue( !doesRecur() ) );
142}
143
145{
146 return mHasDueDate;
147}
148
150{
151 if (mReadOnly) return;
152 mHasDueDate = f;
153 updated();
154}
155
156
158{
159 return mHasStartDate;
160}
161
163{
164 if (mReadOnly) return;
165
166 if ( doesRecur() && !f ) {
167 if ( !comments().grep("NoStartDate").count() )
168 addComment("NoStartDate"); //TODO: --> custom flag?
169 } else {
170 TQString s("NoStartDate");
171 removeComment(s);
172 }
173 mHasStartDate = f;
174 updated();
175}
176
177TQDateTime Todo::dtStart( bool first ) const
178{
179 if ( doesRecur() && !first ) {
180 TQDateTime dt = mDtRecurrence.addDays( dtDue( true ).daysTo( IncidenceBase::dtStart() ) );
181
182 // We want the dtStart's time, not dtDue's
183 dt.setTime( IncidenceBase::dtStart().time() );
184 return dt;
185 } else if ( hasStartDate() ) {
186 return IncidenceBase::dtStart();
187 } else {
188 return TQDateTime();
189 }
190}
191
192void Todo::setDtStart( const TQDateTime &dtStart )
193{
194 // TODO: This doesn't seem right (rfc 2445/6 says, recurrence is calculated from the dtstart...)
195 if ( doesRecur() ) {
196 recurrence()->setStartDateTime( mDtDue );
198 }
200}
201
202TQString Todo::dtStartTimeStr( bool first ) const
203{
204 return TDEGlobal::locale()->formatTime(dtStart(first).time());
205}
206
207TQString Todo::dtStartDateStr(bool shortfmt, bool first) const
208{
209 return TDEGlobal::locale()->formatDate(dtStart(first).date(),shortfmt);
210}
211
212TQString Todo::dtStartStr(bool first) const
213{
214 return TDEGlobal::locale()->formatDateTime(dtStart(first));
215}
216
218{
219 if (mPercentComplete == 100) return true;
220 else return false;
221}
222
223void Todo::setCompleted(bool completed)
224{
225 if (completed)
226 mPercentComplete = 100;
227 else {
228 mPercentComplete = 0;
229 mHasCompletedDate = false;
230 mCompleted = TQDateTime();
231 }
232 updated();
233}
234
235TQDateTime Todo::completed() const
236{
237 if ( hasCompletedDate() )
238 return mCompleted;
239 else
240 return TQDateTime();
241}
242
243TQString Todo::completedStr() const
244{
245 return TDEGlobal::locale()->formatDateTime(mCompleted);
246}
247
248void Todo::setCompleted(const TQDateTime &completed)
249{
250 if( !recurTodo() ) {
251 mHasCompletedDate = true;
252 mPercentComplete = 100;
253 mCompleted = completed;
254 }
255 updated();
256}
257
259{
260 return mHasCompletedDate;
261}
262
264{
265 return mPercentComplete;
266}
267
269{
270 mPercentComplete = v;
271 if ( v != 100 ) {
272 mHasCompletedDate = false;
273 mCompleted = TQDateTime();
274 }
275
276 updated();
277}
278
279void Todo::setDtRecurrence( const TQDateTime &dt )
280{
281 mDtRecurrence = dt;
282}
283
284TQDateTime Todo::dtRecurrence() const
285{
286 return mDtRecurrence.isValid() ? mDtRecurrence : mDtDue;
287}
288
289bool Todo::recursOn( const TQDate &date ) const
290{
291 TQDate today = TQDate::currentDate();
292 return ( Incidence::recursOn(date) &&
293 !( date < today && mDtRecurrence.date() < today &&
294 mDtRecurrence > recurrence()->startDateTime() ) );
295}
296
297bool Todo::recurTodo()
298{
299 if ( doesRecur() ) {
300 Recurrence *r = recurrence();
301 TQDateTime endDateTime = r->endDateTime();
302 TQDateTime nextDate = r->getNextDateTime( dtDue() );
303
304 if ( ( r->duration() == -1 || ( nextDate.isValid() && endDateTime.isValid()
305 && nextDate <= endDateTime ) ) ) {
306
307 while ( !recursAt( nextDate ) || nextDate <= TQDateTime::currentDateTime() ) {
308
309 if ( !nextDate.isValid() ||
310 ( nextDate > endDateTime && r->duration() != -1 ) ) {
311 return false;
312 }
313
314 nextDate = r->getNextDateTime( nextDate );
315 }
316
317 setDtDue( nextDate );
318 setCompleted( false );
319 setRevision( revision() + 1 );
320
321 return true;
322 }
323 }
324
325 return false;
326}
327
328bool Todo::isOverdue() const
329{
330 bool inPast = doesFloat() ? dtDue().date() < TQDate::currentDate()
331 : dtDue() < TQDateTime::currentDateTime();
332 return ( inPast && !isCompleted() );
333}
void updated()
Call this to notify the observers after the IncidenceBas object has changed.
virtual TDE_DEPRECATED TQString dtStartTimeStr() const
returns an event's starting time as a string formatted according to the users locale settings.
TQStringList comments() const
Return all comments associated with this incidence.
bool doesFloat() const
Return true or false depending on whether the incidence "floats," i.e.
bool removeComment(const TQString &comment)
Remove a comment from the event.
virtual TDE_DEPRECATED TQString dtStartStr() const
returns an event's starting date and time as a string formatted according to the users locale setting...
void addComment(const TQString &comment)
Add a comment to this incidence.
virtual TQDateTime dtStart() const
returns an event's starting date/time as a TQDateTime.
virtual void setDtStart(const TQDateTime &dtStart)
for setting the event's starting date/time with a TQDateTime.
This class provides the base class common to all calendar components.
Definition: incidence.h:48
bool recursAt(const TQDateTime &qdt) const
Returns true if the date/time specified is one on which the incidence will recur.
Definition: incidence.cpp:430
int revision() const
Return the number of revisions this event has seen.
Definition: incidence.cpp:259
bool doesRecur() const
Forward to Recurrence::doesRecur().
Definition: incidence.cpp:416
Recurrence * recurrence() const
Return the recurrence rule associated with this incidence.
Definition: incidence.cpp:390
void setRevision(int rev)
Set the number of revisions this event has seen.
Definition: incidence.cpp:251
virtual bool recursOn(const TQDate &qd) const
Returns true if the date specified is one on which the incidence will recur.
Definition: incidence.cpp:422
This class represents a recurrence rule for a calendar incidence.
Definition: recurrence.h:90
void setFloats(bool floats)
Sets whether the dtstart is a floating time (i.e.
Definition: recurrence.cpp:133
TQDateTime endDateTime() const
Returns the date/time of the last recurrence.
Definition: recurrence.cpp:351
void setStartDateTime(const TQDateTime &start)
Set start of recurrence, as a date and time.
Definition: recurrence.cpp:444
int duration() const
Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the total number of re...
Definition: recurrence.cpp:395
TQDateTime getNextDateTime(const TQDateTime &preDateTime) const
Returns the date and time of the next recurrence, after the specified date/time.
Definition: recurrence.cpp:837
This class provides a Todo in the sense of RFC2445.
Definition: todo.h:32
TQDateTime dtRecurrence() const
Returns the due date/time of the current occurrence if recurrent.
Definition: todo.cpp:284
bool hasDueDate() const
Returns true if the todo has a due date, otherwise return false.
Definition: todo.cpp:144
TQString completedStr() const
Returns string contaiting date and time when the todo was completed formatted according to the users ...
Definition: todo.cpp:243
bool isCompleted() const
Returns true if the todo is 100% completed, otherwise return false.
Definition: todo.cpp:217
void setDtRecurrence(const TQDateTime &dt)
Sets the due date/time of the current occurrence if recurrent.
Definition: todo.cpp:279
TDE_DEPRECATED TQString dtDueTimeStr() const
Returns due time as string formatted according to the users locale settings.
Definition: todo.cpp:128
TDE_DEPRECATED TQString dtDueDateStr(bool shortfmt=true) const
Returns due date as string formatted according to the users locale settings.
Definition: todo.cpp:133
bool hasStartDate() const
Returns true if the todo has a start date, otherwise return false.
Definition: todo.cpp:157
Todo * clone()
Returns an exact copy of this todo.
Definition: todo.cpp:54
void setDtDue(const TQDateTime &dtDue, bool first=false)
Sets due date and time.
Definition: todo.cpp:85
void setCompleted(bool completed)
Set completed state.
Definition: todo.cpp:223
bool isOverdue() const
Returns true if this todo is overdue (e.g.
Definition: todo.cpp:328
TQDateTime completed() const
Returns date and time when todo was completed.
Definition: todo.cpp:235
virtual bool recursOn(const TQDate &date) const
Returns true if the date specified is one on which the todo will recur.
Definition: todo.cpp:289
TQString dtStartDateStr(bool shortfmt=true, bool first=false) const
Returns an todo's starting date as a string formatted according to the users locale settings.
Definition: todo.cpp:207
void setHasStartDate(bool hasStartDate)
Set if the todo has a start date.
Definition: todo.cpp:162
TDE_DEPRECATED TQString dtDueStr() const
Returns due date and time as string formatted according to the users locale settings.
Definition: todo.cpp:139
void setDtStart(const TQDateTime &dtStart)
Sets the startdate of the todo.
Definition: todo.cpp:192
int percentComplete() const
Returns how many percent of the task are completed.
Definition: todo.cpp:263
bool hasCompletedDate() const
Returns true, if todo has a date associated with completion, otherwise return false.
Definition: todo.cpp:258
TQDateTime dtDue(bool first=false) const
Returns due date and time.
Definition: todo.cpp:117
void setHasDueDate(bool hasDueDate)
Set if the todo has a due date.
Definition: todo.cpp:149
void setPercentComplete(int)
Set how many percent of the task are completed.
Definition: todo.cpp:268
Namespace KCal is for global classes, objects and/or functions in libkcal.
Definition: alarm.h:38