summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-03-18 15:12:58 (UTC)
committer zautrix <zautrix>2005-03-18 15:12:58 (UTC)
commitf9f521c487143641b2cf077d04fe1c475001bce2 (patch) (unidiff)
tree4ffac6d14ceb3e5d77f7634f2b2a49fd91a9e77a
parent66bc0202d4e2306f7029362fe09d0c7ab0e7cc36 (diff)
downloadkdepimpi-f9f521c487143641b2cf077d04fe1c475001bce2.zip
kdepimpi-f9f521c487143641b2cf077d04fe1c475001bce2.tar.gz
kdepimpi-f9f521c487143641b2cf077d04fe1c475001bce2.tar.bz2
rec fix
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/komonthview.cpp15
-rw-r--r--libkcal/recurrence.cpp34
2 files changed, 14 insertions, 35 deletions
diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp
index cb69832..004ff50 100644
--- a/korganizer/komonthview.cpp
+++ b/korganizer/komonthview.cpp
@@ -1135,301 +1135,292 @@ void KOMonthView::updateDayLabels()
1135 for (int i = 0; i < 7; i++) { 1135 for (int i = 0; i < 7; i++) {
1136 if (mWeekStartsMonday) { 1136 if (mWeekStartsMonday) {
1137 bool show = mShortDayLabelsW; 1137 bool show = mShortDayLabelsW;
1138 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) 1138 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() )
1139 show = true; 1139 show = true;
1140 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); 1140 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show));
1141 } else { 1141 } else {
1142 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsW)); 1142 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsW));
1143 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsW)); 1143 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsW));
1144 1144
1145 } 1145 }
1146 } 1146 }
1147 mDayLabelsT = &mDayLabels; 1147 mDayLabelsT = &mDayLabels;
1148 for (int i = 0; i < 7; i++) { 1148 for (int i = 0; i < 7; i++) {
1149 if (mWeekStartsMonday) { 1149 if (mWeekStartsMonday) {
1150 bool show = mShortDayLabelsM; 1150 bool show = mShortDayLabelsM;
1151 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) 1151 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() )
1152 show = true; 1152 show = true;
1153 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); 1153 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show));
1154 } else { 1154 } else {
1155 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsM)); 1155 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsM));
1156 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsM)); 1156 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsM));
1157 1157
1158 } 1158 }
1159 } 1159 }
1160 1160
1161} 1161}
1162 1162
1163void KOMonthView::showDates(const QDate &start, const QDate &) 1163void KOMonthView::showDates(const QDate &start, const QDate &)
1164{ 1164{
1165 // kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl; 1165 // kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl;
1166 1166
1167 QPtrVector<MonthViewCell> *cells; 1167 QPtrVector<MonthViewCell> *cells;
1168 QPtrVector<QLabel> *dayLabels; 1168 QPtrVector<QLabel> *dayLabels;
1169 QPtrVector<KOWeekButton> *weekLabels; 1169 QPtrVector<KOWeekButton> *weekLabels;
1170 int weekNum = 6; 1170 int weekNum = 6;
1171 if ( mShowWeekView ) { 1171 if ( mShowWeekView ) {
1172 weekNum = 1; 1172 weekNum = 1;
1173 cells = &mCellsW; 1173 cells = &mCellsW;
1174 dayLabels = &mDayLabelsW; 1174 dayLabels = &mDayLabelsW;
1175 weekLabels = &mWeekLabelsW; 1175 weekLabels = &mWeekLabelsW;
1176 } else { 1176 } else {
1177 cells = &mCells; 1177 cells = &mCells;
1178 dayLabels = &mDayLabels; 1178 dayLabels = &mDayLabels;
1179 weekLabels = &mWeekLabels; 1179 weekLabels = &mWeekLabels;
1180 } 1180 }
1181 1181
1182 mStartDate = start; 1182 mStartDate = start;
1183 1183
1184 int startWeekDay = mWeekStartsMonday ? 1 : 7; 1184 int startWeekDay = mWeekStartsMonday ? 1 : 7;
1185 1185
1186 while( KOGlobals::self()->calendarSystem()->dayOfWeek(mStartDate) != startWeekDay ) { 1186 while( KOGlobals::self()->calendarSystem()->dayOfWeek(mStartDate) != startWeekDay ) {
1187 mStartDate = mStartDate.addDays( -1 ); 1187 mStartDate = mStartDate.addDays( -1 );
1188 } 1188 }
1189 1189
1190 bool primary = false; 1190 bool primary = false;
1191 uint i; 1191 uint i;
1192 for( i = 0; i < (*cells).size(); ++i ) { 1192 for( i = 0; i < (*cells).size(); ++i ) {
1193 QDate date = mStartDate.addDays( i ); 1193 QDate date = mStartDate.addDays( i );
1194 (*cells)[i]->setDate( date ); 1194 (*cells)[i]->setDate( date );
1195 1195
1196#ifndef KORG_NOPLUGINS 1196#ifndef KORG_NOPLUGINS
1197 // add holiday, if present 1197 // add holiday, if present
1198 QString hstring(KOCore::self()->holiday(date)); 1198 QString hstring(KOCore::self()->holiday(date));
1199 (*cells)[i]->setHoliday( hstring ); 1199 (*cells)[i]->setHoliday( hstring );
1200#endif 1200#endif
1201 1201
1202 } 1202 }
1203 QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 ); 1203 QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 );
1204 for( i = 0; i < weekNum; ++i ) { 1204 for( i = 0; i < weekNum; ++i ) {
1205 int wno; 1205 int wno;
1206 // remember, according to ISO 8601, the first week of the year is the 1206 // remember, according to ISO 8601, the first week of the year is the
1207 // first week that contains a thursday. Thus we must subtract off 4, 1207 // first week that contains a thursday. Thus we must subtract off 4,
1208 // not just 1. 1208 // not just 1.
1209 int dayOfYear = date.dayOfYear(); 1209 int dayOfYear = date.dayOfYear();
1210 if (dayOfYear % 7 != 0) 1210 if (dayOfYear % 7 != 0)
1211 wno = dayOfYear / 7 + 1; 1211 wno = dayOfYear / 7 + 1;
1212 else 1212 else
1213 wno =dayOfYear / 7; 1213 wno =dayOfYear / 7;
1214 (*weekLabels)[i]->setWeekNum( wno ); 1214 (*weekLabels)[i]->setWeekNum( wno );
1215 date = date.addDays( 7 ); 1215 date = date.addDays( 7 );
1216 } 1216 }
1217 updateView(); 1217 updateView();
1218} 1218}
1219 1219
1220void KOMonthView::showEvents(QPtrList<Event>) 1220void KOMonthView::showEvents(QPtrList<Event>)
1221{ 1221{
1222 qDebug("KOMonthView::selectEvents is not implemented yet. "); 1222 qDebug("KOMonthView::selectEvents is not implemented yet. ");
1223} 1223}
1224 1224
1225void KOMonthView::changeEventDisplay(Event *, int) 1225void KOMonthView::changeEventDisplay(Event *, int)
1226{ 1226{
1227 // this should be re-written to be much more efficient, but this 1227 // this should be re-written to be much more efficient, but this
1228 // quick-and-dirty-hack gets the job done for right now. 1228 // quick-and-dirty-hack gets the job done for right now.
1229 updateView(); 1229 updateView();
1230} 1230}
1231 1231
1232void KOMonthView::updateView() 1232void KOMonthView::updateView()
1233{ 1233{
1234 1234
1235 if ( !updatePossible ) 1235 if ( !updatePossible )
1236 return; 1236 return;
1237 //QTime ti; 1237 //QTime ti;
1238 //ti.start(); 1238 //ti.start();
1239 clearSelection(); 1239 clearSelection();
1240 QPtrVector<MonthViewCell> *cells; 1240 QPtrVector<MonthViewCell> *cells;
1241 if ( mShowWeekView ) { 1241 if ( mShowWeekView ) {
1242 cells = &mCellsW; 1242 cells = &mCellsW;
1243 } else { 1243 } else {
1244 cells = &mCells; 1244 cells = &mCells;
1245 } 1245 }
1246#if 1 1246#if 1
1247 int i; 1247 int i;
1248 int timeSpan = (*cells).size()-1; 1248 int timeSpan = (*cells).size()-1;
1249 if ( KOPrefs::instance()->mMonthViewWeek ) 1249 if ( KOPrefs::instance()->mMonthViewWeek )
1250 timeSpan = 6; 1250 timeSpan = 6;
1251 for( i = 0; i < timeSpan + 1; ++i ) { 1251 for( i = 0; i < timeSpan + 1; ++i ) {
1252 (*cells)[i]->startUpdateCell(); 1252 (*cells)[i]->startUpdateCell();
1253 } 1253 }
1254 1254
1255 QPtrList<Event> events = calendar()->events(); 1255 QPtrList<Event> events = calendar()->events();
1256 Event *event; 1256 Event *event;
1257 QDateTime dt; 1257 QDateTime dt;
1258 bool ok; 1258 bool ok;
1259 QDate endDate = mStartDate.addDays( timeSpan ); 1259 QDate endDate = mStartDate.addDays( timeSpan );
1260 for( event = events.first(); event; event = events.next() ) { // for event 1260 for( event = events.first(); event; event = events.next() ) { // for event
1261 if ( event->doesRecur() ) { 1261 if ( event->doesRecur() ) {
1262 bool last; 1262 bool last;
1263 qDebug("********************************************** ");
1264 qDebug("Event summary: %s ", event->summary().latin1());
1265 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last ); 1263 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last );
1266 QDateTime incidenceEnd; 1264 QDateTime incidenceEnd;
1267 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() ); 1265 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() );
1268 qDebug("eventlen %d ", eventlen);
1269 bool invalid = false; 1266 bool invalid = false;
1270 while( true ) { 1267 while( true ) {
1271 if ( incidenceStart.isValid() ) { 1268 if ( incidenceStart.isValid() ) {
1272 incidenceEnd = incidenceStart.addDays( eventlen ); 1269 incidenceEnd = incidenceStart.addDays( eventlen );
1273 int st = incidenceStart.date().daysTo( endDate ); 1270 int st = incidenceStart.date().daysTo( endDate );
1274 if ( st >= 0 ) { // start before timeend 1271 if ( st >= 0 ) { // start before timeend
1275 int end = mStartDate.daysTo( incidenceEnd.date() ); 1272 int end = mStartDate.daysTo( incidenceEnd.date() );
1276 if ( end >= 0 ) { // end after timestart --- got one! 1273 if ( end >= 0 ) { // end after timestart --- got one!
1277 //normalize 1274 //normalize
1278 st = timeSpan - st; 1275 st = timeSpan - st;
1279 if ( st < 0 ) st = 0; 1276 if ( st < 0 ) st = 0;
1280 if ( end > timeSpan ) end = timeSpan; 1277 if ( end > timeSpan ) end = timeSpan;
1281 int iii; 1278 int iii;
1282 //qDebug("found %s %d %d ",event->summary().latin1(), st, end ); 1279 //qDebug("found %s %d %d ",event->summary().latin1(), st, end );
1283 for ( iii = st;iii<= end;++iii) 1280 for ( iii = st;iii<= end;++iii)
1284 (*cells)[iii]->insertEvent( event ); 1281 (*cells)[iii]->insertEvent( event );
1285 } 1282 }
1286 } 1283 }
1287 } else { 1284 } else {
1288 if ( invalid ) 1285 if ( invalid )
1289 break; 1286 break;
1290 invalid = true; 1287 invalid = true;
1291 qDebug("invalid %s", event->summary().latin1()); 1288 //qDebug("invalid %s", event->summary().latin1());
1292 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );; 1289 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );;
1293 } 1290 }
1294 if ( last ) 1291 if ( last )
1295 break; 1292 break;
1296 bool ok; 1293 bool ok;
1297 qDebug("TRY next occurence %s ", incidenceStart.toString().latin1());
1298 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok ); 1294 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok );
1299 if ( ! ok ) { 1295 if ( ! ok )
1300 qDebug("NOT OK ");
1301 break; 1296 break;
1302 } 1297 if ( incidenceStart.date() > endDate )
1303 if ( incidenceStart.date() > endDate ) {
1304 qDebug("incidenceStart.date() > endDate ");
1305 break; 1298 break;
1306 }
1307 qDebug("next occurence %s ", incidenceStart.toString().latin1());
1308 } 1299 }
1309 } else { // no recur 1300 } else { // no recur
1310 int st = event->dtStart().date().daysTo( endDate ); 1301 int st = event->dtStart().date().daysTo( endDate );
1311 if ( st >= 0 ) { // start before timeend 1302 if ( st >= 0 ) { // start before timeend
1312 int end = mStartDate.daysTo( event->dtEnd().date() ); 1303 int end = mStartDate.daysTo( event->dtEnd().date() );
1313 if ( end >= 0 ) { // end after timestart --- got one! 1304 if ( end >= 0 ) { // end after timestart --- got one!
1314 //normalize 1305 //normalize
1315 st = timeSpan - st; 1306 st = timeSpan - st;
1316 if ( st < 0 ) st = 0; 1307 if ( st < 0 ) st = 0;
1317 if ( end > timeSpan ) end = timeSpan; 1308 if ( end > timeSpan ) end = timeSpan;
1318 int iii; 1309 int iii;
1319 for ( iii = st;iii<= end;++iii) 1310 for ( iii = st;iii<= end;++iii)
1320 (*cells)[iii]->insertEvent( event ); 1311 (*cells)[iii]->insertEvent( event );
1321 } 1312 }
1322 } 1313 }
1323 } 1314 }
1324 } 1315 }
1325 // insert due todos 1316 // insert due todos
1326 QPtrList<Todo> todos = calendar()->todos( ); 1317 QPtrList<Todo> todos = calendar()->todos( );
1327 Todo *todo; 1318 Todo *todo;
1328 for(todo = todos.first(); todo; todo = todos.next()) { 1319 for(todo = todos.first(); todo; todo = todos.next()) {
1329 //insertTodo( todo ); 1320 //insertTodo( todo );
1330 if ( todo->hasDueDate() ) { 1321 if ( todo->hasDueDate() ) {
1331 int day = mStartDate.daysTo( todo->dtDue().date() ); 1322 int day = mStartDate.daysTo( todo->dtDue().date() );
1332 if ( day >= 0 && day < timeSpan + 1) { 1323 if ( day >= 0 && day < timeSpan + 1) {
1333 (*cells)[day]->insertTodo( todo ); 1324 (*cells)[day]->insertTodo( todo );
1334 } 1325 }
1335 } 1326 }
1336 } 1327 }
1337 1328
1338 for( i = 0; i < timeSpan+1; ++i ) { 1329 for( i = 0; i < timeSpan+1; ++i ) {
1339 (*cells)[i]->finishUpdateCell(); 1330 (*cells)[i]->finishUpdateCell();
1340 } 1331 }
1341 processSelectionChange(); 1332 processSelectionChange();
1342 (*cells)[0]->setFocus(); 1333 (*cells)[0]->setFocus();
1343 1334
1344 1335
1345#else 1336#else
1346 // old code 1337 // old code
1347 //qDebug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "); 1338 //qDebug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ");
1348 int i; 1339 int i;
1349 for( i = 0; i < (*cells).count(); ++i ) { 1340 for( i = 0; i < (*cells).count(); ++i ) {
1350 (*cells)[i]->updateCell(); 1341 (*cells)[i]->updateCell();
1351 } 1342 }
1352 1343
1353 //qDebug("KOMonthView::updateView() "); 1344 //qDebug("KOMonthView::updateView() ");
1354 processSelectionChange(); 1345 processSelectionChange();
1355 // qDebug("---------------------------------------------------------------------+ "); 1346 // qDebug("---------------------------------------------------------------------+ ");
1356 (*cells)[0]->setFocus(); 1347 (*cells)[0]->setFocus();
1357#endif 1348#endif
1358 1349
1359 //qDebug("update time %d ", ti.elapsed()); 1350 //qDebug("update time %d ", ti.elapsed());
1360} 1351}
1361 1352
1362void KOMonthView::resizeEvent(QResizeEvent * e) 1353void KOMonthView::resizeEvent(QResizeEvent * e)
1363{ 1354{
1364 //qDebug("KOMonthView::resizeEvent %d %d -- %d %d ", e->size().width(), e->size().height(), e->oldSize().width(), e->oldSize().height()); 1355 //qDebug("KOMonthView::resizeEvent %d %d -- %d %d ", e->size().width(), e->size().height(), e->oldSize().width(), e->oldSize().height());
1365 computeLayout(); 1356 computeLayout();
1366 clPending = true; 1357 clPending = true;
1367 if ( mShowWeekView ) 1358 if ( mShowWeekView )
1368 mCellsW[0]->setFocus(); 1359 mCellsW[0]->setFocus();
1369 else 1360 else
1370 mCells[0]->setFocus(); 1361 mCells[0]->setFocus();
1371} 1362}
1372void KOMonthView::computeLayoutWeek() 1363void KOMonthView::computeLayoutWeek()
1373{ 1364{
1374 static int lastWid = 0; 1365 static int lastWid = 0;
1375 static int lastHei = 0; 1366 static int lastHei = 0;
1376 int daysToShow; 1367 int daysToShow;
1377 bool combinedSatSun = false; 1368 bool combinedSatSun = false;
1378 if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) { 1369 if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) {
1379 daysToShow = 6; 1370 daysToShow = 6;
1380 combinedSatSun = true; 1371 combinedSatSun = true;
1381 } 1372 }
1382 int tWid = topLevelWidget()->size().width(); 1373 int tWid = topLevelWidget()->size().width();
1383 int tHei = topLevelWidget()->size().height(); 1374 int tHei = topLevelWidget()->size().height();
1384 1375
1385 int wid = width();//e 1376 int wid = width();//e
1386 int hei = height()-1-mNavigatorBar->height(); 1377 int hei = height()-1-mNavigatorBar->height();
1387 1378
1388 if ( ((wid *3)/2) < tWid && (( hei *3) /2) < tHei ) 1379 if ( ((wid *3)/2) < tWid && (( hei *3) /2) < tHei )
1389 return; 1380 return;
1390 1381
1391 if ( lastWid == width() && lastHei == height() ) 1382 if ( lastWid == width() && lastHei == height() )
1392 return; 1383 return;
1393 lastWid = width(); 1384 lastWid = width();
1394 lastHei = height(); 1385 lastHei = height();
1395 1386
1396 1387
1397 if ( wid < hei ) 1388 if ( wid < hei )
1398 daysToShow = 2; 1389 daysToShow = 2;
1399 else 1390 else
1400 daysToShow = 3; 1391 daysToShow = 3;
1401 mShowSatSunComp = true; 1392 mShowSatSunComp = true;
1402 combinedSatSun = true; 1393 combinedSatSun = true;
1403 1394
1404 //qDebug("KOMonthView::computeLayout() WWW ------------------------------------ "); 1395 //qDebug("KOMonthView::computeLayout() WWW ------------------------------------ ");
1405 QFontMetrics fm ( mWeekLabels[0]->font() ); 1396 QFontMetrics fm ( mWeekLabels[0]->font() );
1406 int weeklabelwid = fm.width( "888" ); 1397 int weeklabelwid = fm.width( "888" );
1407 wid -= weeklabelwid; 1398 wid -= weeklabelwid;
1408 1399
1409 int colWid = wid / daysToShow; 1400 int colWid = wid / daysToShow;
1410 int lastCol = wid - ( colWid*6 ); 1401 int lastCol = wid - ( colWid*6 );
1411 int dayLabelHei = mDayLabelsW[0]->sizeHint().height(); 1402 int dayLabelHei = mDayLabelsW[0]->sizeHint().height();
1412 int cellHei = (hei - (5- daysToShow )*dayLabelHei) /(5- daysToShow ); 1403 int cellHei = (hei - (5- daysToShow )*dayLabelHei) /(5- daysToShow );
1413 int colModulo = wid % daysToShow; 1404 int colModulo = wid % daysToShow;
1414 int rowModulo = (hei- (5- daysToShow )*dayLabelHei) % daysToShow-1; 1405 int rowModulo = (hei- (5- daysToShow )*dayLabelHei) % daysToShow-1;
1415 //qDebug("rowmod %d ", rowModulo); 1406 //qDebug("rowmod %d ", rowModulo);
1416 int i; 1407 int i;
1417 int x,y,w,h; 1408 int x,y,w,h;
1418 x= 0; 1409 x= 0;
1419 y= 0; 1410 y= 0;
1420 w = colWid; 1411 w = colWid;
1421 h = dayLabelHei ; 1412 h = dayLabelHei ;
1422 for ( i = 0; i < 7; i++) { 1413 for ( i = 0; i < 7; i++) {
1423 if ( i && !( i % daysToShow) && i < 6) { 1414 if ( i && !( i % daysToShow) && i < 6) {
1424 y += hei/(5-daysToShow); 1415 y += hei/(5-daysToShow);
1425 x = 0; 1416 x = 0;
1426 w = colWid; 1417 w = colWid;
1427 } 1418 }
1428 if ( ((i) % daysToShow) >= daysToShow-colModulo ) { 1419 if ( ((i) % daysToShow) >= daysToShow-colModulo ) {
1429 ++w; 1420 ++w;
1430 } 1421 }
1431 if ( i >= 5 ) { 1422 if ( i >= 5 ) {
1432 mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,w/2+w%2,h); 1423 mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,w/2+w%2,h);
1433 x -= (w/2 ); 1424 x -= (w/2 );
1434 } 1425 }
1435 else 1426 else
diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp
index 8a175c9..6ee5499 100644
--- a/libkcal/recurrence.cpp
+++ b/libkcal/recurrence.cpp
@@ -851,569 +851,566 @@ QDateTime Recurrence::getNextDateTime(const QDateTime &preDateTime, bool *last)
851 851
852 // It's a sub-daily recurrence 852 // It's a sub-daily recurrence
853 if (preDateTime < mRecurStart) 853 if (preDateTime < mRecurStart)
854 return mRecurStart; 854 return mRecurStart;
855 int count = mRecurStart.secsTo(preDateTime) / freq + 2; 855 int count = mRecurStart.secsTo(preDateTime) / freq + 2;
856 if (rDuration > 0) { 856 if (rDuration > 0) {
857 if (count > rDuration) 857 if (count > rDuration)
858 return QDateTime(); 858 return QDateTime();
859 if (last && count == rDuration) 859 if (last && count == rDuration)
860 *last = true; 860 *last = true;
861 } 861 }
862 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq); 862 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq);
863 if (rDuration == 0) { 863 if (rDuration == 0) {
864 if (endtime > rEndDateTime) 864 if (endtime > rEndDateTime)
865 return QDateTime(); 865 return QDateTime();
866 if (last && endtime == rEndDateTime) 866 if (last && endtime == rEndDateTime)
867 *last = true; 867 *last = true;
868 } 868 }
869 return endtime; 869 return endtime;
870} 870}
871 871
872QDate Recurrence::getNextDate(const QDate &preDate, bool *last) const 872QDate Recurrence::getNextDate(const QDate &preDate, bool *last) const
873{ 873{
874 if (last) 874 if (last)
875 *last = false; 875 *last = false;
876 switch (recurs) 876 switch (recurs)
877 { 877 {
878 case rMinutely: 878 case rMinutely:
879 case rHourly: 879 case rHourly:
880 return getNextDateTime(QDateTime(preDate, QTime(23,59,59)), last).date(); 880 return getNextDateTime(QDateTime(preDate, QTime(23,59,59)), last).date();
881 case rDaily: 881 case rDaily:
882 case rWeekly: 882 case rWeekly:
883 case rMonthlyPos: 883 case rMonthlyPos:
884 case rMonthlyDay: 884 case rMonthlyDay:
885 case rYearlyMonth: 885 case rYearlyMonth:
886 case rYearlyDay: 886 case rYearlyDay:
887 case rYearlyPos: 887 case rYearlyPos:
888 qDebug("Recurrence::getNextDate: MAY BE BROKEN "); 888 qDebug("Recurrence::getNextDate: MAY BE BROKEN ");
889 return getNextDateNoTime(preDate, last); 889 return getNextDateNoTime(preDate, last);
890 default: 890 default:
891 return QDate(); 891 return QDate();
892 } 892 }
893} 893}
894 894
895 895
896QDateTime Recurrence::getPreviousDateTime(const QDateTime &afterDateTime, bool *last) const 896QDateTime Recurrence::getPreviousDateTime(const QDateTime &afterDateTime, bool *last) const
897{ 897{
898 if (last) 898 if (last)
899 *last = false; 899 *last = false;
900 int freq; 900 int freq;
901 switch (recurs) 901 switch (recurs)
902 { 902 {
903 case rMinutely: 903 case rMinutely:
904 freq = rFreq * 60; 904 freq = rFreq * 60;
905 break; 905 break;
906 case rHourly: 906 case rHourly:
907 freq = rFreq * 3600; 907 freq = rFreq * 3600;
908 break; 908 break;
909 case rDaily: 909 case rDaily:
910 case rWeekly: 910 case rWeekly:
911 case rMonthlyPos: 911 case rMonthlyPos:
912 case rMonthlyDay: 912 case rMonthlyDay:
913 case rYearlyMonth: 913 case rYearlyMonth:
914 case rYearlyDay: 914 case rYearlyDay:
915 case rYearlyPos: { 915 case rYearlyPos: {
916 QDate afterDate = afterDateTime.date(); 916 QDate afterDate = afterDateTime.date();
917 if (!mFloats && mRecurStart.time() < afterDateTime.time()) 917 if (!mFloats && mRecurStart.time() < afterDateTime.time())
918 afterDate = afterDate.addDays(1); 918 afterDate = afterDate.addDays(1);
919 return QDateTime(getPreviousDateNoTime(afterDate, last), mRecurStart.time()); 919 return QDateTime(getPreviousDateNoTime(afterDate, last), mRecurStart.time());
920 } 920 }
921 default: 921 default:
922 return QDateTime(); 922 return QDateTime();
923 } 923 }
924 924
925 // It's a sub-daily recurrence 925 // It's a sub-daily recurrence
926 if (afterDateTime <= mRecurStart) 926 if (afterDateTime <= mRecurStart)
927 return QDateTime(); 927 return QDateTime();
928 int count = (mRecurStart.secsTo(afterDateTime) - 1) / freq + 1; 928 int count = (mRecurStart.secsTo(afterDateTime) - 1) / freq + 1;
929 if (rDuration > 0) { 929 if (rDuration > 0) {
930 if (count > rDuration) 930 if (count > rDuration)
931 count = rDuration; 931 count = rDuration;
932 if (last && count == rDuration) 932 if (last && count == rDuration)
933 *last = true; 933 *last = true;
934 } 934 }
935 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq); 935 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq);
936 if (rDuration == 0) { 936 if (rDuration == 0) {
937 if (endtime > rEndDateTime) 937 if (endtime > rEndDateTime)
938 endtime = rEndDateTime; 938 endtime = rEndDateTime;
939 if (last && endtime == rEndDateTime) 939 if (last && endtime == rEndDateTime)
940 *last = true; 940 *last = true;
941 } 941 }
942 return endtime; 942 return endtime;
943} 943}
944 944
945QDate Recurrence::getPreviousDate(const QDate &afterDate, bool *last) const 945QDate Recurrence::getPreviousDate(const QDate &afterDate, bool *last) const
946{ 946{
947 if (last) 947 if (last)
948 *last = false; 948 *last = false;
949 switch (recurs) 949 switch (recurs)
950 { 950 {
951 case rMinutely: 951 case rMinutely:
952 case rHourly: 952 case rHourly:
953 return getPreviousDateTime(QDateTime(afterDate, QTime(0,0,0)), last).date(); 953 return getPreviousDateTime(QDateTime(afterDate, QTime(0,0,0)), last).date();
954 case rDaily: 954 case rDaily:
955 case rWeekly: 955 case rWeekly:
956 case rMonthlyPos: 956 case rMonthlyPos:
957 case rMonthlyDay: 957 case rMonthlyDay:
958 case rYearlyMonth: 958 case rYearlyMonth:
959 case rYearlyDay: 959 case rYearlyDay:
960 case rYearlyPos: 960 case rYearlyPos:
961 return getPreviousDateNoTime(afterDate, last); 961 return getPreviousDateNoTime(afterDate, last);
962 default: 962 default:
963 return QDate(); 963 return QDate();
964 } 964 }
965} 965}
966 966
967 967
968/***************************** PROTECTED FUNCTIONS ***************************/ 968/***************************** PROTECTED FUNCTIONS ***************************/
969 969
970bool Recurrence::recursSecondly(const QDate &qd, int secondFreq) const 970bool Recurrence::recursSecondly(const QDate &qd, int secondFreq) const
971{ 971{
972 if ((qd >= mRecurStart.date()) && 972 if ((qd >= mRecurStart.date()) &&
973 ((rDuration > 0) && (qd <= endDate()) || 973 ((rDuration > 0) && (qd <= endDate()) ||
974 ((rDuration == 0) && (qd <= rEndDateTime.date())) || 974 ((rDuration == 0) && (qd <= rEndDateTime.date())) ||
975 (rDuration == -1))) { 975 (rDuration == -1))) {
976 // The date queried falls within the range of the event. 976 // The date queried falls within the range of the event.
977 if (secondFreq < 24*3600) 977 if (secondFreq < 24*3600)
978 return true; // the event recurs at least once each day 978 return true; // the event recurs at least once each day
979 int after = mRecurStart.secsTo(QDateTime(qd)); 979 int after = mRecurStart.secsTo(QDateTime(qd)) - 1;
980 if (after / secondFreq != (after + 24*3600) / secondFreq) 980 if (after / secondFreq != (after + 24*3600) / secondFreq)
981 return true; 981 return true;
982 } 982 }
983 return false; 983 return false;
984} 984}
985 985
986bool Recurrence::recursMinutelyAt(const QDateTime &dt, int minuteFreq) const 986bool Recurrence::recursMinutelyAt(const QDateTime &dt, int minuteFreq) const
987{ 987{
988 if ((dt >= mRecurStart) && 988 if ((dt >= mRecurStart) &&
989 ((rDuration > 0) && (dt <= endDateTime()) || 989 ((rDuration > 0) && (dt <= endDateTime()) ||
990 ((rDuration == 0) && (dt <= rEndDateTime)) || 990 ((rDuration == 0) && (dt <= rEndDateTime)) ||
991 (rDuration == -1))) { 991 (rDuration == -1))) {
992 // The time queried falls within the range of the event. 992 // The time queried falls within the range of the event.
993 if (((mRecurStart.secsTo(dt) / 60) % minuteFreq) == 0) 993 if (((mRecurStart.secsTo(dt) / 60) % minuteFreq) == 0)
994 return true; 994 return true;
995 } 995 }
996 return false; 996 return false;
997} 997}
998 998
999bool Recurrence::recursDaily(const QDate &qd) const 999bool Recurrence::recursDaily(const QDate &qd) const
1000{ 1000{
1001 QDate dStart = mRecurStart.date(); 1001 QDate dStart = mRecurStart.date();
1002 if ((dStart.daysTo(qd) % rFreq) == 0) { 1002 if ((dStart.daysTo(qd) % rFreq) == 0) {
1003 // The date is a day which recurs 1003 // The date is a day which recurs
1004 if (qd >= dStart 1004 if (qd >= dStart
1005 && ((rDuration > 0 && qd <= endDate()) || 1005 && ((rDuration > 0 && qd <= endDate()) ||
1006 (rDuration == 0 && qd <= rEndDateTime.date()) || 1006 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1007 rDuration == -1)) { 1007 rDuration == -1)) {
1008 // The date queried falls within the range of the event. 1008 // The date queried falls within the range of the event.
1009 return true; 1009 return true;
1010 } 1010 }
1011 } 1011 }
1012 return false; 1012 return false;
1013} 1013}
1014 1014
1015bool Recurrence::recursWeekly(const QDate &qd) const 1015bool Recurrence::recursWeekly(const QDate &qd) const
1016{ 1016{
1017 QDate dStart = mRecurStart.date(); 1017 QDate dStart = mRecurStart.date();
1018 if ((dStart.daysTo(qd)/7) % rFreq == 0) { 1018 if ((dStart.daysTo(qd)/7) % rFreq == 0) {
1019 // The date is in a week which recurs 1019 // The date is in a week which recurs
1020 if (qd >= dStart 1020 if (qd >= dStart
1021 && ((rDuration > 0 && qd <= endDate()) || 1021 && ((rDuration > 0 && qd <= endDate()) ||
1022 (rDuration == 0 && qd <= rEndDateTime.date()) || 1022 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1023 rDuration == -1)) { 1023 rDuration == -1)) {
1024 // The date queried falls within the range of the event. 1024 // The date queried falls within the range of the event.
1025 // check if the bits set match today. 1025 // check if the bits set match today.
1026 int i = qd.dayOfWeek()-1; 1026 int i = qd.dayOfWeek()-1;
1027 if (rDays.testBit((uint) i)) 1027 if (rDays.testBit((uint) i))
1028 return true; 1028 return true;
1029 } 1029 }
1030 } 1030 }
1031 return false; 1031 return false;
1032} 1032}
1033 1033
1034bool Recurrence::recursMonthly(const QDate &qd) const 1034bool Recurrence::recursMonthly(const QDate &qd) const
1035{ 1035{
1036 QDate dStart = mRecurStart.date(); 1036 QDate dStart = mRecurStart.date();
1037 int year = qd.year(); 1037 int year = qd.year();
1038 int month = qd.month(); 1038 int month = qd.month();
1039 int day = qd.day(); 1039 int day = qd.day();
1040 // calculate how many months ahead this date is from the original 1040 // calculate how many months ahead this date is from the original
1041 // event's date 1041 // event's date
1042 int monthsAhead = (year - dStart.year()) * 12 + (month - dStart.month()); 1042 int monthsAhead = (year - dStart.year()) * 12 + (month - dStart.month());
1043 if ((monthsAhead % rFreq) == 0) { 1043 if ((monthsAhead % rFreq) == 0) {
1044 // The date is in a month which recurs 1044 // The date is in a month which recurs
1045 if (qd >= dStart 1045 if (qd >= dStart
1046 && ((rDuration > 0 && qd <= endDate()) || 1046 && ((rDuration > 0 && qd <= endDate()) ||
1047 (rDuration == 0 && qd <= rEndDateTime.date()) || 1047 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1048 rDuration == -1)) { 1048 rDuration == -1)) {
1049 // The date queried falls within the range of the event. 1049 // The date queried falls within the range of the event.
1050 QValueList<int> days; 1050 QValueList<int> days;
1051 int daysInMonth = qd.daysInMonth(); 1051 int daysInMonth = qd.daysInMonth();
1052 if (recurs == rMonthlyDay) 1052 if (recurs == rMonthlyDay)
1053 getMonthlyDayDays(days, daysInMonth); 1053 getMonthlyDayDays(days, daysInMonth);
1054 else if (recurs == rMonthlyPos) 1054 else if (recurs == rMonthlyPos)
1055 getMonthlyPosDays(days, daysInMonth, QDate(year, month, 1).dayOfWeek()); 1055 getMonthlyPosDays(days, daysInMonth, QDate(year, month, 1).dayOfWeek());
1056 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) { 1056 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) {
1057 if (*it == day) 1057 if (*it == day)
1058 return true; 1058 return true;
1059 } 1059 }
1060 // no dates matched 1060 // no dates matched
1061 } 1061 }
1062 } 1062 }
1063 return false; 1063 return false;
1064} 1064}
1065 1065
1066bool Recurrence::recursYearlyByMonth(const QDate &qd) const 1066bool Recurrence::recursYearlyByMonth(const QDate &qd) const
1067{ 1067{
1068 QDate dStart = mRecurStart.date(); 1068 QDate dStart = mRecurStart.date();
1069 int startDay = dStart.day(); 1069 int startDay = dStart.day();
1070 int qday = qd.day(); 1070 int qday = qd.day();
1071 int qmonth = qd.month(); 1071 int qmonth = qd.month();
1072 int qyear = qd.year(); 1072 int qyear = qd.year();
1073 bool match = (qday == startDay); 1073 bool match = (qday == startDay);
1074 if (!match && startDay == 29 && dStart.month() == 2) { 1074 if (!match && startDay == 29 && dStart.month() == 2) {
1075 // It's a recurrence on February 29th 1075 // It's a recurrence on February 29th
1076 switch (mFeb29YearlyType) { 1076 switch (mFeb29YearlyType) {
1077 case rFeb28: 1077 case rFeb28:
1078 if (qday == 28 && qmonth == 2 && !QDate::leapYear(qyear)) 1078 if (qday == 28 && qmonth == 2 && !QDate::leapYear(qyear))
1079 match = true; 1079 match = true;
1080 break; 1080 break;
1081 case rMar1: 1081 case rMar1:
1082 if (qday == 1 && qmonth == 3 && !QDate::leapYear(qyear)) { 1082 if (qday == 1 && qmonth == 3 && !QDate::leapYear(qyear)) {
1083 qmonth = 2; 1083 qmonth = 2;
1084 match = true; 1084 match = true;
1085 } 1085 }
1086 break; 1086 break;
1087 case rFeb29: 1087 case rFeb29:
1088 break; 1088 break;
1089 } 1089 }
1090 } 1090 }
1091 1091
1092 if (match) { 1092 if (match) {
1093 // The day of the month matches. Calculate how many years ahead 1093 // The day of the month matches. Calculate how many years ahead
1094 // this date is from the original event's date. 1094 // this date is from the original event's date.
1095 int yearsAhead = (qyear - dStart.year()); 1095 int yearsAhead = (qyear - dStart.year());
1096 if (yearsAhead % rFreq == 0) { 1096 if (yearsAhead % rFreq == 0) {
1097 // The date is in a year which recurs 1097 // The date is in a year which recurs
1098 if (qd >= dStart 1098 if (qd >= dStart
1099 && ((rDuration > 0 && qd <= endDate()) || 1099 && ((rDuration > 0 && qd <= endDate()) ||
1100 (rDuration == 0 && qd <= rEndDateTime.date()) || 1100 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1101 rDuration == -1)) { 1101 rDuration == -1)) {
1102 // The date queried falls within the range of the event. 1102 // The date queried falls within the range of the event.
1103 int i = qmonth; 1103 int i = qmonth;
1104 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1104 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1105 if (i == *qlin.current()) 1105 if (i == *qlin.current())
1106 return true; 1106 return true;
1107 } 1107 }
1108 } 1108 }
1109 } 1109 }
1110 } 1110 }
1111 return false; 1111 return false;
1112} 1112}
1113 1113
1114bool Recurrence::recursYearlyByPos(const QDate &qd) const 1114bool Recurrence::recursYearlyByPos(const QDate &qd) const
1115{ 1115{
1116 QDate dStart = mRecurStart.date(); 1116 QDate dStart = mRecurStart.date();
1117 int year = qd.year(); 1117 int year = qd.year();
1118 int month = qd.month(); 1118 int month = qd.month();
1119 int day = qd.day(); 1119 int day = qd.day();
1120 // calculate how many years ahead this date is from the original 1120 // calculate how many years ahead this date is from the original
1121 // event's date 1121 // event's date
1122 int yearsAhead = (year - dStart.year()); 1122 int yearsAhead = (year - dStart.year());
1123 if (yearsAhead % rFreq == 0) { 1123 if (yearsAhead % rFreq == 0) {
1124 // The date is in a year which recurs 1124 // The date is in a year which recurs
1125 if (qd >= dStart 1125 if (qd >= dStart
1126 && ((rDuration > 0 && qd <= endDate()) || 1126 && ((rDuration > 0 && qd <= endDate()) ||
1127 (rDuration == 0 && qd <= rEndDateTime.date()) || 1127 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1128 rDuration == -1)) { 1128 rDuration == -1)) {
1129 // The date queried falls within the range of the event. 1129 // The date queried falls within the range of the event.
1130 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1130 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1131 if (month == *qlin.current()) { 1131 if (month == *qlin.current()) {
1132 // The month recurs 1132 // The month recurs
1133 QValueList<int> days; 1133 QValueList<int> days;
1134 getMonthlyPosDays(days, qd.daysInMonth(), QDate(year, month, 1).dayOfWeek()); 1134 getMonthlyPosDays(days, qd.daysInMonth(), QDate(year, month, 1).dayOfWeek());
1135 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) { 1135 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) {
1136 if (*it == day) 1136 if (*it == day)
1137 return true; 1137 return true;
1138 } 1138 }
1139 } 1139 }
1140 } 1140 }
1141 } 1141 }
1142 } 1142 }
1143 return false; 1143 return false;
1144} 1144}
1145 1145
1146bool Recurrence::recursYearlyByDay(const QDate &qd) const 1146bool Recurrence::recursYearlyByDay(const QDate &qd) const
1147{ 1147{
1148 QDate dStart = mRecurStart.date(); 1148 QDate dStart = mRecurStart.date();
1149 // calculate how many years ahead this date is from the original 1149 // calculate how many years ahead this date is from the original
1150 // event's date 1150 // event's date
1151 int yearsAhead = (qd.year() - dStart.year()); 1151 int yearsAhead = (qd.year() - dStart.year());
1152 if (yearsAhead % rFreq == 0) { 1152 if (yearsAhead % rFreq == 0) {
1153 // The date is in a year which recurs 1153 // The date is in a year which recurs
1154 if (qd >= dStart 1154 if (qd >= dStart
1155 && ((rDuration > 0 && qd <= endDate()) || 1155 && ((rDuration > 0 && qd <= endDate()) ||
1156 (rDuration == 0 && qd <= rEndDateTime.date()) || 1156 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1157 rDuration == -1)) { 1157 rDuration == -1)) {
1158 // The date queried falls within the range of the event. 1158 // The date queried falls within the range of the event.
1159 int i = qd.dayOfYear(); 1159 int i = qd.dayOfYear();
1160 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1160 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1161 if (i == *qlin.current()) 1161 if (i == *qlin.current())
1162 return true; 1162 return true;
1163 } 1163 }
1164 } 1164 }
1165 } 1165 }
1166 return false; 1166 return false;
1167} 1167}
1168 1168
1169/* Get the date of the next recurrence, after the specified date. 1169/* Get the date of the next recurrence, after the specified date.
1170 * If 'last' is non-null, '*last' is set to true if the next recurrence is the 1170 * If 'last' is non-null, '*last' is set to true if the next recurrence is the
1171 * last recurrence, else false. 1171 * last recurrence, else false.
1172 * Reply = date of next recurrence, or invalid date if none. 1172 * Reply = date of next recurrence, or invalid date if none.
1173 */ 1173 */
1174QDate Recurrence::getNextDateNoTime(const QDate &preDate, bool *last) const 1174QDate Recurrence::getNextDateNoTime(const QDate &preDate, bool *last) const
1175{ 1175{
1176 1176
1177 if (last) 1177 if (last)
1178 *last = false; 1178 *last = false;
1179 QDate dStart = mRecurStart.date(); 1179 QDate dStart = mRecurStart.date();
1180 if (preDate < dStart) 1180 if (preDate < dStart)
1181 return dStart; 1181 return dStart;
1182 QDate earliestDate = preDate.addDays(1); 1182 QDate earliestDate = preDate.addDays(1);
1183 QDate nextDate; 1183 QDate nextDate;
1184 1184
1185 switch (recurs) { 1185 switch (recurs) {
1186 case rDaily: 1186 case rDaily:
1187 nextDate = dStart.addDays((dStart.daysTo(preDate)/rFreq + 1) * rFreq); 1187 nextDate = dStart.addDays((dStart.daysTo(preDate)/rFreq + 1) * rFreq);
1188 break; 1188 break;
1189 1189
1190 case rWeekly: { 1190 case rWeekly: {
1191 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart 1191 QDate start = dStart.addDays(-((dStart.dayOfWeek() - rWeekStart + 7)%7)); // start of week for dStart
1192 int earliestDayOfWeek = earliestDate.dayOfWeek(); 1192 int earliestDayOfWeek = earliestDate.dayOfWeek();
1193 int weeksAhead = start.daysTo(earliestDate) / 7; 1193 int weeksAhead = start.daysTo(earliestDate) / 7;
1194 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week 1194 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week
1195 weeksAhead -= notThisWeek; // latest week which recurred 1195 weeksAhead -= notThisWeek; // latest week which recurred
1196 int weekday = 0; 1196 int weekday = 0;
1197 // First check for any remaining day this week, if this week is a recurring week 1197 // First check for any remaining day this week, if this week is a recurring week
1198 if (!notThisWeek) 1198 if (!notThisWeek)
1199 weekday = getFirstDayInWeek(earliestDayOfWeek); 1199 weekday = getFirstDayInWeek(earliestDayOfWeek);
1200 // Check for a day in the next scheduled week 1200 // Check for a day in the next scheduled week
1201 if (!weekday && earliestDayOfWeek > 1) 1201 if (!weekday )
1202 weekday = getFirstDayInWeek(rWeekStart) + rFreq*7; 1202 weekday = getFirstDayInWeek(rWeekStart) + rFreq*7;
1203 if (weekday) 1203 nextDate = start.addDays(weeksAhead*7 + weekday - 1);
1204 nextDate = start.addDays(weeksAhead*7 + weekday - 1);
1205 break; 1204 break;
1206 } 1205 }
1207 case rMonthlyDay: 1206 case rMonthlyDay:
1208 case rMonthlyPos: { 1207 case rMonthlyPos: {
1209 int startYear = dStart.year(); 1208 int startYear = dStart.year();
1210 int startMonth = dStart.month(); // 1..12 1209 int startMonth = dStart.month(); // 1..12
1211 int earliestYear = earliestDate.year(); 1210 int earliestYear = earliestDate.year();
1212 int monthsAhead = (earliestYear - startYear)*12 + earliestDate.month() - startMonth; 1211 int monthsAhead = (earliestYear - startYear)*12 + earliestDate.month() - startMonth;
1213 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month 1212 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month
1214 monthsAhead -= notThisMonth; // latest month which recurred 1213 monthsAhead -= notThisMonth; // latest month which recurred
1215 // Check for the first later day in the current month 1214 // Check for the first later day in the current month
1216 if (!notThisMonth) 1215 if (!notThisMonth)
1217 nextDate = getFirstDateInMonth(earliestDate); 1216 nextDate = getFirstDateInMonth(earliestDate);
1218 if (!nextDate.isValid() && earliestDate.day() > 1) { 1217 if (!nextDate.isValid() ) {
1219 // Check for a day in the next scheduled month 1218 // Check for a day in the next scheduled month
1220 int months = startMonth - 1 + monthsAhead + rFreq; 1219 int months = startMonth - 1 + monthsAhead + rFreq;
1221 nextDate = getFirstDateInMonth(QDate(startYear + months/12, months%12 + 1, 1)); 1220 nextDate = getFirstDateInMonth(QDate(startYear + months/12, months%12 + 1, 1));
1222 } 1221 }
1223 break; 1222 break;
1224 } 1223 }
1225 case rYearlyMonth: 1224 case rYearlyMonth:
1226 case rYearlyPos: 1225 case rYearlyPos:
1227 case rYearlyDay: { 1226 case rYearlyDay: {
1228 int startYear = dStart.year(); 1227 int startYear = dStart.year();
1229 int yearsAhead = earliestDate.year() - startYear; 1228 int yearsAhead = earliestDate.year() - startYear;
1230 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year 1229 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year
1231 yearsAhead -= notThisYear; // latest year which recurred 1230 yearsAhead -= notThisYear; // latest year which recurred
1232 // Check for the first later date in the current year 1231 // Check for the first later date in the current year
1233 if (!notThisYear) 1232 if (!notThisYear)
1234 nextDate = getFirstDateInYear(earliestDate); 1233 nextDate = getFirstDateInYear(earliestDate);
1235 // Check for a date in the next scheduled year 1234 // Check for a date in the next scheduled year
1236 if (!nextDate.isValid() && earliestDate.dayOfYear() > 1) 1235 if (!nextDate.isValid() && earliestDate.dayOfYear() > 1)
1237 nextDate = getFirstDateInYear(QDate(startYear + yearsAhead + rFreq, 1, 1)); 1236 nextDate = getFirstDateInYear(QDate(startYear + yearsAhead + rFreq, 1, 1));
1238 break; 1237 break;
1239 } 1238 }
1240 case rNone: 1239 case rNone:
1241 default: 1240 default:
1242 return QDate(); 1241 return QDate();
1243 } 1242 }
1244 1243
1245 if (rDuration >= 0 && nextDate.isValid()) { 1244 if (rDuration >= 0 && nextDate.isValid()) {
1246 // Check that the date found is within the range of the recurrence 1245 // Check that the date found is within the range of the recurrence
1247 QDate end = endDate(); 1246 QDate end = endDate();
1248 if (nextDate > end) 1247 if (nextDate > end)
1249 return QDate(); 1248 return QDate();
1250 if (last && nextDate == end) 1249 if (last && nextDate == end)
1251 *last = true; 1250 *last = true;
1252 } 1251 }
1253 return nextDate; 1252 return nextDate;
1254} 1253}
1255 1254
1256/* Get the date of the last previous recurrence, before the specified date. 1255/* Get the date of the last previous recurrence, before the specified date.
1257 * Reply = date of previous recurrence, or invalid date if none. 1256 * Reply = date of previous recurrence, or invalid date if none.
1258 */ 1257 */
1259QDate Recurrence::getPreviousDateNoTime(const QDate &afterDate, bool *last) const 1258QDate Recurrence::getPreviousDateNoTime(const QDate &afterDate, bool *last) const
1260{ 1259{
1261 if (last) 1260 if (last)
1262 *last = false; 1261 *last = false;
1263 QDate dStart = mRecurStart.date(); 1262 QDate dStart = mRecurStart.date();
1264 QDate latestDate = afterDate.addDays(-1); 1263 QDate latestDate = afterDate.addDays(-1);
1265 if (latestDate < dStart) 1264 if (latestDate < dStart)
1266 return QDate(); 1265 return QDate();
1267 QDate prevDate; 1266 QDate prevDate;
1268 1267
1269 switch (recurs) { 1268 switch (recurs) {
1270 case rDaily: 1269 case rDaily:
1271 prevDate = dStart.addDays((dStart.daysTo(latestDate) / rFreq) * rFreq); 1270 prevDate = dStart.addDays((dStart.daysTo(latestDate) / rFreq) * rFreq);
1272 break; 1271 break;
1273 1272
1274 case rWeekly: { 1273 case rWeekly: {
1275 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart 1274 QDate start = dStart.addDays(-((dStart.dayOfWeek() - rWeekStart + 7)%7)); // start of week for dStart
1276 int latestDayOfWeek = latestDate.dayOfWeek(); 1275 int latestDayOfWeek = latestDate.dayOfWeek();
1277 int weeksAhead = start.daysTo(latestDate) / 7; 1276 int weeksAhead = start.daysTo(latestDate) / 7;
1278 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week 1277 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week
1279 weeksAhead -= notThisWeek; // latest week which recurred 1278 weeksAhead -= notThisWeek; // latest week which recurred
1280 int weekday = 0; 1279 int weekday = 0;
1281 // First check for any previous day this week, if this week is a recurring week 1280 // First check for any previous day this week, if this week is a recurring week
1282 if (!notThisWeek) 1281 if (!notThisWeek)
1283 weekday = getLastDayInWeek(latestDayOfWeek); 1282 weekday = getLastDayInWeek(latestDayOfWeek);
1284 // Check for a day in the previous scheduled week 1283 // Check for a day in the previous scheduled week
1285 if (!weekday) { 1284 if (!weekday) {
1285 if (!notThisWeek)
1286 weeksAhead -= rFreq;
1286 int weekEnd = (rWeekStart + 5)%7 + 1; 1287 int weekEnd = (rWeekStart + 5)%7 + 1;
1287 if (latestDayOfWeek < weekEnd) { 1288 weekday = getLastDayInWeek(weekEnd);
1288 if (!notThisWeek)
1289 weeksAhead -= rFreq;
1290 weekday = getLastDayInWeek(weekEnd);
1291 }
1292 } 1289 }
1293 if (weekday) 1290 if (weekday)
1294 prevDate = start.addDays(weeksAhead*7 + weekday - 1); 1291 prevDate = start.addDays(weeksAhead*7 + weekday - 1);
1295 break; 1292 break;
1296 } 1293 }
1297 case rMonthlyDay: 1294 case rMonthlyDay:
1298 case rMonthlyPos: { 1295 case rMonthlyPos: {
1299 int startYear = dStart.year(); 1296 int startYear = dStart.year();
1300 int startMonth = dStart.month(); // 1..12 1297 int startMonth = dStart.month(); // 1..12
1301 int latestYear = latestDate.year(); 1298 int latestYear = latestDate.year();
1302 int monthsAhead = (latestYear - startYear)*12 + latestDate.month() - startMonth; 1299 int monthsAhead = (latestYear - startYear)*12 + latestDate.month() - startMonth;
1303 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month 1300 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month
1304 monthsAhead -= notThisMonth; // latest month which recurred 1301 monthsAhead -= notThisMonth; // latest month which recurred
1305 // Check for the last earlier day in the current month 1302 // Check for the last earlier day in the current month
1306 if (!notThisMonth) 1303 if (!notThisMonth)
1307 prevDate = getLastDateInMonth(latestDate); 1304 prevDate = getLastDateInMonth(latestDate);
1308 if (!prevDate.isValid() && latestDate.day() < latestDate.daysInMonth()) { 1305 if (!prevDate.isValid() && latestDate.day() < latestDate.daysInMonth()) {
1309 // Check for a day in the previous scheduled month 1306 // Check for a day in the previous scheduled month
1310 if (!notThisMonth) 1307 if (!notThisMonth)
1311 monthsAhead -= rFreq; 1308 monthsAhead -= rFreq;
1312 int months = startMonth + monthsAhead; // get the month after the one that recurs 1309 int months = startMonth + monthsAhead; // get the month after the one that recurs
1313 prevDate = getLastDateInMonth(QDate(startYear + months/12, months%12 + 1, 1).addDays(-1)); 1310 prevDate = getLastDateInMonth(QDate(startYear + months/12, months%12 + 1, 1).addDays(-1));
1314 } 1311 }
1315 break; 1312 break;
1316 } 1313 }
1317 case rYearlyMonth: 1314 case rYearlyMonth:
1318 case rYearlyPos: 1315 case rYearlyPos:
1319 case rYearlyDay: { 1316 case rYearlyDay: {
1320 int startYear = dStart.year(); 1317 int startYear = dStart.year();
1321 int yearsAhead = latestDate.year() - startYear; 1318 int yearsAhead = latestDate.year() - startYear;
1322 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year 1319 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year
1323 yearsAhead -= notThisYear; // latest year which recurred 1320 yearsAhead -= notThisYear; // latest year which recurred
1324 // Check for the first later date in the current year 1321 // Check for the first later date in the current year
1325 if (!notThisYear) 1322 if (!notThisYear)
1326 prevDate = getLastDateInYear(latestDate); 1323 prevDate = getLastDateInYear(latestDate);
1327 if (!prevDate.isValid() && latestDate.dayOfYear() < latestDate.daysInYear()) { 1324 if (!prevDate.isValid() && latestDate.dayOfYear() < latestDate.daysInYear()) {
1328 // Check for a date in the next scheduled year 1325 // Check for a date in the next scheduled year
1329 if (!notThisYear) 1326 if (!notThisYear)
1330 yearsAhead -= rFreq; 1327 yearsAhead -= rFreq;
1331 prevDate = getLastDateInYear(QDate(startYear + yearsAhead, 12, 31)); 1328 prevDate = getLastDateInYear(QDate(startYear + yearsAhead, 12, 31));
1332 } 1329 }
1333 break; 1330 break;
1334 } 1331 }
1335 case rNone: 1332 case rNone:
1336 default: 1333 default:
1337 return QDate(); 1334 return QDate();
1338 } 1335 }
1339 1336
1340 if (prevDate.isValid()) { 1337 if (prevDate.isValid()) {
1341 // Check that the date found is within the range of the recurrence 1338 // Check that the date found is within the range of the recurrence
1342 if (prevDate < dStart) 1339 if (prevDate < dStart)
1343 return QDate(); 1340 return QDate();
1344 if (rDuration >= 0) { 1341 if (rDuration >= 0) {
1345 QDate end = endDate(); 1342 QDate end = endDate();
1346 if (prevDate >= end) { 1343 if (prevDate >= end) {
1347 if (last) 1344 if (last)
1348 *last = true; 1345 *last = true;
1349 return end; 1346 return end;
1350 } 1347 }
1351 } 1348 }
1352 } 1349 }
1353 return prevDate; 1350 return prevDate;
1354} 1351}
1355 1352
1356void Recurrence::setDailySub(short type, int freq, int duration) 1353void Recurrence::setDailySub(short type, int freq, int duration)
1357{ 1354{
1358 recurs = type; 1355 recurs = type;
1359 rFreq = freq; 1356 rFreq = freq;
1360 rDuration = duration; 1357 rDuration = duration;
1361 rMonthPositions.clear(); 1358 rMonthPositions.clear();
1362 rMonthDays.clear(); 1359 rMonthDays.clear();
1363 rYearNums.clear(); 1360 rYearNums.clear();
1364 if (type != rDaily) 1361 if (type != rDaily)
1365 mFloats = false; // sub-daily types can't be floating 1362 mFloats = false; // sub-daily types can't be floating
1366 1363
1367 if (mParent) mParent->updated(); 1364 if (mParent) mParent->updated();
1368} 1365}
1369 1366
1370void Recurrence::setYearly_(short type, Feb29Type feb29type, int freq, int duration) 1367void Recurrence::setYearly_(short type, Feb29Type feb29type, int freq, int duration)
1371{ 1368{
1372 recurs = type; 1369 recurs = type;
1373 if (mCompatVersion < 310 && type == rYearlyDay) { 1370 if (mCompatVersion < 310 && type == rYearlyDay) {
1374 mCompatRecurs = rYearlyDay; 1371 mCompatRecurs = rYearlyDay;
1375 recurs = rYearlyMonth; // convert old yearly-by-day to yearly-by-month 1372 recurs = rYearlyMonth; // convert old yearly-by-day to yearly-by-month
1376 feb29type = rMar1; // retain the same day number in the year 1373 feb29type = rMar1; // retain the same day number in the year
1377 } 1374 }
1378 1375
1379 mFeb29YearlyType = feb29type; 1376 mFeb29YearlyType = feb29type;
1380 rFreq = freq; 1377 rFreq = freq;
1381 rDuration = duration; 1378 rDuration = duration;
1382 if (type != rYearlyPos) 1379 if (type != rYearlyPos)
1383 rMonthPositions.clear(); 1380 rMonthPositions.clear();
1384 rMonthDays.clear(); 1381 rMonthDays.clear();
1385 if (mParent) mParent->updated(); 1382 if (mParent) mParent->updated();
1386} 1383}
1387 1384
1388int Recurrence::recurCalc(PeriodFunc func, QDateTime &endtime) const 1385int Recurrence::recurCalc(PeriodFunc func, QDateTime &endtime) const
1389{ 1386{
1390 QDate enddate = endtime.date(); 1387 QDate enddate = endtime.date();
1391 switch (func) { 1388 switch (func) {
1392 case END_DATE_AND_COUNT: 1389 case END_DATE_AND_COUNT:
1393 if (rDuration < 0) { 1390 if (rDuration < 0) {
1394 endtime = QDateTime(); 1391 endtime = QDateTime();
1395 return 0; // infinite recurrence 1392 return 0; // infinite recurrence
1396 } 1393 }
1397 if (rDuration == 0) { 1394 if (rDuration == 0) {
1398 endtime = rEndDateTime; 1395 endtime = rEndDateTime;
1399 func = COUNT_TO_DATE; 1396 func = COUNT_TO_DATE;
1400 } 1397 }
1401 break; 1398 break;
1402 case COUNT_TO_DATE: 1399 case COUNT_TO_DATE:
1403 // Count recurrences up to and including the specified date/time. 1400 // Count recurrences up to and including the specified date/time.
1404 if (endtime < mRecurStart) 1401 if (endtime < mRecurStart)
1405 return 0; 1402 return 0;
1406 if (rDuration == 0 && endtime > rEndDateTime) 1403 if (rDuration == 0 && endtime > rEndDateTime)
1407 enddate = rEndDateTime.date(); 1404 enddate = rEndDateTime.date();
1408 else if (!mFloats && mRecurStart.time() > endtime.time()) 1405 else if (!mFloats && mRecurStart.time() > endtime.time())
1409 enddate = enddate.addDays(-1); 1406 enddate = enddate.addDays(-1);
1410 break; 1407 break;
1411 case NEXT_AFTER_DATE: 1408 case NEXT_AFTER_DATE:
1412 // Find next recurrence AFTER endtime 1409 // Find next recurrence AFTER endtime
1413 if (endtime < mRecurStart) { 1410 if (endtime < mRecurStart) {
1414 endtime = mRecurStart; 1411 endtime = mRecurStart;
1415 return 1; 1412 return 1;
1416 } 1413 }
1417 if (rDuration == 0 && endtime >= rEndDateTime) { 1414 if (rDuration == 0 && endtime >= rEndDateTime) {
1418 endtime = QDateTime(); 1415 endtime = QDateTime();
1419 return 0; 1416 return 0;
@@ -3275,139 +3272,130 @@ QDate Recurrence::getFirstDateInYear(const QDate &earliestDate) const
3275 for ( ; it.current(); ++it) { 3272 for ( ; it.current(); ++it) {
3276 int month = *it.current(); 3273 int month = *it.current();
3277 if (month >= earliestMonth) { 3274 if (month >= earliestMonth) {
3278 if (day <= 28 || QDate::isValid(earliestYear, month, day)) 3275 if (day <= 28 || QDate::isValid(earliestYear, month, day))
3279 return QDate(earliestYear, month, day); 3276 return QDate(earliestYear, month, day);
3280 if (day == 29 && month == 2) { 3277 if (day == 29 && month == 2) {
3281 // It's a recurrence on February 29th, in a non-leap year 3278 // It's a recurrence on February 29th, in a non-leap year
3282 switch (mFeb29YearlyType) { 3279 switch (mFeb29YearlyType) {
3283 case rMar1: 3280 case rMar1:
3284 return QDate(earliestYear, 3, 1); 3281 return QDate(earliestYear, 3, 1);
3285 case rFeb28: 3282 case rFeb28:
3286 if (earliestDay <= 28) 3283 if (earliestDay <= 28)
3287 return QDate(earliestYear, 2, 28); 3284 return QDate(earliestYear, 2, 28);
3288 break; 3285 break;
3289 case rFeb29: 3286 case rFeb29:
3290 break; 3287 break;
3291 } 3288 }
3292 } 3289 }
3293 } 3290 }
3294 } 3291 }
3295 break; 3292 break;
3296 } 3293 }
3297 case rYearlyPos: { 3294 case rYearlyPos: {
3298 QValueList<int> dayList; 3295 QValueList<int> dayList;
3299 int earliestYear = earliestDate.year(); 3296 int earliestYear = earliestDate.year();
3300 int earliestMonth = earliestDate.month(); 3297 int earliestMonth = earliestDate.month();
3301 int earliestDay = earliestDate.day(); 3298 int earliestDay = earliestDate.day();
3302 for ( ; it.current(); ++it) { 3299 for ( ; it.current(); ++it) {
3303 int month = *it.current(); 3300 int month = *it.current();
3304 if (month >= earliestMonth) { 3301 if (month >= earliestMonth) {
3305 QDate monthBegin(earliestYear, month, 1); 3302 QDate monthBegin(earliestYear, month, 1);
3306 getMonthlyPosDays(dayList, monthBegin.daysInMonth(), monthBegin.dayOfWeek()); 3303 getMonthlyPosDays(dayList, monthBegin.daysInMonth(), monthBegin.dayOfWeek());
3307 for (QValueList<int>::ConstIterator id = dayList.begin(); id != dayList.end(); ++id) { 3304 for (QValueList<int>::ConstIterator id = dayList.begin(); id != dayList.end(); ++id) {
3308 if (*id >= earliestDay) 3305 if (*id >= earliestDay)
3309 return monthBegin.addDays(*id - 1); 3306 return monthBegin.addDays(*id - 1);
3310 } 3307 }
3311 earliestDay = 1; 3308 earliestDay = 1;
3312 } 3309 }
3313 } 3310 }
3314 break; 3311 break;
3315 } 3312 }
3316 case rYearlyDay: { 3313 case rYearlyDay: {
3317 int earliestDay = earliestDate.dayOfYear(); 3314 int earliestDay = earliestDate.dayOfYear();
3318 for ( ; it.current(); ++it) { 3315 for ( ; it.current(); ++it) {
3319 int day = *it.current(); 3316 int day = *it.current();
3320 if (day >= earliestDay && (day <= 365 || day <= earliestDate.daysInYear())) 3317 if (day >= earliestDay && (day <= 365 || day <= earliestDate.daysInYear()))
3321 return earliestDate.addDays(day - earliestDay); 3318 return earliestDate.addDays(day - earliestDay);
3322 } 3319 }
3323 break; 3320 break;
3324 } 3321 }
3325 } 3322 }
3326 return QDate(); 3323 return QDate();
3327} 3324}
3328 3325
3329/* From the recurrence yearly month list or yearly day list, get the latest 3326/* From the recurrence yearly month list or yearly day list, get the latest
3330 * month or day in the specified year which is <= the latestDate. 3327 * month or day in the specified year which is <= the latestDate.
3331 * Note that rYearNums is sorted in numerical order. 3328 * Note that rYearNums is sorted in numerical order.
3332 */ 3329 */
3333QDate Recurrence::getLastDateInYear(const QDate &latestDate) const 3330QDate Recurrence::getLastDateInYear(const QDate &latestDate) const
3334{ 3331{
3335 QPtrListIterator<int> it(rYearNums); 3332 QPtrListIterator<int> it(rYearNums);
3336 switch (recurs) { 3333 switch (recurs) {
3337 case rYearlyMonth: { 3334 case rYearlyMonth: {
3338 int day = recurStart().date().day(); 3335 int day = recurStart().date().day();
3339 int latestYear = latestDate.year(); 3336 int latestYear = latestDate.year();
3340 int latestMonth = latestDate.month(); 3337 int latestMonth = latestDate.month();
3341 if (latestDate.day() > day) { 3338 if (latestDate.day() > day) {
3342 // The latest date is earlier in the month than the recurrence date, 3339 // The latest date is earlier in the month than the recurrence date,
3343 // so skip to the previous month before starting to check 3340 // so skip to the previous month before starting to check
3344 if (--latestMonth <= 0) 3341 if (--latestMonth <= 0)
3345 return QDate(); 3342 return QDate();
3346 } 3343 }
3347 for (it.toLast(); it.current(); --it) { 3344 for (it.toLast(); it.current(); --it) {
3348 int month = *it.current(); 3345 int month = *it.current();
3349 if (month <= latestMonth) { 3346 if (month <= latestMonth) {
3350 if (day <= 28 || QDate::isValid(latestYear, month, day)) 3347 if (day <= 28 || QDate::isValid(latestYear, month, day))
3351 return QDate(latestYear, month, day); 3348 return QDate(latestYear, month, day);
3352 if (day == 29 && month == 2) { 3349 if (day == 29 && month == 2) {
3353 // It's a recurrence on February 29th, in a non-leap year 3350 // It's a recurrence on February 29th, in a non-leap year
3354 switch (mFeb29YearlyType) { 3351 switch (mFeb29YearlyType) {
3355 case rMar1: 3352 case rMar1:
3356 if (latestMonth >= 3) 3353 if (latestMonth >= 3)
3357 return QDate(latestYear, 3, 1); 3354 return QDate(latestYear, 3, 1);
3358 break; 3355 break;
3359 case rFeb28: 3356 case rFeb28:
3360 return QDate(latestYear, 2, 28); 3357 return QDate(latestYear, 2, 28);
3361 case rFeb29: 3358 case rFeb29:
3362 break; 3359 break;
3363 } 3360 }
3364 } 3361 }
3365 } 3362 }
3366 } 3363 }
3367 break; 3364 break;
3368 } 3365 }
3369 case rYearlyPos: { 3366 case rYearlyPos: {
3370 QValueList<int> dayList; 3367 QValueList<int> dayList;
3371 int latestYear = latestDate.year(); 3368 int latestYear = latestDate.year();
3372 int latestMonth = latestDate.month(); 3369 int latestMonth = latestDate.month();
3373 int latestDay = latestDate.day(); 3370 int latestDay = latestDate.day();
3374 for (it.toLast(); it.current(); --it) { 3371 for (it.toLast(); it.current(); --it) {
3375 int month = *it.current(); 3372 int month = *it.current();
3376 if (month <= latestMonth) { 3373 if (month <= latestMonth) {
3377 QDate monthBegin(latestYear, month, 1); 3374 QDate monthBegin(latestYear, month, 1);
3378 getMonthlyPosDays(dayList, monthBegin.daysInMonth(), monthBegin.dayOfWeek()); 3375 getMonthlyPosDays(dayList, monthBegin.daysInMonth(), monthBegin.dayOfWeek());
3379 for (QValueList<int>::ConstIterator id = dayList.fromLast(); id != dayList.end(); --id) { 3376 for (QValueList<int>::ConstIterator id = dayList.fromLast(); id != dayList.end(); --id) {
3380 if (*id <= latestDay) 3377 if (*id <= latestDay)
3381 return monthBegin.addDays(*id - 1); 3378 return monthBegin.addDays(*id - 1);
3382 } 3379 }
3383 latestDay = 31; 3380 latestDay = 31;
3384 } 3381 }
3385 } 3382 }
3386 break; 3383 break;
3387 } 3384 }
3388 case rYearlyDay: { 3385 case rYearlyDay: {
3389 int latestDay = latestDate.dayOfYear(); 3386 int latestDay = latestDate.dayOfYear();
3390 for (it.toLast(); it.current(); --it) { 3387 for (it.toLast(); it.current(); --it) {
3391 int day = *it.current(); 3388 int day = *it.current();
3392 if (day <= latestDay) 3389 if (day <= latestDay)
3393 return latestDate.addDays(day - latestDay); 3390 return latestDate.addDays(day - latestDay);
3394 } 3391 }
3395 break; 3392 break;
3396 } 3393 }
3397 } 3394 }
3398 return QDate(); 3395 return QDate();
3399} 3396}
3400 3397
3401void Recurrence::dump() const 3398void Recurrence::dump() const
3402{ 3399{
3403 kdDebug() << "Recurrence::dump():" << endl; 3400 ;
3404
3405 kdDebug() << " type: " << recurs << endl;
3406
3407 kdDebug() << " rDays: " << endl;
3408 int i;
3409 for( i = 0; i < 7; ++i ) {
3410 kdDebug() << " " << i << ": "
3411 << ( rDays.testBit( i ) ? "true" : "false" ) << endl;
3412 }
3413} 3401}