summaryrefslogtreecommitdiffabout
path: root/libkcal/todo.cpp
Unidiff
Diffstat (limited to 'libkcal/todo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 42274ff..e98af3c 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,581 +1,585 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <kglobalsettings.h> 22#include <kglobalsettings.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kdebug.h> 24#include <kdebug.h>
25#include <qregexp.h> 25#include <qregexp.h>
26#include <qfileinfo.h> 26#include <qfileinfo.h>
27 27
28#include "calendarlocal.h" 28#include "calendarlocal.h"
29#include "icalformat.h" 29#include "icalformat.h"
30#include "todo.h" 30#include "todo.h"
31 31
32using namespace KCal; 32using namespace KCal;
33 33
34Todo::Todo(): QObject(), Incidence() 34Todo::Todo(): QObject(), Incidence()
35{ 35{
36// mStatus = TENTATIVE; 36// mStatus = TENTATIVE;
37 37
38 mHasDueDate = false; 38 mHasDueDate = false;
39 setHasStartDate( false ); 39 setHasStartDate( false );
40 mCompleted = getEvenTime(QDateTime::currentDateTime()); 40 mCompleted = getEvenTime(QDateTime::currentDateTime());
41 mHasCompletedDate = false; 41 mHasCompletedDate = false;
42 mPercentComplete = 0; 42 mPercentComplete = 0;
43 mRunning = false; 43 mRunning = false;
44 mRunSaveTimer = 0; 44 mRunSaveTimer = 0;
45} 45}
46 46
47Todo::Todo(const Todo &t) : QObject(),Incidence(t) 47Todo::Todo(const Todo &t) : QObject(),Incidence(t)
48{ 48{
49 mDtDue = t.mDtDue; 49 mDtDue = t.mDtDue;
50 mHasDueDate = t.mHasDueDate; 50 mHasDueDate = t.mHasDueDate;
51 mCompleted = t.mCompleted; 51 mCompleted = t.mCompleted;
52 mHasCompletedDate = t.mHasCompletedDate; 52 mHasCompletedDate = t.mHasCompletedDate;
53 mPercentComplete = t.mPercentComplete; 53 mPercentComplete = t.mPercentComplete;
54 mRunning = false; 54 mRunning = false;
55 mRunSaveTimer = 0; 55 mRunSaveTimer = 0;
56} 56}
57 57
58Todo::~Todo() 58Todo::~Todo()
59{ 59{
60 setRunning( false ); 60 setRunning( false );
61 //qDebug("Todo::~Todo() "); 61 //qDebug("Todo::~Todo() ");
62} 62}
63 63
64void Todo::setRunningFalse( QString s ) 64void Todo::setRunningFalse( QString s )
65{ 65{
66 if ( ! mRunning ) 66 if ( ! mRunning )
67 return; 67 return;
68 mRunning = false; 68 mRunning = false;
69 mRunSaveTimer->stop(); 69 mRunSaveTimer->stop();
70 saveRunningInfoToFile( s ); 70 saveRunningInfoToFile( s );
71} 71}
72void Todo::setRunning( bool run ) 72void Todo::setRunning( bool run )
73{ 73{
74 if ( run == mRunning ) 74 if ( run == mRunning )
75 return; 75 return;
76 //qDebug("Todo::setRunning %d ", run); 76 //qDebug("Todo::setRunning %d ", run);
77 if ( !mRunSaveTimer ) { 77 if ( !mRunSaveTimer ) {
78 mRunSaveTimer = new QTimer ( this ); 78 mRunSaveTimer = new QTimer ( this );
79 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 79 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) );
80 } 80 }
81 mRunning = run; 81 mRunning = run;
82 if ( mRunning ) { 82 if ( mRunning ) {
83 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 83 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min
84 mRunStart = QDateTime::currentDateTime(); 84 mRunStart = QDateTime::currentDateTime();
85 } else { 85 } else {
86 mRunSaveTimer->stop(); 86 mRunSaveTimer->stop();
87 saveRunningInfoToFile(); 87 saveRunningInfoToFile();
88 } 88 }
89} 89}
90 90
91void Todo::saveRunningInfoToFile()
92{
93 saveRunningInfoToFile( QString::null );
94}
91void Todo::saveRunningInfoToFile( QString comment ) 95void Todo::saveRunningInfoToFile( QString comment )
92{ 96{
93 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 97 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
94 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 30 ) { 98 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 30 ) {
95 qDebug("Running time < 30 seconds. Skipped. "); 99 qDebug("Running time < 30 seconds. Skipped. ");
96 return; 100 return;
97 } 101 }
98 QString dir = KGlobalSettings::timeTrackerDir(); 102 QString dir = KGlobalSettings::timeTrackerDir();
99 //qDebug("%s ", dir.latin1()); 103 //qDebug("%s ", dir.latin1());
100 QString file = "%1%2%3-%4%5%6-"; 104 QString file = "%1%2%3-%4%5%6-";
101 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 ); 105 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 );
102 file.replace ( QRegExp (" "), "0" ); 106 file.replace ( QRegExp (" "), "0" );
103 file += uid(); 107 file += uid();
104 //qDebug("File %s ",file.latin1() ); 108 //qDebug("File %s ",file.latin1() );
105 CalendarLocal cal; 109 CalendarLocal cal;
106 cal.setLocalTime(); 110 cal.setLocalTime();
107 Todo * to = (Todo*) clone(); 111 Todo * to = (Todo*) clone();
108 to->setFloats( false ); 112 to->setFloats( false );
109 to->setDtStart( mRunStart ); 113 to->setDtStart( mRunStart );
110 to->setHasStartDate( true ); 114 to->setHasStartDate( true );
111 to->setDtDue( QDateTime::currentDateTime() ); 115 to->setDtDue( QDateTime::currentDateTime() );
112 to->setHasDueDate( true ); 116 to->setHasDueDate( true );
113 to->setUid( file ); 117 to->setUid( file );
114 if ( !comment.isEmpty() ) { 118 if ( !comment.isEmpty() ) {
115 QString des = to->description(); 119 QString des = to->description();
116 if ( des.isEmpty () ) 120 if ( des.isEmpty () )
117 to->setDescription( "TT-Note: " + comment ); 121 to->setDescription( "TT-Note: " + comment );
118 else 122 else
119 to->setDescription( "TT-Note: " + comment +"\n" + des ); 123 to->setDescription( "TT-Note: " + comment +"\n" + des );
120 } 124 }
121 cal.addIncidence( to ); 125 cal.addIncidence( to );
122 ICalFormat format; 126 ICalFormat format;
123 file = dir +"/" +file +".ics"; 127 file = dir +"/" +file +".ics";
124 format.save( &cal, file ); 128 format.save( &cal, file );
125 saveParents(); 129 saveParents();
126 130
127} 131}
128void Todo::saveParents() 132void Todo::saveParents()
129{ 133{
130 if (!relatedTo() ) 134 if (!relatedTo() )
131 return; 135 return;
132 Incidence * inc = relatedTo(); 136 Incidence * inc = relatedTo();
133 if ( inc->typeID() != todoID ) 137 if ( inc->typeID() != todoID )
134 return; 138 return;
135 Todo* to = (Todo*)inc; 139 Todo* to = (Todo*)inc;
136 bool saveTodo = false; 140 bool saveTodo = false;
137 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 141 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
138 QFileInfo fi ( file ); 142 QFileInfo fi ( file );
139 if ( fi.exists() ) { 143 if ( fi.exists() ) {
140 if ( fi.lastModified () < to->lastModified ()) 144 if ( fi.lastModified () < to->lastModified ())
141 saveTodo = true; 145 saveTodo = true;
142 } else { 146 } else {
143 saveTodo = true; 147 saveTodo = true;
144 } 148 }
145 if ( saveTodo ) { 149 if ( saveTodo ) {
146 CalendarLocal cal; 150 CalendarLocal cal;
147 cal.setLocalTime(); 151 cal.setLocalTime();
148 Todo * par = (Todo *) to->clone(); 152 Todo * par = (Todo *) to->clone();
149 cal.addIncidence( par ); 153 cal.addIncidence( par );
150 ICalFormat format; 154 ICalFormat format;
151 format.save( &cal, file ); 155 format.save( &cal, file );
152 } 156 }
153 to->saveParents(); 157 to->saveParents();
154} 158}
155 159
156int Todo::runTime() 160int Todo::runTime()
157{ 161{
158 if ( !mRunning ) 162 if ( !mRunning )
159 return 0; 163 return 0;
160 return mRunStart.secsTo( QDateTime::currentDateTime() ); 164 return mRunStart.secsTo( QDateTime::currentDateTime() );
161} 165}
162bool Todo::hasRunningSub() 166bool Todo::hasRunningSub()
163{ 167{
164 if ( mRunning ) 168 if ( mRunning )
165 return true; 169 return true;
166 Incidence *aTodo; 170 Incidence *aTodo;
167 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 171 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
168 if ( ((Todo*)aTodo)->hasRunningSub() ) 172 if ( ((Todo*)aTodo)->hasRunningSub() )
169 return true; 173 return true;
170 } 174 }
171 return false; 175 return false;
172} 176}
173Incidence *Todo::clone() 177Incidence *Todo::clone()
174{ 178{
175 return new Todo(*this); 179 return new Todo(*this);
176} 180}
177 181
178bool Todo::contains ( Todo* from ) 182bool Todo::contains ( Todo* from )
179{ 183{
180 184
181 if ( !from->summary().isEmpty() ) 185 if ( !from->summary().isEmpty() )
182 if ( !summary().startsWith( from->summary() )) 186 if ( !summary().startsWith( from->summary() ))
183 return false; 187 return false;
184 if ( from->hasStartDate() ) { 188 if ( from->hasStartDate() ) {
185 if ( !hasStartDate() ) 189 if ( !hasStartDate() )
186 return false; 190 return false;
187 if ( from->dtStart() != dtStart()) 191 if ( from->dtStart() != dtStart())
188 return false; 192 return false;
189 } 193 }
190 if ( from->hasDueDate() ){ 194 if ( from->hasDueDate() ){
191 if ( !hasDueDate() ) 195 if ( !hasDueDate() )
192 return false; 196 return false;
193 if ( from->dtDue() != dtDue()) 197 if ( from->dtDue() != dtDue())
194 return false; 198 return false;
195 } 199 }
196 if ( !from->location().isEmpty() ) 200 if ( !from->location().isEmpty() )
197 if ( !location().startsWith( from->location() ) ) 201 if ( !location().startsWith( from->location() ) )
198 return false; 202 return false;
199 if ( !from->description().isEmpty() ) 203 if ( !from->description().isEmpty() )
200 if ( !description().startsWith( from->description() )) 204 if ( !description().startsWith( from->description() ))
201 return false; 205 return false;
202 if ( from->alarms().count() ) { 206 if ( from->alarms().count() ) {
203 Alarm *a = from->alarms().first(); 207 Alarm *a = from->alarms().first();
204 if ( a->enabled() ){ 208 if ( a->enabled() ){
205 if ( !alarms().count() ) 209 if ( !alarms().count() )
206 return false; 210 return false;
207 Alarm *b = alarms().first(); 211 Alarm *b = alarms().first();
208 if( ! b->enabled() ) 212 if( ! b->enabled() )
209 return false; 213 return false;
210 if ( ! (a->offset() == b->offset() )) 214 if ( ! (a->offset() == b->offset() ))
211 return false; 215 return false;
212 } 216 }
213 } 217 }
214 218
215 QStringList cat = categories(); 219 QStringList cat = categories();
216 QStringList catFrom = from->categories(); 220 QStringList catFrom = from->categories();
217 QString nCat; 221 QString nCat;
218 unsigned int iii; 222 unsigned int iii;
219 for ( iii = 0; iii < catFrom.count();++iii ) { 223 for ( iii = 0; iii < catFrom.count();++iii ) {
220 nCat = catFrom[iii]; 224 nCat = catFrom[iii];
221 if ( !nCat.isEmpty() ) 225 if ( !nCat.isEmpty() )
222 if ( !cat.contains( nCat )) { 226 if ( !cat.contains( nCat )) {
223 return false; 227 return false;
224 } 228 }
225 } 229 }
226 if ( from->isCompleted() ) { 230 if ( from->isCompleted() ) {
227 if ( !isCompleted() ) 231 if ( !isCompleted() )
228 return false; 232 return false;
229 } 233 }
230 if( priority() != from->priority() ) 234 if( priority() != from->priority() )
231 return false; 235 return false;
232 236
233 237
234 return true; 238 return true;
235 239
236} 240}
237bool KCal::operator==( const Todo& t1, const Todo& t2 ) 241bool KCal::operator==( const Todo& t1, const Todo& t2 )
238{ 242{
239 243
240 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 244 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
241 if ( ! ret ) 245 if ( ! ret )
242 return false; 246 return false;
243 if ( t1.hasDueDate() == t2.hasDueDate() ) { 247 if ( t1.hasDueDate() == t2.hasDueDate() ) {
244 if ( t1.hasDueDate() ) { 248 if ( t1.hasDueDate() ) {
245 if ( t1.doesFloat() == t2.doesFloat() ) { 249 if ( t1.doesFloat() == t2.doesFloat() ) {
246 if ( t1.doesFloat() ) { 250 if ( t1.doesFloat() ) {
247 if ( t1.dtDue().date() != t2.dtDue().date() ) 251 if ( t1.dtDue().date() != t2.dtDue().date() )
248 return false; 252 return false;
249 } else 253 } else
250 if ( t1.dtDue() != t2.dtDue() ) 254 if ( t1.dtDue() != t2.dtDue() )
251 return false; 255 return false;
252 } else 256 } else
253 return false;// float != 257 return false;// float !=
254 } 258 }
255 259
256 } else 260 } else
257 return false; 261 return false;
258 if ( t1.percentComplete() != t2.percentComplete() ) 262 if ( t1.percentComplete() != t2.percentComplete() )
259 return false; 263 return false;
260 if ( t1.isCompleted() ) { 264 if ( t1.isCompleted() ) {
261 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 265 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
262 if ( t1.hasCompletedDate() ) { 266 if ( t1.hasCompletedDate() ) {
263 if ( t1.completed() != t2.completed() ) 267 if ( t1.completed() != t2.completed() )
264 return false; 268 return false;
265 } 269 }
266 270
267 } else 271 } else
268 return false; 272 return false;
269 } 273 }
270 return true; 274 return true;
271 275
272} 276}
273 277
274void Todo::setDtDue(const QDateTime &dtDue) 278void Todo::setDtDue(const QDateTime &dtDue)
275{ 279{
276 //int diffsecs = mDtDue.secsTo(dtDue); 280 //int diffsecs = mDtDue.secsTo(dtDue);
277 281
278 /*if (mReadOnly) return; 282 /*if (mReadOnly) return;
279 const QPtrList<Alarm>& alarms = alarms(); 283 const QPtrList<Alarm>& alarms = alarms();
280 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 284 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
281 if (alarm->enabled()) { 285 if (alarm->enabled()) {
282 alarm->setTime(alarm->time().addSecs(diffsecs)); 286 alarm->setTime(alarm->time().addSecs(diffsecs));
283 } 287 }
284 }*/ 288 }*/
285 mDtDue = getEvenTime(dtDue); 289 mDtDue = getEvenTime(dtDue);
286 290
287 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 291 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
288 292
289 /*const QPtrList<Alarm>& alarms = alarms(); 293 /*const QPtrList<Alarm>& alarms = alarms();
290 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 294 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
291 alarm->setAlarmStart(mDtDue);*/ 295 alarm->setAlarmStart(mDtDue);*/
292 updated(); 296 updated();
293} 297}
294 298
295QDateTime Todo::dtDue() const 299QDateTime Todo::dtDue() const
296{ 300{
297 return mDtDue; 301 return mDtDue;
298} 302}
299 303
300QString Todo::dtDueTimeStr() const 304QString Todo::dtDueTimeStr() const
301{ 305{
302 return KGlobal::locale()->formatTime(mDtDue.time()); 306 return KGlobal::locale()->formatTime(mDtDue.time());
303} 307}
304 308
305QString Todo::dtDueDateStr(bool shortfmt) const 309QString Todo::dtDueDateStr(bool shortfmt) const
306{ 310{
307 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 311 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
308} 312}
309 313
310QString Todo::dtDueStr(bool shortfmt) const 314QString Todo::dtDueStr(bool shortfmt) const
311{ 315{
312 if ( doesFloat() ) 316 if ( doesFloat() )
313 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 317 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
314 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 318 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
315} 319}
316// retval 0 : no found 320// retval 0 : no found
317// 1 : due for date found 321// 1 : due for date found
318// 2 : overdue for date found 322// 2 : overdue for date found
319int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 323int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
320{ 324{
321 int retval = 0; 325 int retval = 0;
322 if ( isCompleted() ) 326 if ( isCompleted() )
323 return 0; 327 return 0;
324 if ( hasDueDate() ) { 328 if ( hasDueDate() ) {
325 if ( dtDue().date() < date ) 329 if ( dtDue().date() < date )
326 return 2; 330 return 2;
327 // we do not return, because we may find an overdue sub todo 331 // we do not return, because we may find an overdue sub todo
328 if ( dtDue().date() == date ) 332 if ( dtDue().date() == date )
329 retval = 1; 333 retval = 1;
330 } 334 }
331 if ( checkSubtodos ) { 335 if ( checkSubtodos ) {
332 Incidence *aTodo; 336 Incidence *aTodo;
333 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 337 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
334 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 338 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
335 if ( ret == 2 ) 339 if ( ret == 2 )
336 return 2; 340 return 2;
337 if ( ret == 1) 341 if ( ret == 1)
338 retval = 1; 342 retval = 1;
339 } 343 }
340 } 344 }
341 return retval; 345 return retval;
342} 346}
343int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 347int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
344{ 348{
345 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 349 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
346} 350}
347bool Todo::hasDueDate() const 351bool Todo::hasDueDate() const
348{ 352{
349 return mHasDueDate; 353 return mHasDueDate;
350} 354}
351 355
352void Todo::setHasDueDate(bool f) 356void Todo::setHasDueDate(bool f)
353{ 357{
354 if (mReadOnly) return; 358 if (mReadOnly) return;
355 mHasDueDate = f; 359 mHasDueDate = f;
356 updated(); 360 updated();
357} 361}
358 362
359 363
360#if 0 364#if 0
361void Todo::setStatus(const QString &statStr) 365void Todo::setStatus(const QString &statStr)
362{ 366{
363 if (mReadOnly) return; 367 if (mReadOnly) return;
364 QString ss(statStr.upper()); 368 QString ss(statStr.upper());
365 369
366 if (ss == "X-ACTION") 370 if (ss == "X-ACTION")
367 mStatus = NEEDS_ACTION; 371 mStatus = NEEDS_ACTION;
368 else if (ss == "NEEDS ACTION") 372 else if (ss == "NEEDS ACTION")
369 mStatus = NEEDS_ACTION; 373 mStatus = NEEDS_ACTION;
370 else if (ss == "ACCEPTED") 374 else if (ss == "ACCEPTED")
371 mStatus = ACCEPTED; 375 mStatus = ACCEPTED;
372 else if (ss == "SENT") 376 else if (ss == "SENT")
373 mStatus = SENT; 377 mStatus = SENT;
374 else if (ss == "TENTATIVE") 378 else if (ss == "TENTATIVE")
375 mStatus = TENTATIVE; 379 mStatus = TENTATIVE;
376 else if (ss == "CONFIRMED") 380 else if (ss == "CONFIRMED")
377 mStatus = CONFIRMED; 381 mStatus = CONFIRMED;
378 else if (ss == "DECLINED") 382 else if (ss == "DECLINED")
379 mStatus = DECLINED; 383 mStatus = DECLINED;
380 else if (ss == "COMPLETED") 384 else if (ss == "COMPLETED")
381 mStatus = COMPLETED; 385 mStatus = COMPLETED;
382 else if (ss == "DELEGATED") 386 else if (ss == "DELEGATED")
383 mStatus = DELEGATED; 387 mStatus = DELEGATED;
384 388
385 updated(); 389 updated();
386} 390}
387 391
388void Todo::setStatus(int status) 392void Todo::setStatus(int status)
389{ 393{
390 if (mReadOnly) return; 394 if (mReadOnly) return;
391 mStatus = status; 395 mStatus = status;
392 updated(); 396 updated();
393} 397}
394 398
395int Todo::status() const 399int Todo::status() const
396{ 400{
397 return mStatus; 401 return mStatus;
398} 402}
399 403
400QString Todo::statusStr() const 404QString Todo::statusStr() const
401{ 405{
402 switch(mStatus) { 406 switch(mStatus) {
403 case NEEDS_ACTION: 407 case NEEDS_ACTION:
404 return QString("NEEDS ACTION"); 408 return QString("NEEDS ACTION");
405 break; 409 break;
406 case ACCEPTED: 410 case ACCEPTED:
407 return QString("ACCEPTED"); 411 return QString("ACCEPTED");
408 break; 412 break;
409 case SENT: 413 case SENT:
410 return QString("SENT"); 414 return QString("SENT");
411 break; 415 break;
412 case TENTATIVE: 416 case TENTATIVE:
413 return QString("TENTATIVE"); 417 return QString("TENTATIVE");
414 break; 418 break;
415 case CONFIRMED: 419 case CONFIRMED:
416 return QString("CONFIRMED"); 420 return QString("CONFIRMED");
417 break; 421 break;
418 case DECLINED: 422 case DECLINED:
419 return QString("DECLINED"); 423 return QString("DECLINED");
420 break; 424 break;
421 case COMPLETED: 425 case COMPLETED:
422 return QString("COMPLETED"); 426 return QString("COMPLETED");
423 break; 427 break;
424 case DELEGATED: 428 case DELEGATED:
425 return QString("DELEGATED"); 429 return QString("DELEGATED");
426 break; 430 break;
427 } 431 }
428 return QString(""); 432 return QString("");
429} 433}
430#endif 434#endif
431 435
432bool Todo::isCompleted() const 436bool Todo::isCompleted() const
433{ 437{
434 if (mPercentComplete == 100) { 438 if (mPercentComplete == 100) {
435 return true; 439 return true;
436 } 440 }
437 else return false; 441 else return false;
438} 442}
439 443
440void Todo::setCompleted(bool completed) 444void Todo::setCompleted(bool completed)
441{ 445{
442 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) { 446 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
443 if ( !setRecurDates() ) 447 if ( !setRecurDates() )
444 completed = false; 448 completed = false;
445 } 449 }
446 if (completed) mPercentComplete = 100; 450 if (completed) mPercentComplete = 100;
447 else { 451 else {
448 mPercentComplete = 0; 452 mPercentComplete = 0;
449 mHasCompletedDate = false; 453 mHasCompletedDate = false;
450 } 454 }
451 updated(); 455 updated();
452} 456}
453 457
454QDateTime Todo::completed() const 458QDateTime Todo::completed() const
455{ 459{
456 return mCompleted; 460 return mCompleted;
457} 461}
458 462
459QString Todo::completedStr( bool shortF ) const 463QString Todo::completedStr( bool shortF ) const
460{ 464{
461 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 465 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
462} 466}
463 467
464void Todo::setCompleted(const QDateTime &completed) 468void Todo::setCompleted(const QDateTime &completed)
465{ 469{
466 //qDebug("Todo::setCompleted "); 470 //qDebug("Todo::setCompleted ");
467 if ( mHasCompletedDate ) { 471 if ( mHasCompletedDate ) {
468 // qDebug("has completed data - return "); 472 // qDebug("has completed data - return ");
469 return; 473 return;
470 } 474 }
471 mHasCompletedDate = true; 475 mHasCompletedDate = true;
472 mPercentComplete = 100; 476 mPercentComplete = 100;
473 mCompleted = getEvenTime(completed); 477 mCompleted = getEvenTime(completed);
474 updated(); 478 updated();
475} 479}
476 480
477bool Todo::hasCompletedDate() const 481bool Todo::hasCompletedDate() const
478{ 482{
479 return mHasCompletedDate; 483 return mHasCompletedDate;
480} 484}
481 485
482int Todo::percentComplete() const 486int Todo::percentComplete() const
483{ 487{
484 return mPercentComplete; 488 return mPercentComplete;
485} 489}
486bool Todo::setRecurDates() 490bool Todo::setRecurDates()
487{ 491{
488 if ( !mHasRecurrenceID ) 492 if ( !mHasRecurrenceID )
489 return true; 493 return true;
490 int secs = mDtStart.secsTo( dtDue() ); 494 int secs = mDtStart.secsTo( dtDue() );
491 bool ok; 495 bool ok;
492 qDebug("T:setRecurDates() "); 496 qDebug("T:setRecurDates() ");
493 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 497 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
494 QDateTime next = getNextOccurence( mRecurrenceID, &ok ); 498 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
495 if ( ok ) { 499 if ( ok ) {
496 mRecurrenceID = next; 500 mRecurrenceID = next;
497 mDtStart = next; 501 mDtStart = next;
498 setDtDue( next.addSecs( secs ) ); 502 setDtDue( next.addSecs( secs ) );
499 if ( QDateTime::currentDateTime() > next) 503 if ( QDateTime::currentDateTime() > next)
500 return false; 504 return false;
501 } else { 505 } else {
502 setHasRecurrenceID( false ); 506 setHasRecurrenceID( false );
503 recurrence()->unsetRecurs(); 507 recurrence()->unsetRecurs();
504 } 508 }
505 return true; 509 return true;
506} 510}
507void Todo::setPercentComplete(int v) 511void Todo::setPercentComplete(int v)
508{ 512{
509 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) { 513 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
510 if ( !setRecurDates() ) 514 if ( !setRecurDates() )
511 v = 0; 515 v = 0;
512 } 516 }
513 mPercentComplete = v; 517 mPercentComplete = v;
514 if ( v != 100 ) 518 if ( v != 100 )
515 mHasCompletedDate = false; 519 mHasCompletedDate = false;
516 updated(); 520 updated();
517} 521}
518QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 522QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
519{ 523{
520 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) { 524 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) {
521 *ok = false; 525 *ok = false;
522 return QDateTime (); 526 return QDateTime ();
523 } 527 }
524 QDateTime incidenceStart; 528 QDateTime incidenceStart;
525 incidenceStart = dtDue(); 529 incidenceStart = dtDue();
526 bool enabled = false; 530 bool enabled = false;
527 Alarm* alarm; 531 Alarm* alarm;
528 int off = 0; 532 int off = 0;
529 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 533 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
530 // if ( QDateTime::currentDateTime() > incidenceStart ){ 534 // if ( QDateTime::currentDateTime() > incidenceStart ){
531// *ok = false; 535// *ok = false;
532// return incidenceStart; 536// return incidenceStart;
533// } 537// }
534 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 538 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
535 if (alarm->enabled()) { 539 if (alarm->enabled()) {
536 if ( alarm->hasTime () ) { 540 if ( alarm->hasTime () ) {
537 if ( alarm->time() < alarmStart ) { 541 if ( alarm->time() < alarmStart ) {
538 alarmStart = alarm->time(); 542 alarmStart = alarm->time();
539 enabled = true; 543 enabled = true;
540 off = alarmStart.secsTo( incidenceStart ); 544 off = alarmStart.secsTo( incidenceStart );
541 } 545 }
542 546
543 } else { 547 } else {
544 int secs = alarm->startOffset().asSeconds(); 548 int secs = alarm->startOffset().asSeconds();
545 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 549 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
546 alarmStart = incidenceStart.addSecs( secs ); 550 alarmStart = incidenceStart.addSecs( secs );
547 enabled = true; 551 enabled = true;
548 off = -secs; 552 off = -secs;
549 } 553 }
550 } 554 }
551 } 555 }
552 } 556 }
553 if ( enabled ) { 557 if ( enabled ) {
554 if ( alarmStart > start_dt ) { 558 if ( alarmStart > start_dt ) {
555 *ok = true; 559 *ok = true;
556 * offset = off; 560 * offset = off;
557 return alarmStart; 561 return alarmStart;
558 } 562 }
559 } 563 }
560 *ok = false; 564 *ok = false;
561 return QDateTime (); 565 return QDateTime ();
562 566
563} 567}
564 568
565void Todo::checkSetCompletedFalse() 569void Todo::checkSetCompletedFalse()
566{ 570{
567 if ( !mHasRecurrenceID ) { 571 if ( !mHasRecurrenceID ) {
568 qDebug("ERROR 1 in Todo::checkSetCompletedFalse"); 572 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
569 return; 573 return;
570 } 574 }
571 // qDebug("Todo::checkSetCompletedFalse()"); 575 // qDebug("Todo::checkSetCompletedFalse()");
572 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 576 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
573 if ( mPercentComplete == 100 ) { 577 if ( mPercentComplete == 100 ) {
574 QDateTime dt = QDateTime::currentDateTime(); 578 QDateTime dt = QDateTime::currentDateTime();
575 if ( dt > mDtStart && dt > mRecurrenceID ) { 579 if ( dt > mDtStart && dt > mRecurrenceID ) {
576 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 580 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
577 setCompleted( false ); 581 setCompleted( false );
578 qDebug("Todo::checkSetCompletedFalse "); 582 qDebug("Todo::checkSetCompletedFalse ");
579 } 583 }
580 } 584 }
581} 585}