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