void KOTodoEditor::writeTodo(Todo *todo) { Incidence *oldIncidence = todo->clone(); mRecurrence->writeIncidence(todo); mGeneral->writeTodo(todo); mDetails->writeEvent(todo); if(*(oldIncidence->recurrence()) != *(todo->recurrence())) { todo->setDtDue(todo->dtDue(), true); if(todo->hasStartDate()) todo->setDtStart(todo->dtStart()); } writeDesignerFields(todo); // set related incidence, i.e. parent to-do in this case. if(mRelatedTodo) { todo->setRelatedTo(mRelatedTodo); } cancelRemovedAttendees(todo); }
int main(int argc, char **argv) { KAboutData aboutData("testrecurrencenew", "Load recurrence rules with the new class and print out debug messages", "0.1"); KCmdLineArgs::init(argc, argv, &aboutData); KCmdLineArgs::addCmdLineOptions(options); KApplication app(false, false); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if(args->count() < 1) { args->usage("Wrong number of arguments."); } // use zoneinfo data from source dir set_zone_directory(KDETOPSRCDIR "/libkcal/libical/zoneinfo"); QString input = QFile::decodeName(args->arg(0)); kdDebug(5800) << "Input file: " << input << endl; QTextStream *outstream; outstream = 0; QString fn(""); if(args->count() > 1) { fn = args->arg(1); kdDebug() << "We have a file name given: " << fn << endl; } QFile outfile(fn); if(!fn.isEmpty() && outfile.open(IO_WriteOnly)) { kdDebug() << "Opened output file!!!" << endl; outstream = new QTextStream(&outfile); } CalendarLocal cal(QString::fromLatin1("UTC")); if(!cal.load(input)) return 1; QString tz = cal.nonKDECustomProperty("X-LibKCal-Testsuite-OutTZ"); if(!tz.isEmpty()) { cal.setTimeZoneIdViewOnly(tz); } Incidence::List inc = cal.incidences(); for(Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it) { Incidence *incidence = *it; kdDebug(5800) << "*+*+*+*+*+*+*+*+*+*" << endl; kdDebug(5800) << " -> " << incidence->summary() << " <- " << endl; incidence->recurrence()->dump(); QDateTime dt(incidence->recurrence()->endDateTime()); int i = 0; if(outstream) { if(!dt.isValid()) dt = QDateTime(QDate(2011, 1, 1), QTime(0, 0, 1)); else dt = dt.addYears(2); kdDebug(5800) << "-------------------------------------------" << endl; kdDebug(5800) << " *~*~*~*~ Starting with date: " << dt << endl; // Output to file for testing purposes while(dt.isValid() && i < 500) { dt = dt.addSecs(-1); ++i; dt = incidence->recurrence()->getPreviousDateTime(dt); (*outstream) << dt.toString(Qt::ISODate) << endl; } } else { if(!dt.isValid()) dt = QDateTime(QDate(2005, 7, 31), QTime(23, 59, 59)); else dt = dt.addYears(2); incidence->recurrence()->dump(); kdDebug(5800) << "-------------------------------------------" << endl; kdDebug(5800) << " *~*~*~*~ Starting with date: " << dt << endl; // Output to konsole while(dt.isValid() && i < 50) { dt = dt.addSecs(-1); ++i; kdDebug(5800) << "-------------------------------------------" << endl; dt = incidence->recurrence()->getPreviousDateTime(dt); kdDebug(5800) << " *~*~*~*~ Previous date is: " << dt << endl; } } } delete outstream; outfile.close(); return 0; }
/** Dissociate a single occurrence or all future occurrences from a recurring sequence. The new incidence is returned, but not automatically inserted into the calendar, which is left to the calling application */ Incidence *Calendar::dissociateOccurrence(Incidence *incidence, QDate date, bool single) { if(!incidence || !incidence->doesRecur()) return 0; Incidence *newInc = incidence->clone(); newInc->recreate(); newInc->setRelatedTo(incidence); Recurrence *recur = newInc->recurrence(); if(single) { recur->clear(); } else { // Adjust the recurrence for the future incidences. In particular // adjust the "end after n occurrences" rules! "No end date" and "end by ..." // don't need to be modified. int duration = recur->duration(); if(duration > 0) { int doneduration = recur->durationTo(date.addDays(-1)); if(doneduration >= duration) { kdDebug(5850) << "The dissociated event already occurred more often " << "than it was supposed to ever occur. ERROR!" << endl; recur->clear(); } else { recur->setDuration(duration - doneduration); } } } // Adjust the date of the incidence if(incidence->type() == "Event") { Event *ev = static_cast<Event *>(newInc); QDateTime start(ev->dtStart()); int daysTo = start.date().daysTo(date); ev->setDtStart(start.addDays(daysTo)); ev->setDtEnd(ev->dtEnd().addDays(daysTo)); } else if(incidence->type() == "Todo") { Todo *td = static_cast<Todo *>(newInc); bool haveOffset = false; int daysTo = 0; if(td->hasDueDate()) { QDateTime due(td->dtDue()); daysTo = due.date().daysTo(date); td->setDtDue(due.addDays(daysTo), true); haveOffset = true; } if(td->hasStartDate()) { QDateTime start(td->dtStart()); if(!haveOffset) daysTo = start.date().daysTo(date); td->setDtStart(start.addDays(daysTo)); haveOffset = true; } } recur = incidence->recurrence(); if(recur) { if(single) { recur->addExDate(date); } else { // Make sure the recurrence of the past events ends // at the corresponding day recur->setEndDate(date.addDays(-1)); } } return newInc; }