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