summaryrefslogtreecommitdiffabout
path: root/libkcal/todo.cpp
Unidiff
Diffstat (limited to 'libkcal/todo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index de07496..f7d40ad 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,260 +1,272 @@
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
32#define SAVETIMER_TIMEOUT_SECONDS 300 32#define SAVETIMER_TIMEOUT_SECONDS 300
33//#define SAVETIMER_TIMEOUT_SECONDS 8 33//#define SAVETIMER_TIMEOUT_SECONDS 8
34#define SAVETIMER_TIMEOUT_RETRY_SECONDS 5 34#define SAVETIMER_TIMEOUT_RETRY_SECONDS 5
35 35
36using namespace KCal; 36using namespace KCal;
37 37
38Todo::Todo(): QObject(), Incidence() 38Todo::Todo(): QObject(), Incidence()
39{ 39{
40// mStatus = TENTATIVE; 40// mStatus = TENTATIVE;
41 41
42 mHasDueDate = false; 42 mHasDueDate = false;
43 setHasStartDate( false ); 43 setHasStartDate( false );
44 mCompleted = getEvenTime(QDateTime::currentDateTime()); 44 mCompleted = getEvenTime(QDateTime::currentDateTime());
45 mHasCompletedDate = false; 45 mHasCompletedDate = false;
46 mPercentComplete = 0; 46 mPercentComplete = 0;
47 mRunning = false; 47 mRunning = false;
48 mRunSaveTimer = 0; 48 mRunSaveTimer = 0;
49 setFloats( true ); 49 setFloats( true );
50 mCurrentTimerDelay = 0; 50 mCurrentTimerDelay = 0;
51} 51}
52 52
53Todo::Todo(const Todo &t) : QObject(),Incidence(t) 53Todo::Todo(const Todo &t) : QObject(),Incidence(t)
54{ 54{
55 mDtDue = t.mDtDue; 55 mDtDue = t.mDtDue;
56 mHasDueDate = t.mHasDueDate; 56 mHasDueDate = t.mHasDueDate;
57 mCompleted = t.mCompleted; 57 mCompleted = t.mCompleted;
58 mHasCompletedDate = t.mHasCompletedDate; 58 mHasCompletedDate = t.mHasCompletedDate;
59 mPercentComplete = t.mPercentComplete; 59 mPercentComplete = t.mPercentComplete;
60 mRunning = false; 60 mRunning = false;
61 mRunSaveTimer = 0; 61 mRunSaveTimer = 0;
62 mCurrentTimerDelay = 0; 62 mCurrentTimerDelay = 0;
63} 63}
64 64
65Todo::~Todo() 65Todo::~Todo()
66{ 66{
67 setRunning( false ); 67 setRunning( false );
68 //qDebug("Todo::~Todo() "); 68 //qDebug("Todo::~Todo() ");
69} 69}
70 70
71void Todo::setRunningFalse( QString s ) 71void Todo::setRunningFalse( QString s )
72{ 72{
73 if ( ! mRunning ) 73 if ( ! mRunning )
74 return; 74 return;
75 mRunning = false; 75 mRunning = false;
76 if ( mRunSaveTimer ) 76 if ( mRunSaveTimer )
77 mRunSaveTimer->stop(); 77 mRunSaveTimer->stop();
78 saveRunningInfoToFile( s ); 78 saveRunningInfoToFile( s );
79} 79}
80void Todo::stopRunning() 80void Todo::stopRunning()
81{ 81{
82 if ( !mRunning ) 82 if ( !mRunning )
83 return; 83 return;
84 if ( mRunSaveTimer ) 84 if ( mRunSaveTimer )
85 mRunSaveTimer->stop(); 85 mRunSaveTimer->stop();
86 mRunning = false; 86 mRunning = false;
87} 87}
88void Todo::setRunning( bool run ) 88void Todo::setRunning( bool run )
89{ 89{
90 if ( run == mRunning ) 90 if ( run == mRunning )
91 return; 91 return;
92 //qDebug("Todo::setRunning %d ", run); 92 //qDebug("Todo::setRunning %d ", run);
93 if ( !mRunSaveTimer ) { 93 if ( !mRunSaveTimer ) {
94 mRunSaveTimer = new QTimer ( this ); 94 mRunSaveTimer = new QTimer ( this );
95 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( timerSlotSaveRunningInfoToFile() ) ); 95 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( timerSlotSaveRunningInfoToFile() ) );
96 } 96 }
97 mRunning = run; 97 mRunning = run;
98 mRunLastSave = QDateTime::currentDateTime(); 98 mRunLastSave = QDateTime::currentDateTime();
99 if ( mRunning ) { 99 if ( mRunning ) {
100 mRunSaveTimer->start( SAVETIMER_TIMEOUT_SECONDS * 1000 ); // 5 min 100 restartSaveTimer( SAVETIMER_TIMEOUT_SECONDS );
101 mRunStart = QDateTime::currentDateTime(); 101 mRunStart = QDateTime::currentDateTime();
102 mRunLastSave = QDateTime::currentDateTime();
103 mCurrentTimerDelay = SAVETIMER_TIMEOUT_SECONDS;
104 } else { 102 } else {
105 mRunSaveTimer->stop(); 103 mRunSaveTimer->stop();
106 saveRunningInfoToFile(); 104 saveRunningInfoToFile();
107 } 105 }
108} 106}
109void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end ) 107void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end )
110{ 108{
111 if ( !mRunning) return; 109 if ( !mRunning) return;
112 mRunning = false; 110 mRunning = false;
113 mRunStart = start; 111 mRunStart = start;
114 mRunEnd = end; 112 mRunEnd = end;
115 saveRunningInfoToFile( comment ); 113 saveRunningInfoToFile( comment );
116} 114}
115void Todo::restartSaveTimer( int secs )
116{
117 mRunSaveTimer->start( secs * 1000 );
118 mRunLastSave = QDateTime::currentDateTime();
119 mCurrentTimerDelay = secs;
120}
117void Todo::timerSlotSaveRunningInfoToFile() 121void Todo::timerSlotSaveRunningInfoToFile()
118{ 122{
119 mRunEnd = QDateTime::currentDateTime(); 123 mRunEnd = QDateTime::currentDateTime();
120 int secsTo = mRunLastSave.secsTo( mRunEnd ); 124 int secsTo = mRunLastSave.secsTo( mRunEnd );
121 if( secsTo == 8 ) ++secsTo; 125 //if( secsTo == 8 ) ++secsTo;
122 qDebug("KO Todo::saveTimerTimeout %d %d", secsTo, mCurrentTimerDelay ); 126 qDebug("KO Todo::saveTimerTimeout %d %d", secsTo, mCurrentTimerDelay );
123 if ( secsTo > mCurrentTimerDelay ) { 127 if ( secsTo > mCurrentTimerDelay ) {
124 qDebug("KO Todo::saveTimerTimeout restart %d ", SAVETIMER_TIMEOUT_RETRY_SECONDS ); 128 qDebug("KO Todo::saveTimerTimeout restart %d ", SAVETIMER_TIMEOUT_RETRY_SECONDS );
125 mRunSaveTimer->start( SAVETIMER_TIMEOUT_RETRY_SECONDS * 1000 ); 129 restartSaveTimer( SAVETIMER_TIMEOUT_RETRY_SECONDS );
126 mRunLastSave = QDateTime::currentDateTime();
127 mCurrentTimerDelay = SAVETIMER_TIMEOUT_RETRY_SECONDS;
128 return; 130 return;
129 } 131 }
130 mRunSaveTimer->start( SAVETIMER_TIMEOUT_SECONDS * 1000 ); // 5 min 132 int msecs = mRunLastSave.time().msecsTo( mRunEnd.time());
131 mRunLastSave = QDateTime::currentDateTime(); 133 if ( msecs < 0 ) {
132 mCurrentTimerDelay = SAVETIMER_TIMEOUT_SECONDS; 134 restartSaveTimer( SAVETIMER_TIMEOUT_RETRY_SECONDS );
135 return;
136 }
137 // qDebug("KO Todo::saveTimerTimeout restarting! millisecs %d", msecs - ( ( mCurrentTimerDelay * 1000 ) + 50 ) );
138 if ( msecs > ( ( mCurrentTimerDelay * 1000 ) + 50 )) {
139 qDebug("KO Todo::saveTimerTimeout restarting! millisecs %d", msecs - ( ( mCurrentTimerDelay * 1000 ) + 50 ) );
140 restartSaveTimer( SAVETIMER_TIMEOUT_RETRY_SECONDS );
141 return;
142
143 }
144 restartSaveTimer( SAVETIMER_TIMEOUT_SECONDS );
133 saveRunningInfoToFile( QString::null ); 145 saveRunningInfoToFile( QString::null );
134} 146}
135void Todo::saveRunningInfoToFile() 147void Todo::saveRunningInfoToFile()
136{ 148{
137 mRunEnd = QDateTime::currentDateTime(); 149 mRunEnd = QDateTime::currentDateTime();
138 saveRunningInfoToFile( QString::null ); 150 saveRunningInfoToFile( QString::null );
139} 151}
140void Todo::saveRunningInfoToFile( QString comment ) 152void Todo::saveRunningInfoToFile( QString comment )
141{ 153{
142 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 154 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
143 if ( mRunStart.secsTo ( mRunEnd) < 15 ) { 155 if ( mRunStart.secsTo ( mRunEnd) < 15 ) {
144 qDebug("Running time < 15 seconds. Skipped. "); 156 qDebug("Running time < 15 seconds. Skipped. ");
145 return; 157 return;
146 } 158 }
147 QString dir = KGlobalSettings::timeTrackerDir(); 159 QString dir = KGlobalSettings::timeTrackerDir();
148 //qDebug("%s ", dir.latin1()); 160 //qDebug("%s ", dir.latin1());
149 QString file = "%1%2%3-%4%5%6-"; 161 QString file = "%1%2%3-%4%5%6-";
150 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 ); 162 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 );
151 file.replace ( QRegExp (" "), "0" ); 163 file.replace ( QRegExp (" "), "0" );
152 file += uid(); 164 file += uid();
153 //qDebug("File %s ",file.latin1() ); 165 //qDebug("File %s ",file.latin1() );
154 CalendarLocal cal; 166 CalendarLocal cal;
155 cal.setLocalTime(); 167 cal.setLocalTime();
156 Todo * to = (Todo*) clone(); 168 Todo * to = (Todo*) clone();
157 to->setFloats( false ); 169 to->setFloats( false );
158 to->setDtStart( mRunStart ); 170 to->setDtStart( mRunStart );
159 to->setHasStartDate( true ); 171 to->setHasStartDate( true );
160 to->setDtDue( mRunEnd ); 172 to->setDtDue( mRunEnd );
161 to->setHasDueDate( true ); 173 to->setHasDueDate( true );
162 to->setUid( file ); 174 to->setUid( file );
163 if ( !comment.isEmpty() ) { 175 if ( !comment.isEmpty() ) {
164 QString des = to->description(); 176 QString des = to->description();
165 if ( des.isEmpty () ) 177 if ( des.isEmpty () )
166 to->setDescription( "TT-Note: " + comment ); 178 to->setDescription( "TT-Note: " + comment );
167 else 179 else
168 to->setDescription( "TT-Note: " + comment +"\n" + des ); 180 to->setDescription( "TT-Note: " + comment +"\n" + des );
169 } 181 }
170 cal.addIncidence( to ); 182 cal.addIncidence( to );
171 ICalFormat format( false ); 183 ICalFormat format( false );
172 file = dir +"/" +file +".ics"; 184 file = dir +"/" +file +".ics";
173 format.save( &cal, file ); 185 format.save( &cal, file );
174 saveParents(); 186 saveParents();
175 187
176} 188}
177void Todo::saveParents() 189void Todo::saveParents()
178{ 190{
179 if (!relatedTo() ) 191 if (!relatedTo() )
180 return; 192 return;
181 Incidence * inc = relatedTo(); 193 Incidence * inc = relatedTo();
182 if ( inc->typeID() != todoID ) 194 if ( inc->typeID() != todoID )
183 return; 195 return;
184 Todo* to = (Todo*)inc; 196 Todo* to = (Todo*)inc;
185 bool saveTodo = false; 197 bool saveTodo = false;
186 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 198 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
187 QFileInfo fi ( file ); 199 QFileInfo fi ( file );
188 if ( fi.exists() ) { 200 if ( fi.exists() ) {
189 if ( fi.lastModified () < to->lastModified ()) 201 if ( fi.lastModified () < to->lastModified ())
190 saveTodo = true; 202 saveTodo = true;
191 } else { 203 } else {
192 saveTodo = true; 204 saveTodo = true;
193 } 205 }
194 if ( saveTodo ) { 206 if ( saveTodo ) {
195 CalendarLocal cal; 207 CalendarLocal cal;
196 cal.setLocalTime(); 208 cal.setLocalTime();
197 Todo * par = (Todo *) to->clone(); 209 Todo * par = (Todo *) to->clone();
198 cal.addIncidence( par ); 210 cal.addIncidence( par );
199 ICalFormat format( false ); 211 ICalFormat format( false );
200 format.save( &cal, file ); 212 format.save( &cal, file );
201 } 213 }
202 to->saveParents(); 214 to->saveParents();
203} 215}
204 216
205int Todo::runTime() 217int Todo::runTime()
206{ 218{
207 if ( !mRunning ) 219 if ( !mRunning )
208 return 0; 220 return 0;
209 return mRunStart.secsTo( QDateTime::currentDateTime() ); 221 return mRunStart.secsTo( QDateTime::currentDateTime() );
210} 222}
211bool Todo::hasRunningSub() 223bool Todo::hasRunningSub()
212{ 224{
213 if ( mRunning ) 225 if ( mRunning )
214 return true; 226 return true;
215 Incidence *aTodo; 227 Incidence *aTodo;
216 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 228 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
217 if ( ((Todo*)aTodo)->hasRunningSub() ) 229 if ( ((Todo*)aTodo)->hasRunningSub() )
218 return true; 230 return true;
219 } 231 }
220 return false; 232 return false;
221} 233}
222Incidence *Todo::clone() 234Incidence *Todo::clone()
223{ 235{
224 return new Todo(*this); 236 return new Todo(*this);
225} 237}
226 238
227bool Todo::contains ( Todo* from ) 239bool Todo::contains ( Todo* from )
228{ 240{
229 241
230 if ( !from->summary().isEmpty() ) 242 if ( !from->summary().isEmpty() )
231 if ( !summary().startsWith( from->summary() )) 243 if ( !summary().startsWith( from->summary() ))
232 return false; 244 return false;
233 if ( from->hasStartDate() ) { 245 if ( from->hasStartDate() ) {
234 if ( !hasStartDate() ) 246 if ( !hasStartDate() )
235 return false; 247 return false;
236 if ( from->dtStart() != dtStart()) 248 if ( from->dtStart() != dtStart())
237 return false; 249 return false;
238 } 250 }
239 if ( from->hasDueDate() ){ 251 if ( from->hasDueDate() ){
240 if ( !hasDueDate() ) 252 if ( !hasDueDate() )
241 return false; 253 return false;
242 if ( from->dtDue() != dtDue()) 254 if ( from->dtDue() != dtDue())
243 return false; 255 return false;
244 } 256 }
245 if ( !from->location().isEmpty() ) 257 if ( !from->location().isEmpty() )
246 if ( !location().startsWith( from->location() ) ) 258 if ( !location().startsWith( from->location() ) )
247 return false; 259 return false;
248 if ( !from->description().isEmpty() ) 260 if ( !from->description().isEmpty() )
249 if ( !description().startsWith( from->description() )) 261 if ( !description().startsWith( from->description() ))
250 return false; 262 return false;
251 if ( from->alarms().count() ) { 263 if ( from->alarms().count() ) {
252 Alarm *a = from->alarms().first(); 264 Alarm *a = from->alarms().first();
253 if ( a->enabled() ){ 265 if ( a->enabled() ){
254 if ( !alarms().count() ) 266 if ( !alarms().count() )
255 return false; 267 return false;
256 Alarm *b = alarms().first(); 268 Alarm *b = alarms().first();
257 if( ! b->enabled() ) 269 if( ! b->enabled() )
258 return false; 270 return false;
259 if ( ! (a->offset() == b->offset() )) 271 if ( ! (a->offset() == b->offset() ))
260 return false; 272 return false;