summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--korganizer/kotodoeditor.cpp29
-rw-r--r--korganizer/kotodoviewitem.cpp40
-rw-r--r--libkcal/incidence.cpp9
-rw-r--r--libkcal/incidence.h5
-rw-r--r--libkcal/incidencebase.cpp1
-rw-r--r--libkcal/incidencebase.h4
-rw-r--r--libkcal/todo.cpp47
-rw-r--r--libkcal/todo.h2
8 files changed, 130 insertions, 7 deletions
diff --git a/korganizer/kotodoeditor.cpp b/korganizer/kotodoeditor.cpp
index 069dda8..9232e09 100644
--- a/korganizer/kotodoeditor.cpp
+++ b/korganizer/kotodoeditor.cpp
@@ -300,77 +300,106 @@ void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay)
300 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 ); 300 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 );
301 301
302 } else 302 } else
303 mGeneral->setFocusOn( 2 ); 303 mGeneral->setFocusOn( 2 );
304 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 304 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
305 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true); 305 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true);
306} 306}
307void KOTodoEditor::checkRecurrence() 307void KOTodoEditor::checkRecurrence()
308{ 308{
309 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 309 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
310 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true ); 310 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true );
311 311
312 if ( mTodo ) 312 if ( mTodo )
313 mRecurrence->readEvent( mTodo ); 313 mRecurrence->readEvent( mTodo );
314 else { 314 else {
315 bool time = mGeneral->mTimeButton->isChecked(); 315 bool time = mGeneral->mTimeButton->isChecked();
316 QDateTime from,to; 316 QDateTime from,to;
317 if ( time ) { 317 if ( time ) {
318 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ; 318 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ;
319 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ; 319 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ;
320 } else { 320 } else {
321 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ; 321 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ;
322 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ; 322 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ;
323 } 323 }
324 if ( to < from )
325 to = from;
324 mRecurrence->setDefaults(from,to,!time); 326 mRecurrence->setDefaults(from,to,!time);
325 } 327 }
326 } else { 328 } else {
327 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 329 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
328 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true); 330 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ),true);
329 } 331 }
330} 332}
331void KOTodoEditor::readTodo(Todo *todo) 333void KOTodoEditor::readTodo(Todo *todo)
332{ 334{
333 mGeneral->readTodo(todo); 335 mGeneral->readTodo(todo);
334 mDetails->readEvent(todo); 336 mDetails->readEvent(todo);
335 mRelatedTodo = 0;//todo->relatedTo(); 337 mRelatedTodo = 0;//todo->relatedTo();
336 // categories 338 // categories
337 // mCategoryDialog->setSelected(todo->categories()); 339 // mCategoryDialog->setSelected(todo->categories());
338 340
339 // We should handle read-only events here. 341 // We should handle read-only events here.
340} 342}
341 343
342void KOTodoEditor::writeTodo(Todo *event) 344void KOTodoEditor::writeTodo(Todo *event)
343{ 345{
344 mGeneral->writeTodo(event); 346 mGeneral->writeTodo(event);
345 mDetails->writeEvent(event); 347 mDetails->writeEvent(event);
346 348
347 // set related event, i.e. parent to-do in this case. 349 // set related event, i.e. parent to-do in this case.
348 if (mRelatedTodo) { 350 if (mRelatedTodo) {
349 event->setRelatedTo(mRelatedTodo); 351 event->setRelatedTo(mRelatedTodo);
350 } 352 }
351 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 353 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
352 mRecurrence->writeEvent(event); 354 mRecurrence->writeEvent(event);
355 event->setRecurrenceID( event->dtStart().addSecs(-1) );
356 event->setRecurDates();
357#if 0
358 bool ok;
359 QDateTime next = event->getNextOccurence( event->dtStart().addSecs(-1), &ok );
360 if ( ok ) {
361 QDateTime from,to;
362 bool time = mGeneral->mTimeButton->isChecked();
363 if ( time ) {
364 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ;
365 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ;
366 } else {
367 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ;
368 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ;
369 }
370 if ( to < from )
371 to = from;
372 int secs = from.secsTo( to );
373 event->setRecurrenceID( next );
374 event->setDtStart( next );
375 event->setDtDue( next.addSecs( secs ) );
376 }
377 else {
378 event->setHasRecurrenceID( false );
379 event->recurrence()->unsetRecurs();
380 }
381#endif
353 } else 382 } else
354 event->recurrence()->unsetRecurs(); 383 event->recurrence()->unsetRecurs();
355} 384}
356 385
357bool KOTodoEditor::validateInput() 386bool KOTodoEditor::validateInput()
358{ 387{
359 if (!mGeneral->validateInput()) return false; 388 if (!mGeneral->validateInput()) return false;
360 if (!mDetails->validateInput()) return false; 389 if (!mDetails->validateInput()) return false;
361 return true; 390 return true;
362} 391}
363 392
364int KOTodoEditor::msgItemDelete() 393int KOTodoEditor::msgItemDelete()
365{ 394{
366 return KMessageBox::warningContinueCancel(this, 395 return KMessageBox::warningContinueCancel(this,
367 i18n("This item will be permanently deleted."), 396 i18n("This item will be permanently deleted."),
368 i18n("KOrganizer Confirmation"),i18n("Delete")); 397 i18n("KOrganizer Confirmation"),i18n("Delete"));
369} 398}
370 399
371void KOTodoEditor::modified (int modification) 400void KOTodoEditor::modified (int modification)
372{ 401{
373 if (modification == KOGlobals::CATEGORY_MODIFIED || 402 if (modification == KOGlobals::CATEGORY_MODIFIED ||
374 KOGlobals::UNKNOWN_MODIFIED == modification ) 403 KOGlobals::UNKNOWN_MODIFIED == modification )
375 // mCategoryDialog->setSelected (mTodo->categories ()); 404 // mCategoryDialog->setSelected (mTodo->categories ());
376 mGeneral->modified (mTodo, modification); 405 mGeneral->modified (mTodo, modification);
diff --git a/korganizer/kotodoviewitem.cpp b/korganizer/kotodoviewitem.cpp
index 0e847c2..70f00c6 100644
--- a/korganizer/kotodoviewitem.cpp
+++ b/korganizer/kotodoviewitem.cpp
@@ -170,90 +170,128 @@ void KOTodoViewItem::setMyPixmap()
170 QPixmap pixi = QPixmap( 1, 1 ); 170 QPixmap pixi = QPixmap( 1, 1 );
171 // if ( !mTodo->isCompleted() && mTodo->hasDueDate() && mTodo->dtDue() < QDateTime::currentDateTime() ) { 171 // if ( !mTodo->isCompleted() && mTodo->hasDueDate() && mTodo->dtDue() < QDateTime::currentDateTime() ) {
172// pixi = SmallIcon("redcross16"); 172// pixi = SmallIcon("redcross16");
173// } else { 173// } else {
174 QPainter p; 174 QPainter p;
175 175
176 int pixSize = 0; 176 int pixSize = 0;
177 QPixmap pPix = QPixmap( size, size ); 177 QPixmap pPix = QPixmap( size, size );
178 if ( mTodo->description().length() > 0 ) { 178 if ( mTodo->description().length() > 0 ) {
179 pixi.resize(size, pixSize+size); 179 pixi.resize(size, pixSize+size);
180 pPix.fill( Qt::darkGreen ); 180 pPix.fill( Qt::darkGreen );
181 p.begin( &pixi ); 181 p.begin( &pixi );
182 p. drawPixmap ( 0, pixSize, pPix); 182 p. drawPixmap ( 0, pixSize, pPix);
183 p.end(); 183 p.end();
184 pixSize += size; 184 pixSize += size;
185 } 185 }
186 if ( mTodo->isAlarmEnabled() ) { 186 if ( mTodo->isAlarmEnabled() ) {
187 pixi.resize(size, pixSize+size); 187 pixi.resize(size, pixSize+size);
188 pPix.fill( Qt::red ); 188 pPix.fill( Qt::red );
189 p.begin( &pixi ); 189 p.begin( &pixi );
190 p. drawPixmap ( 0, pixSize, pPix); 190 p. drawPixmap ( 0, pixSize, pPix);
191 p.end(); 191 p.end();
192 pixSize += size; 192 pixSize += size;
193 } 193 }
194 if ( mTodo->doesRecur() ) {
195 pixi.resize(size, pixSize+size);
196 pPix.fill( Qt::blue );
197 p.begin( &pixi );
198 p. drawPixmap ( 0, pixSize, pPix);
199 p.end();
200 pixSize += size;
201 }
194 // } 202 // }
195 if ( pixi.width() > 1 ) { 203 if ( pixi.width() > 1 ) {
196 setPixmap ( 0,pixi ) ; 204 setPixmap ( 0,pixi ) ;
197 } else { 205 } else {
198 setPixmap ( 0,QPixmap() ) ; 206 setPixmap ( 0,QPixmap() ) ;
199 } 207 }
200} 208}
201void KOTodoViewItem::stateChange(bool state) 209void KOTodoViewItem::stateChange(bool state)
202{ 210{
203 // qDebug("KOTodoViewItem::stateChange "); 211 // qDebug("KOTodoViewItem::stateChange %d ", state);
204 // do not change setting on startup 212 // do not change setting on startup
205 if ( m_init ) return; 213 if ( m_init ) return;
206 if (isOn()!=state) { 214 if (isOn()!=state) {
207 setOn(state); 215 setOn(state);
208 //qDebug("SETON "); 216 //qDebug("SETON ");
209 return; 217 return;
210 } 218 }
211 if ( mTodo->isCompleted() == state ) { 219 if ( mTodo->isCompleted() == state ) {
212 //qDebug("STATECHANGE:nothing to do "); 220 //qDebug("STATECHANGE:nothing to do ");
213 return; 221 return;
214 } 222 }
215 QString keyd = "=="; 223 QString keyd = "==";
216 QString keyt = "=="; 224 QString keyt = "==";
217 //qDebug("KOTodoViewItem::stateChange %s ", text(0).latin1()); 225 //qDebug("KOTodoViewItem::stateChange %s ", text(0).latin1());
226 if ( mTodo->doesRecur() ){
227 QDateTime start = mTodo->dtStart();
218 mTodo->setCompleted(state); 228 mTodo->setCompleted(state);
229 if ( start != mTodo->dtStart() ) {
230 if ( state && !mTodo->isCompleted() ) {
231 setOn( false );
232 state = false;
233 }
234 }
235 } else
236 mTodo->setCompleted(state);
237
219 if (state) mTodo->setCompleted(QDateTime::currentDateTime()); 238 if (state) mTodo->setCompleted(QDateTime::currentDateTime());
220 239
221 if (mTodo->hasDueDate()) { 240 if (mTodo->hasDueDate()) {
222 setText(3, mTodo->dtDueDateStr()); 241 setText(3, mTodo->dtDueDateStr());
223 QDate d = mTodo->dtDue().date(); 242 QDate d = mTodo->dtDue().date();
224 keyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day()); 243 keyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
225 setSortKey(3,keyd); 244 setSortKey(3,keyd);
226 if (mTodo->doesFloat()) { 245 if (mTodo->doesFloat()) {
227 setText(4,""); 246 setText(4,"");
228 } 247 }
229 else { 248 else {
230 setText(4,mTodo->dtDueTimeStr()); 249 setText(4,mTodo->dtDueTimeStr());
231 QTime t = mTodo->dtDue().time(); 250 QTime t = mTodo->dtDue().time();
232 keyt.sprintf("%02d%02d",t.hour(),t.minute()); 251 keyt.sprintf("%02d%02d",t.hour(),t.minute());
233 setSortKey(4,keyt); 252 setSortKey(4,keyt);
234 } 253 }
235 } 254 }
255 if (mTodo->hasStartDate()) {
256 QString skeyt = "==";
257 QString skeyd = "==";
258 setText(5, mTodo->dtStartDateStr());
259 QDate d = mTodo->dtStart().date();
260 skeyd.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
261
262 if (mTodo->doesFloat()) {
263 setText(6,"");
264 }
265 else {
266 setText(6,mTodo->dtStartTimeStr());
267 QTime t = mTodo->dtStart().time();
268 skeyt.sprintf("%02d%02d",t.hour(),t.minute());
269
270 }
271 setSortKey(5,skeyd);
272 setSortKey(6,skeyt);
273 }
236 if (mTodo->isCompleted()) setSortKey(1,QString::number(9)+keyd+keyt); 274 if (mTodo->isCompleted()) setSortKey(1,QString::number(9)+keyd+keyt);
237 else setSortKey(1,QString::number(mTodo->priority())+keyd+keyt); 275 else setSortKey(1,QString::number(mTodo->priority())+keyd+keyt);
238 276
239 setText(2,i18n("%1 %").arg(QString::number(mTodo->percentComplete()))); 277 setText(2,i18n("%1 %").arg(QString::number(mTodo->percentComplete())));
240 if (mTodo->percentComplete()<100) { 278 if (mTodo->percentComplete()<100) {
241 if (mTodo->isCompleted()) setSortKey(2,QString::number(999)); 279 if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
242 else setSortKey(2,QString::number(mTodo->percentComplete())); 280 else setSortKey(2,QString::number(mTodo->percentComplete()));
243 } 281 }
244 else { 282 else {
245 if (mTodo->isCompleted()) setSortKey(2,QString::number(999)); 283 if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
246 else setSortKey(2,QString::number(99)); 284 else setSortKey(2,QString::number(99));
247 } 285 }
248 if ( state ) { 286 if ( state ) {
249 QListViewItem * myChild = firstChild(); 287 QListViewItem * myChild = firstChild();
250 KOTodoViewItem *item; 288 KOTodoViewItem *item;
251 while( myChild ) { 289 while( myChild ) {
252 //qDebug("stateCH "); 290 //qDebug("stateCH ");
253 item = static_cast<KOTodoViewItem*>(myChild); 291 item = static_cast<KOTodoViewItem*>(myChild);
254 item->stateChange(state); 292 item->stateChange(state);
255 myChild = myChild->nextSibling(); 293 myChild = myChild->nextSibling();
256 } 294 }
257 } else { 295 } else {
258 QListViewItem * myChild = parent(); 296 QListViewItem * myChild = parent();
259 if ( myChild ) 297 if ( myChild )
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
index dbc159c..0684af2 100644
--- a/libkcal/incidence.cpp
+++ b/libkcal/incidence.cpp
@@ -626,24 +626,33 @@ QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const
626 int year = incidenceStart.date().year(); 626 int year = incidenceStart.date().year();
627 // workaround for bug in recurrence 627 // workaround for bug in recurrence
628 if ( count == 100 || year < 1000 || year > 5000 ) { 628 if ( count == 100 || year < 1000 || year > 5000 ) {
629 return QDateTime (); 629 return QDateTime ();
630 } 630 }
631 incidenceStart = incidenceStart.addSecs( 1 ); 631 incidenceStart = incidenceStart.addSecs( 1 );
632 } 632 }
633 } 633 }
634 } else { 634 } else {
635 return QDateTime (); 635 return QDateTime ();
636 } 636 }
637 } else { 637 } else {
638 if ( hasStartDate () ) { 638 if ( hasStartDate () ) {
639 incidenceStart = dtStart(); 639 incidenceStart = dtStart();
640 } 640 }
641 if ( type() =="Todo" ) { 641 if ( type() =="Todo" ) {
642 if ( ((Todo*)this)->hasDueDate() ) 642 if ( ((Todo*)this)->hasDueDate() )
643 incidenceStart = ((Todo*)this)->dtDue(); 643 incidenceStart = ((Todo*)this)->dtDue();
644 } 644 }
645 } 645 }
646 if ( incidenceStart > dt ) 646 if ( incidenceStart > dt )
647 *ok = true; 647 *ok = true;
648 return incidenceStart; 648 return incidenceStart;
649} 649}
650QDateTime Incidence::dtStart() const
651{
652 if ( doesRecur() ) {
653 if ( type() == "Todo" ) {
654 ((Todo*)this)->checkSetCompletedFalse();
655 }
656 }
657 return mDtStart;
658}
diff --git a/libkcal/incidence.h b/libkcal/incidence.h
index 38d2aaa..0ae9656 100644
--- a/libkcal/incidence.h
+++ b/libkcal/incidence.h
@@ -248,60 +248,61 @@ class Incidence : public IncidenceBase
248 Recurrence *recurrence() const; 248 Recurrence *recurrence() const;
249 void setRecurrence(Recurrence * r); 249 void setRecurrence(Recurrence * r);
250 /** 250 /**
251 Forward to Recurrence::doesRecur(). 251 Forward to Recurrence::doesRecur().
252 */ 252 */
253 ushort doesRecur() const; 253 ushort doesRecur() const;
254 254
255 /** set the event's/todo's location. Do _not_ use it with journal */ 255 /** set the event's/todo's location. Do _not_ use it with journal */
256 void setLocation(const QString &location); 256 void setLocation(const QString &location);
257 /** return the event's/todo's location. Do _not_ use it with journal */ 257 /** return the event's/todo's location. Do _not_ use it with journal */
258 QString location() const; 258 QString location() const;
259 /** returns TRUE or FALSE depending on whether the todo has a start date */ 259 /** returns TRUE or FALSE depending on whether the todo has a start date */
260 bool hasStartDate() const; 260 bool hasStartDate() const;
261 /** sets the event's hasStartDate value. */ 261 /** sets the event's hasStartDate value. */
262 void setHasStartDate(bool f); 262 void setHasStartDate(bool f);
263 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const; 263 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const;
264 bool cancelled() const; 264 bool cancelled() const;
265 void setCancelled( bool b ); 265 void setCancelled( bool b );
266 266
267 bool hasRecurrenceID() const; 267 bool hasRecurrenceID() const;
268 void setHasRecurrenceID( bool b ); 268 void setHasRecurrenceID( bool b );
269 269
270 void setRecurrenceID(QDateTime); 270 void setRecurrenceID(QDateTime);
271 QDateTime recurrenceID () const; 271 QDateTime recurrenceID () const;
272 QDateTime dtStart() const;
272 273
273 274
274protected: 275protected:
275 QPtrList<Alarm> mAlarms; 276 QPtrList<Alarm> mAlarms;
276 QPtrList<Incidence> mRelations; 277 QPtrList<Incidence> mRelations;
278 QDateTime mRecurrenceID;
279 bool mHasRecurrenceID;
277 private: 280 private:
278 int mRevision; 281 int mRevision;
279 bool mCancelled; 282 bool mCancelled;
280 283
281 // base components of jounal, event and todo 284 // base components of jounal, event and todo
282 QDateTime mRecurrenceID;
283 bool mHasRecurrenceID;
284 QDateTime mCreated; 285 QDateTime mCreated;
285 QString mDescription; 286 QString mDescription;
286 QString mSummary; 287 QString mSummary;
287 QStringList mCategories; 288 QStringList mCategories;
288 Incidence *mRelatedTo; 289 Incidence *mRelatedTo;
289 QString mRelatedToUid; 290 QString mRelatedToUid;
290 DateList mExDates; 291 DateList mExDates;
291 QPtrList<Attachment> mAttachments; 292 QPtrList<Attachment> mAttachments;
292 QStringList mResources; 293 QStringList mResources;
293 bool mHasStartDate; // if todo has associated start date 294 bool mHasStartDate; // if todo has associated start date
294 295
295 int mSecrecy; 296 int mSecrecy;
296 int mPriority; // 1 = highest, 2 = less, etc. 297 int mPriority; // 1 = highest, 2 = less, etc.
297 298
298 //QPtrList<Alarm> mAlarms; 299 //QPtrList<Alarm> mAlarms;
299 Recurrence *mRecurrence; 300 Recurrence *mRecurrence;
300 301
301 QString mLocation; 302 QString mLocation;
302}; 303};
303 304
304bool operator==( const Incidence&, const Incidence& ); 305bool operator==( const Incidence&, const Incidence& );
305 306
306} 307}
307 308
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index 7525a4a..51f2e9d 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -158,48 +158,49 @@ void IncidenceBase::setOrganizer(const QString &o)
158 mOrganizer = o; 158 mOrganizer = o;
159 if (mOrganizer.left(7).upper() == "MAILTO:") 159 if (mOrganizer.left(7).upper() == "MAILTO:")
160 mOrganizer = mOrganizer.remove(0,7); 160 mOrganizer = mOrganizer.remove(0,7);
161 161
162 updated(); 162 updated();
163} 163}
164 164
165QString IncidenceBase::organizer() const 165QString IncidenceBase::organizer() const
166{ 166{
167 return mOrganizer; 167 return mOrganizer;
168} 168}
169 169
170void IncidenceBase::setReadOnly( bool readOnly ) 170void IncidenceBase::setReadOnly( bool readOnly )
171{ 171{
172 mReadOnly = readOnly; 172 mReadOnly = readOnly;
173} 173}
174 174
175void IncidenceBase::setDtStart(const QDateTime &dtStart) 175void IncidenceBase::setDtStart(const QDateTime &dtStart)
176{ 176{
177// if (mReadOnly) return; 177// if (mReadOnly) return;
178 mDtStart = getEvenTime(dtStart); 178 mDtStart = getEvenTime(dtStart);
179 updated(); 179 updated();
180} 180}
181 181
182
182QDateTime IncidenceBase::dtStart() const 183QDateTime IncidenceBase::dtStart() const
183{ 184{
184 return mDtStart; 185 return mDtStart;
185} 186}
186 187
187QString IncidenceBase::dtStartTimeStr() const 188QString IncidenceBase::dtStartTimeStr() const
188{ 189{
189 return KGlobal::locale()->formatTime(dtStart().time()); 190 return KGlobal::locale()->formatTime(dtStart().time());
190} 191}
191 192
192QString IncidenceBase::dtStartDateStr(bool shortfmt) const 193QString IncidenceBase::dtStartDateStr(bool shortfmt) const
193{ 194{
194 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt); 195 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
195} 196}
196 197
197QString IncidenceBase::dtStartStr(bool shortfmt) const 198QString IncidenceBase::dtStartStr(bool shortfmt) const
198{ 199{
199 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt); 200 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt);
200} 201}
201 202
202 203
203bool IncidenceBase::doesFloat() const 204bool IncidenceBase::doesFloat() const
204{ 205{
205 return mFloats; 206 return mFloats;
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
index f9a6558..8624786 100644
--- a/libkcal/incidencebase.h
+++ b/libkcal/incidencebase.h
@@ -53,49 +53,49 @@ class IncidenceBase : public CustomProperties
53 virtual QCString type() const = 0; 53 virtual QCString type() const = 0;
54 54
55 /** Set the unique id for the event */ 55 /** Set the unique id for the event */
56 void setUid(const QString &); 56 void setUid(const QString &);
57 /** Return the unique id for the event */ 57 /** Return the unique id for the event */
58 QString uid() const; 58 QString uid() const;
59 59
60 /** Sets the time the incidence was last modified. */ 60 /** Sets the time the incidence was last modified. */
61 void setLastModified(const QDateTime &lm); 61 void setLastModified(const QDateTime &lm);
62 /** Return the time the incidence was last modified. */ 62 /** Return the time the incidence was last modified. */
63 QDateTime lastModified() const; 63 QDateTime lastModified() const;
64 64
65 /** sets the organizer for the event */ 65 /** sets the organizer for the event */
66 void setOrganizer(const QString &o); 66 void setOrganizer(const QString &o);
67 QString organizer() const; 67 QString organizer() const;
68 68
69 /** Set readonly status. */ 69 /** Set readonly status. */
70 virtual void setReadOnly( bool ); 70 virtual void setReadOnly( bool );
71 /** Return if the object is read-only. */ 71 /** Return if the object is read-only. */
72 bool isReadOnly() const { return mReadOnly; } 72 bool isReadOnly() const { return mReadOnly; }
73 73
74 /** for setting the event's starting date/time with a QDateTime. */ 74 /** for setting the event's starting date/time with a QDateTime. */
75 virtual void setDtStart(const QDateTime &dtStart); 75 virtual void setDtStart(const QDateTime &dtStart);
76 /** returns an event's starting date/time as a QDateTime. */ 76 /** returns an event's starting date/time as a QDateTime. */
77 QDateTime dtStart() const; 77 virtual QDateTime dtStart() const;
78 /** returns an event's starting time as a string formatted according to the 78 /** returns an event's starting time as a string formatted according to the
79 users locale settings */ 79 users locale settings */
80 QString dtStartTimeStr() const; 80 QString dtStartTimeStr() const;
81 /** returns an event's starting date as a string formatted according to the 81 /** returns an event's starting date as a string formatted according to the
82 users locale settings */ 82 users locale settings */
83 QString dtStartDateStr(bool shortfmt=true) const; 83 QString dtStartDateStr(bool shortfmt=true) const;
84 /** returns an event's starting date and time as a string formatted according 84 /** returns an event's starting date and time as a string formatted according
85 to the users locale settings */ 85 to the users locale settings */
86 QString dtStartStr(bool shortfmt=true) const; 86 QString dtStartStr(bool shortfmt=true) const;
87 87
88 virtual void setDuration(int seconds); 88 virtual void setDuration(int seconds);
89 int duration() const; 89 int duration() const;
90 void setHasDuration(bool); 90 void setHasDuration(bool);
91 bool hasDuration() const; 91 bool hasDuration() const;
92 92
93 /** Return true or false depending on whether the incidence "floats," 93 /** Return true or false depending on whether the incidence "floats,"
94 * i.e. has a date but no time attached to it. */ 94 * i.e. has a date but no time attached to it. */
95 bool doesFloat() const; 95 bool doesFloat() const;
96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */ 96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
97 void setFloats(bool f); 97 void setFloats(bool f);
98 98
99 /** 99 /**
100 Add Attendee to this incidence. IncidenceBase takes ownership of the 100 Add Attendee to this incidence. IncidenceBase takes ownership of the
101 Attendee object. 101 Attendee object.
@@ -120,53 +120,53 @@ class IncidenceBase : public CustomProperties
120 void setSyncStatus(int stat); 120 void setSyncStatus(int stat);
121 /** Return synchronisation status. */ 121 /** Return synchronisation status. */
122 int syncStatus() const; 122 int syncStatus() const;
123 123
124 /** Set Pilot Id. */ 124 /** Set Pilot Id. */
125 void setPilotId(int id); 125 void setPilotId(int id);
126 /** Return Pilot Id. */ 126 /** Return Pilot Id. */
127 int pilotId() const; 127 int pilotId() const;
128 128
129 void setTempSyncStat(int id); 129 void setTempSyncStat(int id);
130 int tempSyncStat() const; 130 int tempSyncStat() const;
131 void setIDStr( const QString & ); 131 void setIDStr( const QString & );
132 QString IDStr() const; 132 QString IDStr() const;
133 void setID( const QString &, const QString & ); 133 void setID( const QString &, const QString & );
134 QString getID( const QString & ); 134 QString getID( const QString & );
135 void setCsum( const QString &, const QString & ); 135 void setCsum( const QString &, const QString & );
136 QString getCsum( const QString & ); 136 QString getCsum( const QString & );
137 void removeID(const QString &); 137 void removeID(const QString &);
138 138
139 void registerObserver( Observer * ); 139 void registerObserver( Observer * );
140 void unRegisterObserver( Observer * ); 140 void unRegisterObserver( Observer * );
141 void updated(); 141 void updated();
142 142
143 protected: 143 protected:
144 QDateTime mDtStart;
144 bool mReadOnly; 145 bool mReadOnly;
145 QDateTime getEvenTime( QDateTime ); 146 QDateTime getEvenTime( QDateTime );
146 147
147 private: 148 private:
148 // base components 149 // base components
149 QDateTime mDtStart;
150 QString mOrganizer; 150 QString mOrganizer;
151 QString mUid; 151 QString mUid;
152 QDateTime mLastModified; 152 QDateTime mLastModified;
153 QPtrList<Attendee> mAttendees; 153 QPtrList<Attendee> mAttendees;
154 154
155 bool mFloats; 155 bool mFloats;
156 156
157 int mDuration; 157 int mDuration;
158 bool mHasDuration; 158 bool mHasDuration;
159 QString mExternalId; 159 QString mExternalId;
160 int mTempSyncStat; 160 int mTempSyncStat;
161 161
162 // PILOT SYNCHRONIZATION STUFF 162 // PILOT SYNCHRONIZATION STUFF
163 int mPilotId; // unique id for pilot sync 163 int mPilotId; // unique id for pilot sync
164 int mSyncStatus; // status (for sync) 164 int mSyncStatus; // status (for sync)
165 165
166 QPtrList<Observer> mObservers; 166 QPtrList<Observer> mObservers;
167}; 167};
168 168
169bool operator==( const IncidenceBase&, const IncidenceBase& ); 169bool operator==( const IncidenceBase&, const IncidenceBase& );
170} 170}
171 171
172#endif 172#endif
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 9c04a7e..1f54c2f 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -290,97 +290,127 @@ QString Todo::statusStr() const
290 return QString("SENT"); 290 return QString("SENT");
291 break; 291 break;
292 case TENTATIVE: 292 case TENTATIVE:
293 return QString("TENTATIVE"); 293 return QString("TENTATIVE");
294 break; 294 break;
295 case CONFIRMED: 295 case CONFIRMED:
296 return QString("CONFIRMED"); 296 return QString("CONFIRMED");
297 break; 297 break;
298 case DECLINED: 298 case DECLINED:
299 return QString("DECLINED"); 299 return QString("DECLINED");
300 break; 300 break;
301 case COMPLETED: 301 case COMPLETED:
302 return QString("COMPLETED"); 302 return QString("COMPLETED");
303 break; 303 break;
304 case DELEGATED: 304 case DELEGATED:
305 return QString("DELEGATED"); 305 return QString("DELEGATED");
306 break; 306 break;
307 } 307 }
308 return QString(""); 308 return QString("");
309} 309}
310#endif 310#endif
311 311
312bool Todo::isCompleted() const 312bool Todo::isCompleted() const
313{ 313{
314 if (mPercentComplete == 100) return true; 314 if (mPercentComplete == 100) {
315 return true;
316 }
315 else return false; 317 else return false;
316} 318}
317 319
318void Todo::setCompleted(bool completed) 320void Todo::setCompleted(bool completed)
319{ 321{
322 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
323 if ( !setRecurDates() )
324 completed = false;
325 }
320 if (completed) mPercentComplete = 100; 326 if (completed) mPercentComplete = 100;
321 else { 327 else {
322 mPercentComplete = 0; 328 mPercentComplete = 0;
323 mHasCompletedDate = false; 329 mHasCompletedDate = false;
324 } 330 }
325 updated(); 331 updated();
326} 332}
327 333
328QDateTime Todo::completed() const 334QDateTime Todo::completed() const
329{ 335{
330 return mCompleted; 336 return mCompleted;
331} 337}
332 338
333QString Todo::completedStr( bool shortF ) const 339QString Todo::completedStr( bool shortF ) const
334{ 340{
335 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 341 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
336} 342}
337 343
338void Todo::setCompleted(const QDateTime &completed) 344void Todo::setCompleted(const QDateTime &completed)
339{ 345{
340 //qDebug("Todo::setCompleted "); 346 //qDebug("Todo::setCompleted ");
341 if ( mHasCompletedDate ) { 347 if ( mHasCompletedDate ) {
342 // qDebug("has completed data - return "); 348 // qDebug("has completed data - return ");
343 return; 349 return;
344 } 350 }
345 mHasCompletedDate = true; 351 mHasCompletedDate = true;
346 mPercentComplete = 100; 352 mPercentComplete = 100;
347 mCompleted = getEvenTime(completed); 353 mCompleted = getEvenTime(completed);
348 updated(); 354 updated();
349} 355}
350 356
351bool Todo::hasCompletedDate() const 357bool Todo::hasCompletedDate() const
352{ 358{
353 return mHasCompletedDate; 359 return mHasCompletedDate;
354} 360}
355 361
356int Todo::percentComplete() const 362int Todo::percentComplete() const
357{ 363{
358 return mPercentComplete; 364 return mPercentComplete;
359} 365}
360 366bool Todo::setRecurDates()
367{
368 if ( !mHasRecurrenceID )
369 return true;
370 int secs = mDtStart.secsTo( dtDue() );
371 bool ok;
372 qDebug("--------------------setRecurDates() ");
373 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
374 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
375 if ( ok ) {
376 mRecurrenceID = next;
377 mDtStart = next;
378 setDtDue( next.addSecs( secs ) );
379 if ( QDateTime::currentDateTime() > next)
380 return false;
381 } else {
382 setHasRecurrenceID( false );
383 recurrence()->unsetRecurs();
384 }
385 return true;
386}
361void Todo::setPercentComplete(int v) 387void Todo::setPercentComplete(int v)
362{ 388{
389 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
390 if ( !setRecurDates() )
391 v = 0;
392 }
363 mPercentComplete = v; 393 mPercentComplete = v;
364 if ( v != 100 ) 394 if ( v != 100 )
365 mHasCompletedDate = false; 395 mHasCompletedDate = false;
366 updated(); 396 updated();
367} 397}
368QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const 398QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const
369{ 399{
370 if ( isCompleted() || ! hasDueDate() || cancelled() ) { 400 if ( isCompleted() || ! hasDueDate() || cancelled() ) {
371 *ok = false; 401 *ok = false;
372 return QDateTime (); 402 return QDateTime ();
373 } 403 }
374 QDateTime incidenceStart; 404 QDateTime incidenceStart;
375 incidenceStart = dtDue(); 405 incidenceStart = dtDue();
376 bool enabled = false; 406 bool enabled = false;
377 Alarm* alarm; 407 Alarm* alarm;
378 int off = 0; 408 int off = 0;
379 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 409 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
380 // if ( QDateTime::currentDateTime() > incidenceStart ){ 410 // if ( QDateTime::currentDateTime() > incidenceStart ){
381// *ok = false; 411// *ok = false;
382// return incidenceStart; 412// return incidenceStart;
383// } 413// }
384 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 414 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
385 if (alarm->enabled()) { 415 if (alarm->enabled()) {
386 if ( alarm->hasTime () ) { 416 if ( alarm->hasTime () ) {
@@ -391,24 +421,37 @@ QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const
391 } 421 }
392 422
393 } else { 423 } else {
394 int secs = alarm->startOffset().asSeconds(); 424 int secs = alarm->startOffset().asSeconds();
395 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 425 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
396 alarmStart = incidenceStart.addSecs( secs ); 426 alarmStart = incidenceStart.addSecs( secs );
397 enabled = true; 427 enabled = true;
398 off = -secs; 428 off = -secs;
399 } 429 }
400 } 430 }
401 } 431 }
402 } 432 }
403 if ( enabled ) { 433 if ( enabled ) {
404 if ( alarmStart > QDateTime::currentDateTime() ) { 434 if ( alarmStart > QDateTime::currentDateTime() ) {
405 *ok = true; 435 *ok = true;
406 * offset = off; 436 * offset = off;
407 return alarmStart; 437 return alarmStart;
408 } 438 }
409 } 439 }
410 *ok = false; 440 *ok = false;
411 return QDateTime (); 441 return QDateTime ();
412 442
413} 443}
414 444
445void Todo::checkSetCompletedFalse()
446{
447 if ( !hasRecurrenceID() ) {
448 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
449 }
450 // qDebug("Todo::checkSetCompletedFalse()");
451 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
452 if ( mPercentComplete == 100 && mDtStart == mRecurrenceID && QDateTime::currentDateTime() > mDtStart) {
453 qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
454 setCompleted( false );
455 qDebug("Todo::checkSetCompletedFalse++++++++++++++++++++++++++++ ");
456 }
457}
diff --git a/libkcal/todo.h b/libkcal/todo.h
index 137b252..a22d4b7 100644
--- a/libkcal/todo.h
+++ b/libkcal/todo.h
@@ -91,44 +91,46 @@ class Todo : public Incidence
91 bool isCompleted() const; 91 bool isCompleted() const;
92 /** set completed state of this todo */ 92 /** set completed state of this todo */
93 void setCompleted(bool); 93 void setCompleted(bool);
94 94
95 /** 95 /**
96 Return how many percent of the task are completed. Returns a value 96 Return how many percent of the task are completed. Returns a value
97 between 0 and 100. 97 between 0 and 100.
98 */ 98 */
99 int percentComplete() const; 99 int percentComplete() const;
100 /** 100 /**
101 Set how many percent of the task are completed. Valid values are in the 101 Set how many percent of the task are completed. Valid values are in the
102 range from 0 to 100. 102 range from 0 to 100.
103 */ 103 */
104 void setPercentComplete(int); 104 void setPercentComplete(int);
105 105
106 /** return date and time when todo was completed */ 106 /** return date and time when todo was completed */
107 QDateTime completed() const; 107 QDateTime completed() const;
108 QString completedStr(bool shortF = true) const; 108 QString completedStr(bool shortF = true) const;
109 /** set date and time of completion */ 109 /** set date and time of completion */
110 void setCompleted(const QDateTime &completed); 110 void setCompleted(const QDateTime &completed);
111 111
112 /** Return true, if todo has a date associated with completion */ 112 /** Return true, if todo has a date associated with completion */
113 bool hasCompletedDate() const; 113 bool hasCompletedDate() const;
114 bool contains ( Todo*); 114 bool contains ( Todo*);
115 void checkSetCompletedFalse();
116 bool setRecurDates();
115 117
116 private: 118 private:
117 bool accept(Visitor &v) { return v.visit(this); } 119 bool accept(Visitor &v) { return v.visit(this); }
118 120
119 QDateTime mDtDue; // due date of todo 121 QDateTime mDtDue; // due date of todo
120 122
121 bool mHasDueDate; // if todo has associated due date 123 bool mHasDueDate; // if todo has associated due date
122 124
123// int mStatus; // confirmed/delegated/tentative/etc 125// int mStatus; // confirmed/delegated/tentative/etc
124 126
125 QDateTime mCompleted; 127 QDateTime mCompleted;
126 bool mHasCompletedDate; 128 bool mHasCompletedDate;
127 129
128 int mPercentComplete; 130 int mPercentComplete;
129}; 131};
130 132
131 bool operator==( const Todo&, const Todo& ); 133 bool operator==( const Todo&, const Todo& );
132} 134}
133 135
134#endif 136#endif