summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-02-07 21:06:04 (UTC)
committer zautrix <zautrix>2005-02-07 21:06:04 (UTC)
commitedaad9a9d7ede1b4bc50b9e758eaf32a5fbb547e (patch) (unidiff)
tree7653e521f003a0c4e316530d38c09f3190c4edaf
parentda5e47069d88fa9aa656423ce4c60bf505728e1c (diff)
downloadkdepimpi-edaad9a9d7ede1b4bc50b9e758eaf32a5fbb547e.zip
kdepimpi-edaad9a9d7ede1b4bc50b9e758eaf32a5fbb547e.tar.gz
kdepimpi-edaad9a9d7ede1b4bc50b9e758eaf32a5fbb547e.tar.bz2
recurrence fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koeventviewer.cpp23
-rw-r--r--libkcal/kincidenceformatter.cpp24
-rw-r--r--libkcal/recurrence.cpp2
-rw-r--r--microkde/kdeui/ktoolbar.cpp2
-rw-r--r--microkde/kdeui/ktoolbar.h2
5 files changed, 32 insertions, 21 deletions
diff --git a/korganizer/koeventviewer.cpp b/korganizer/koeventviewer.cpp
index de11c13..39921a0 100644
--- a/korganizer/koeventviewer.cpp
+++ b/korganizer/koeventviewer.cpp
@@ -178,270 +178,273 @@ void KOEventViewer::setSource(const QString& n)
178 return; 178 return;
179 } 179 }
180 } else { 180 } else {
181 //QTextBrowser::setSource(n); 181 //QTextBrowser::setSource(n);
182 } 182 }
183#endif 183#endif
184} 184}
185void KOEventViewer::mailToAttendees( bool all ) 185void KOEventViewer::mailToAttendees( bool all )
186{ 186{
187 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 187 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
188 if (attendees.count() == 0) return; 188 if (attendees.count() == 0) return;
189 QStringList nameList; 189 QStringList nameList;
190 QStringList emailList; 190 QStringList emailList;
191 QStringList uidList; 191 QStringList uidList;
192 Attendee* a; 192 Attendee* a;
193 for(a=attendees.first();a;a=attendees.next()) { 193 for(a=attendees.first();a;a=attendees.next()) {
194 if ( !all && !a->RSVP() ) continue; 194 if ( !all && !a->RSVP() ) continue;
195 if (!a->email().isEmpty()) { 195 if (!a->email().isEmpty()) {
196 nameList.append (a->name() ); 196 nameList.append (a->name() );
197 emailList.append (a->email() ); 197 emailList.append (a->email() );
198 uidList.append (a->uid() ); 198 uidList.append (a->uid() );
199 } 199 }
200 } 200 }
201 QString uid = "ComposeMailUIpick2"+mMailSubject; 201 QString uid = "ComposeMailUIpick2"+mMailSubject;
202#ifndef DESKTOP_VERSION 202#ifndef DESKTOP_VERSION
203 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); 203 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList);
204#endif 204#endif
205 205
206} 206}
207void KOEventViewer::addTag(const QString & tag,const QString & text) 207void KOEventViewer::addTag(const QString & tag,const QString & text)
208{ 208{
209 int number=text.contains("\n"); 209 int number=text.contains("\n");
210 QString str = "<" + tag + ">"; 210 QString str = "<" + tag + ">";
211 QString tmpText=text; 211 QString tmpText=text;
212 QString tmpStr=str; 212 QString tmpStr=str;
213 if(number !=-1) 213 if(number !=-1)
214 { 214 {
215 if (number > 0) { 215 if (number > 0) {
216 int pos=0; 216 int pos=0;
217 QString tmp; 217 QString tmp;
218 for(int i=0;i<=number;i++) { 218 for(int i=0;i<=number;i++) {
219 pos=tmpText.find("\n"); 219 pos=tmpText.find("\n");
220 tmp=tmpText.left(pos); 220 tmp=tmpText.left(pos);
221 tmpText=tmpText.right(tmpText.length()-pos-1); 221 tmpText=tmpText.right(tmpText.length()-pos-1);
222 tmpStr+=tmp+"<br>"; 222 tmpStr+=tmp+"<br>";
223 } 223 }
224 } 224 }
225 else tmpStr += tmpText; 225 else tmpStr += tmpText;
226 tmpStr+="</" + tag + ">"; 226 tmpStr+="</" + tag + ">";
227 mText.append(tmpStr); 227 mText.append(tmpStr);
228 } 228 }
229 else 229 else
230 { 230 {
231 str += text + "</" + tag + ">"; 231 str += text + "</" + tag + ">";
232 mText.append(str); 232 mText.append(str);
233 } 233 }
234} 234}
235 235
236void KOEventViewer::setColorMode( int m ) 236void KOEventViewer::setColorMode( int m )
237{ 237{
238 mColorMode = m; 238 mColorMode = m;
239} 239}
240void KOEventViewer::appendEvent(Event *event, int mode ) 240void KOEventViewer::appendEvent(Event *event, int mode )
241{ 241{
242 mMailSubject = ""; 242 mMailSubject = "";
243 mCurrentIncidence = event; 243 mCurrentIncidence = event;
244 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 244 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
245 topLevelWidget()->setCaption(i18n("Event Viewer")); 245 topLevelWidget()->setCaption(i18n("Event Viewer"));
246 if ( mode == 0 ) { 246 if ( mode == 0 ) {
247 addTag("h2",event->summary()); 247 addTag("h2",event->summary());
248 } 248 }
249 else { 249 else {
250 if ( mColorMode == 1 ) { 250 if ( mColorMode == 1 ) {
251 mText +="<font color=\"#00A000\">"; 251 mText +="<font color=\"#00A000\">";
252 } 252 }
253 if ( mColorMode == 2 ) { 253 if ( mColorMode == 2 ) {
254 mText +="<font color=\"#C00000\">"; 254 mText +="<font color=\"#C00000\">";
255 } 255 }
256 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 256 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
257 if ( mode == 1 ) { 257 if ( mode == 1 ) {
258 addTag("h2",i18n( "Local: " ) +event->summary()); 258 addTag("h2",i18n( "Local: " ) +event->summary());
259 } else { 259 } else {
260 addTag("h2",i18n( "Remote: " ) +event->summary()); 260 addTag("h2",i18n( "Remote: " ) +event->summary());
261 } 261 }
262 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 262 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
263 if ( mColorMode ) 263 if ( mColorMode )
264 mText += "</font>"; 264 mText += "</font>";
265 } 265 }
266 mMailSubject += i18n( "Meeting " )+ event->summary(); 266 mMailSubject += i18n( "Meeting " )+ event->summary();
267 if (event->cancelled ()) { 267 if (event->cancelled ()) {
268 mText +="<font color=\"#B00000\">"; 268 mText +="<font color=\"#B00000\">";
269 addTag("i",i18n("This event has been cancelled!")); 269 addTag("i",i18n("This event has been cancelled!"));
270 mText.append("<br>"); 270 mText.append("<br>");
271 mText += "</font>"; 271 mText += "</font>";
272 mMailSubject += i18n("(cancelled)"); 272 mMailSubject += i18n("(cancelled)");
273 } 273 }
274 if (!event->location().isEmpty()) { 274 if (!event->location().isEmpty()) {
275 addTag("b",i18n("Location: ")); 275 addTag("b",i18n("Location: "));
276 mText.append(event->location()+"<br>"); 276 mText.append(event->location()+"<br>");
277 mMailSubject += i18n(" at ") + event->location(); 277 mMailSubject += i18n(" at ") + event->location();
278 } 278 }
279 if (event->doesFloat()) { 279 if (event->doesFloat()) {
280 if (event->isMultiDay()) { 280 if (event->isMultiDay()) {
281 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 281 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
282 .arg(event->dtStartDateStr(shortDate)) 282 .arg(event->dtStartDateStr(shortDate))
283 .arg(event->dtEndDateStr(shortDate))); 283 .arg(event->dtEndDateStr(shortDate)));
284 } else { 284 } else {
285 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 285 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
286 } 286 }
287 } else { 287 } else {
288 if (event->isMultiDay()) { 288 if (event->isMultiDay()) {
289 mText.append(i18n("<p><b>From:</b> %1</p> ") 289 mText.append(i18n("<p><b>From:</b> %1</p> ")
290 .arg(event->dtStartStr( shortDate))); 290 .arg(event->dtStartStr( shortDate)));
291 mText.append(i18n("<p><b>To:</b> %1</p>") 291 mText.append(i18n("<p><b>To:</b> %1</p>")
292 .arg(event->dtEndStr(shortDate))); 292 .arg(event->dtEndStr(shortDate)));
293 } else { 293 } else {
294 mText.append(i18n("<p><b>On:</b> %1</p> ") 294 mText.append(i18n("<p><b>On:</b> %1</p> ")
295 .arg(event->dtStartDateStr( shortDate ))); 295 .arg(event->dtStartDateStr( shortDate )));
296 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 296 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
297 .arg(event->dtStartTimeStr()) 297 .arg(event->dtStartTimeStr())
298 .arg(event->dtEndTimeStr())); 298 .arg(event->dtEndTimeStr()));
299 } 299 }
300 } 300 }
301 301
302 if (event->recurrence()->doesRecur()) { 302 if (event->recurrence()->doesRecur()) {
303 303
304 QString recurText = event->recurrence()->recurrenceText(); 304 QString recurText = event->recurrence()->recurrenceText();
305 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 305 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
306 bool last; 306 bool ok;
307 QDate start = QDate::currentDate(); 307 QDate start = QDate::currentDate();
308 QDate next; 308 QDateTime next;
309 next = event->recurrence()->getPreviousDate( start , &last ); 309 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
310 if ( !last ) { 310 if ( ok ) {
311 next = event->recurrence()->getNextDate( start.addDays( - 1 ) );
312 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 311 addTag("p",i18n("<b>Next recurrence is on:</b>") );
313 addTag("p", KGlobal::locale()->formatDate( next, shortDate )); 312 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
314 QDateTime nextdt = QDateTime( next, event->dtStart().time()); 313 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true );
315 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( nextdt, true );
316 314
317 } else { 315 } else {
318 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 316 bool last;
319 addTag("p", KGlobal::locale()->formatDate( next, shortDate )); 317 QDate nextd;
318 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
319 if ( last ) {
320 addTag("p",i18n("<b>Last recurrence was on:</b>") );
321 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
322 }
320 } 323 }
321 } else { 324 } else {
322 mMailSubject += i18n(" - " )+event->dtStartStr( true ); 325 mMailSubject += i18n(" - " )+event->dtStartStr( true );
323 326
324 } 327 }
325 328
326 329
327 if (event->isAlarmEnabled()) { 330 if (event->isAlarmEnabled()) {
328 Alarm *alarm =event->alarms().first() ; 331 Alarm *alarm =event->alarms().first() ;
329 QDateTime t = alarm->time(); 332 QDateTime t = alarm->time();
330 int min = t.secsTo( event->dtStart() )/60; 333 int min = t.secsTo( event->dtStart() )/60;
331 QString s =i18n("( %1 min before )").arg( min ); 334 QString s =i18n("( %1 min before )").arg( min );
332 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 335 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
333 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 336 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
334 //addTag("p",s); 337 //addTag("p",s);
335 } 338 }
336 339
337 addTag("b",i18n("Access: ")); 340 addTag("b",i18n("Access: "));
338 mText.append(event->secrecyStr()+"<br>"); 341 mText.append(event->secrecyStr()+"<br>");
339 if (!event->description().isEmpty()) { 342 if (!event->description().isEmpty()) {
340 addTag("p",i18n("<b>Details: </b>")); 343 addTag("p",i18n("<b>Details: </b>"));
341 addTag("p",event->description()); 344 addTag("p",event->description());
342 } 345 }
343 346
344 formatCategories(event); 347 formatCategories(event);
345 348
346 formatReadOnly(event); 349 formatReadOnly(event);
347 formatAttendees(event); 350 formatAttendees(event);
348 351
349 setText(mText); 352 setText(mText);
350 //QWhatsThis::add(this,mText); 353 //QWhatsThis::add(this,mText);
351 354
352} 355}
353 356
354void KOEventViewer::appendTodo(Todo *event, int mode ) 357void KOEventViewer::appendTodo(Todo *event, int mode )
355{ 358{
356 mMailSubject = ""; 359 mMailSubject = "";
357 mCurrentIncidence = event; 360 mCurrentIncidence = event;
358 topLevelWidget()->setCaption(i18n("Todo Viewer")); 361 topLevelWidget()->setCaption(i18n("Todo Viewer"));
359 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 362 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
360 if (mode == 0 ) 363 if (mode == 0 )
361 addTag("h2",event->summary()); 364 addTag("h2",event->summary());
362 else { 365 else {
363 if ( mColorMode == 1 ) { 366 if ( mColorMode == 1 ) {
364 mText +="<font color=\"#00A000\">"; 367 mText +="<font color=\"#00A000\">";
365 } 368 }
366 if ( mColorMode == 2 ) { 369 if ( mColorMode == 2 ) {
367 mText +="<font color=\"#B00000\">"; 370 mText +="<font color=\"#B00000\">";
368 } 371 }
369 if ( mode == 1 ) { 372 if ( mode == 1 ) {
370 addTag("h2",i18n( "Local: " ) +event->summary()); 373 addTag("h2",i18n( "Local: " ) +event->summary());
371 } else { 374 } else {
372 addTag("h2",i18n( "Remote: " ) +event->summary()); 375 addTag("h2",i18n( "Remote: " ) +event->summary());
373 } 376 }
374 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 377 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
375 if ( mColorMode ) 378 if ( mColorMode )
376 mText += "</font>"; 379 mText += "</font>";
377 } 380 }
378 mMailSubject += i18n( "Todo " )+ event->summary(); 381 mMailSubject += i18n( "Todo " )+ event->summary();
379 382
380 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 383 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
381 mText +="<font color=\"#B00000\">"; 384 mText +="<font color=\"#B00000\">";
382 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) ); 385 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) );
383 mText += "</font>"; 386 mText += "</font>";
384 } else { 387 } else {
385 mText.append(i18n("<p><i>%1 % completed</i></p>") 388 mText.append(i18n("<p><i>%1 % completed</i></p>")
386 .arg(event->percentComplete())); 389 .arg(event->percentComplete()));
387 } 390 }
388 391
389 if (event->cancelled ()) { 392 if (event->cancelled ()) {
390 mText +="<font color=\"#B00000\">"; 393 mText +="<font color=\"#B00000\">";
391 addTag("i",i18n("This todo has been cancelled!")); 394 addTag("i",i18n("This todo has been cancelled!"));
392 mText.append("<br>"); 395 mText.append("<br>");
393 mText += "</font>"; 396 mText += "</font>";
394 mMailSubject += i18n("(cancelled)"); 397 mMailSubject += i18n("(cancelled)");
395 } 398 }
396 399
397 if (!event->location().isEmpty()) { 400 if (!event->location().isEmpty()) {
398 addTag("b",i18n("Location: ")); 401 addTag("b",i18n("Location: "));
399 mText.append(event->location()+"<br>"); 402 mText.append(event->location()+"<br>");
400 mMailSubject += i18n(" at ") + event->location(); 403 mMailSubject += i18n(" at ") + event->location();
401 } 404 }
402 if (event->hasStartDate()) { 405 if (event->hasStartDate()) {
403 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer))); 406 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer)));
404 } 407 }
405 if (event->hasDueDate()) { 408 if (event->hasDueDate()) {
406 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer))); 409 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer)));
407 mMailSubject += i18n(" - " )+event->dtDueStr( true ); 410 mMailSubject += i18n(" - " )+event->dtDueStr( true );
408 } 411 }
409 addTag("b",i18n("Access: ")); 412 addTag("b",i18n("Access: "));
410 mText.append(event->secrecyStr()+"<br>"); 413 mText.append(event->secrecyStr()+"<br>");
411 if (!event->description().isEmpty()) { 414 if (!event->description().isEmpty()) {
412 addTag("p",i18n("<b>Details: </b>")); 415 addTag("p",i18n("<b>Details: </b>"));
413 addTag("p",event->description()); 416 addTag("p",event->description());
414 } 417 }
415 418
416 formatCategories(event); 419 formatCategories(event);
417 420
418 mText.append(i18n("<p><b>Priority:</b> %2</p>") 421 mText.append(i18n("<p><b>Priority:</b> %2</p>")
419 .arg(QString::number(event->priority()))); 422 .arg(QString::number(event->priority())));
420 423
421 formatReadOnly(event); 424 formatReadOnly(event);
422 formatAttendees(event); 425 formatAttendees(event);
423 if ( event->relatedTo() ) { 426 if ( event->relatedTo() ) {
424 addTag("b",i18n("Parent todo:<br>")); 427 addTag("b",i18n("Parent todo:<br>"));
425 mText.append(event->relatedTo()->summary()+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>"); 428 mText.append(event->relatedTo()->summary()+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>");
426 } 429 }
427 QPtrList<Incidence> Relations = event->relations(); 430 QPtrList<Incidence> Relations = event->relations();
428 Incidence *to; 431 Incidence *to;
429 if ( Relations.first() ) 432 if ( Relations.first() )
430 addTag("b",i18n("Sub todos:<br>")); 433 addTag("b",i18n("Sub todos:<br>"));
431 for (to=Relations.first();to;to=Relations.next()) { 434 for (to=Relations.first();to;to=Relations.next()) {
432 mText.append( to->summary()+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>"); 435 mText.append( to->summary()+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>");
433 436
434 } 437 }
435 setText(mText); 438 setText(mText);
436} 439}
437 440
438void KOEventViewer::formatCategories(Incidence *event) 441void KOEventViewer::formatCategories(Incidence *event)
439{ 442{
440 if (!event->categoriesStr().isEmpty()) { 443 if (!event->categoriesStr().isEmpty()) {
441 if (event->categories().count() == 1) { 444 if (event->categories().count() == 1) {
442 addTag("h3",i18n("Category")); 445 addTag("h3",i18n("Category"));
443 } else { 446 } else {
444 addTag("h3",i18n("Categories")); 447 addTag("h3",i18n("Categories"));
445 } 448 }
446 addTag("p",event->categoriesStr()); 449 addTag("p",event->categoriesStr());
447 } 450 }
diff --git a/libkcal/kincidenceformatter.cpp b/libkcal/kincidenceformatter.cpp
index 6d07d4c..0d9c3f4 100644
--- a/libkcal/kincidenceformatter.cpp
+++ b/libkcal/kincidenceformatter.cpp
@@ -1,245 +1,251 @@
1#include "kincidenceformatter.h" 1#include "kincidenceformatter.h"
2#include <kstaticdeleter.h> 2#include <kstaticdeleter.h>
3#include <kglobal.h> 3#include <kglobal.h>
4#include <klocale.h> 4#include <klocale.h>
5#ifdef DEKTOP_VERSION 5#ifdef DEKTOP_VERSION
6#include <kabc/stdaddressbook.h> 6#include <kabc/stdaddressbook.h>
7#define size count 7#define size count
8#endif 8#endif
9 9
10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0; 10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0;
11static KStaticDeleter<KIncidenceFormatter> insd; 11static KStaticDeleter<KIncidenceFormatter> insd;
12 12
13QString KIncidenceFormatter::getFormattedText( Incidence * inc ) 13QString KIncidenceFormatter::getFormattedText( Incidence * inc )
14{ 14{
15// #ifndef QT_NO_INPUTDIALOG 15// #ifndef QT_NO_INPUTDIALOG
16// return QInputDialog::getItem( caption, label, items, current, editable ); 16// return QInputDialog::getItem( caption, label, items, current, editable );
17// #else 17// #else
18// return QString::null; 18// return QString::null;
19// #endif 19// #endif
20 mText = ""; 20 mText = "";
21 if ( inc->type() == "Event" ) 21 if ( inc->type() == "Event" )
22 setEvent((Event *) inc ); 22 setEvent((Event *) inc );
23 else if ( inc->type() == "Todo" ) 23 else if ( inc->type() == "Todo" )
24 setTodo((Todo *) inc ); 24 setTodo((Todo *) inc );
25 return mText; 25 return mText;
26} 26}
27 27
28KIncidenceFormatter* KIncidenceFormatter::instance() 28KIncidenceFormatter* KIncidenceFormatter::instance()
29{ 29{
30 if (!mInstance) { 30 if (!mInstance) {
31 mInstance = insd.setObject(new KIncidenceFormatter()); 31 mInstance = insd.setObject(new KIncidenceFormatter());
32 } 32 }
33 return mInstance; 33 return mInstance;
34} 34}
35KIncidenceFormatter::~KIncidenceFormatter() 35KIncidenceFormatter::~KIncidenceFormatter()
36{ 36{
37 if (mInstance == this) 37 if (mInstance == this)
38 mInstance = insd.setObject(0); 38 mInstance = insd.setObject(0);
39 //qDebug("KIncidenceFormatter::~KIncidenceFormatter "); 39 //qDebug("KIncidenceFormatter::~KIncidenceFormatter ");
40} 40}
41KIncidenceFormatter::KIncidenceFormatter() 41KIncidenceFormatter::KIncidenceFormatter()
42{ 42{
43 mColorMode = 0; 43 mColorMode = 0;
44} 44}
45void KIncidenceFormatter::setEvent(Event *event) 45void KIncidenceFormatter::setEvent(Event *event)
46{ 46{
47 int mode = 0; 47 int mode = 0;
48 mCurrentIncidence = event; 48 mCurrentIncidence = event;
49 bool shortDate = true; 49 bool shortDate = true;
50 if ( mode == 0 ) { 50 if ( mode == 0 ) {
51 addTag("h3",event->summary()); 51 addTag("h3",event->summary());
52 } 52 }
53 else { 53 else {
54 if ( mColorMode == 1 ) { 54 if ( mColorMode == 1 ) {
55 mText +="<font color=\"#00A000\">"; 55 mText +="<font color=\"#00A000\">";
56 } 56 }
57 if ( mColorMode == 2 ) { 57 if ( mColorMode == 2 ) {
58 mText +="<font color=\"#C00000\">"; 58 mText +="<font color=\"#C00000\">";
59 } 59 }
60 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 60 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
61 if ( mode == 1 ) { 61 if ( mode == 1 ) {
62 addTag("h2",i18n( "Local: " ) +event->summary()); 62 addTag("h2",i18n( "Local: " ) +event->summary());
63 } else { 63 } else {
64 addTag("h2",i18n( "Remote: " ) +event->summary()); 64 addTag("h2",i18n( "Remote: " ) +event->summary());
65 } 65 }
66 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 66 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
67 if ( mColorMode ) 67 if ( mColorMode )
68 mText += "</font>"; 68 mText += "</font>";
69 } 69 }
70 if (event->cancelled ()) { 70 if (event->cancelled ()) {
71 mText +="<font color=\"#B00000\">"; 71 mText +="<font color=\"#B00000\">";
72 addTag("i",i18n("This event has been cancelled!")); 72 addTag("i",i18n("This event has been cancelled!"));
73 mText.append("<br>"); 73 mText.append("<br>");
74 mText += "</font>"; 74 mText += "</font>";
75 } 75 }
76 if (!event->location().isEmpty()) { 76 if (!event->location().isEmpty()) {
77 addTag("b",i18n("Location: ")); 77 addTag("b",i18n("Location: "));
78 mText.append(event->location()+"<br>"); 78 mText.append(event->location()+"<br>");
79 } 79 }
80 if (event->doesFloat()) { 80 if (event->doesFloat()) {
81 if (event->isMultiDay()) { 81 if (event->isMultiDay()) {
82 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 82 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
83 .arg(event->dtStartDateStr(shortDate)) 83 .arg(event->dtStartDateStr(shortDate))
84 .arg(event->dtEndDateStr(shortDate))); 84 .arg(event->dtEndDateStr(shortDate)));
85 } else { 85 } else {
86 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 86 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
87 } 87 }
88 } else { 88 } else {
89 if (event->isMultiDay()) { 89 if (event->isMultiDay()) {
90 mText.append(i18n("<p><b>From:</b> %1</p> ") 90 mText.append(i18n("<p><b>From:</b> %1</p> ")
91 .arg(event->dtStartStr( shortDate))); 91 .arg(event->dtStartStr( shortDate)));
92 mText.append(i18n("<p><b>To:</b> %1</p>") 92 mText.append(i18n("<p><b>To:</b> %1</p>")
93 .arg(event->dtEndStr(shortDate))); 93 .arg(event->dtEndStr(shortDate)));
94 } else { 94 } else {
95 mText.append(i18n("<p><b>On:</b> %1</p> ") 95 mText.append(i18n("<p><b>On:</b> %1</p> ")
96 .arg(event->dtStartDateStr( shortDate ))); 96 .arg(event->dtStartDateStr( shortDate )));
97 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 97 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
98 .arg(event->dtStartTimeStr()) 98 .arg(event->dtStartTimeStr())
99 .arg(event->dtEndTimeStr())); 99 .arg(event->dtEndTimeStr()));
100 } 100 }
101 } 101 }
102 102
103 if (event->recurrence()->doesRecur()) { 103 if (event->recurrence()->doesRecur()) {
104 104
105 QString recurText = event->recurrence()->recurrenceText(); 105 QString recurText = event->recurrence()->recurrenceText();
106 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 106 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
107 bool last; 107
108 bool ok;
108 QDate start = QDate::currentDate(); 109 QDate start = QDate::currentDate();
109 QDate next; 110 QDateTime next;
110 next = event->recurrence()->getPreviousDate( start , &last ); 111 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
111 if ( !last ) { 112 if ( ok ) {
112 next = event->recurrence()->getNextDate( start.addDays( - 1 ) ); 113 addTag("p",i18n("<b>Next recurrence is on:</b>") );
113 addTag("p",i18n("Next recurrence is on: ")+ KGlobal::locale()->formatDate( next, shortDate ) ); 114 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
114 //addTag("p", KGlobal::locale()->formatDate( next, shortDate )); 115
115 } else { 116 } else {
116 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 117 bool last;
117 addTag("p", KGlobal::locale()->formatDate( next, shortDate )); 118 QDate nextd;
119 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
120 if ( last ) {
121 addTag("p",i18n("<b>Last recurrence was on:</b>") );
122 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
123 }
118 } 124 }
119 } 125 }
120 126
121 127
122 if (event->isAlarmEnabled()) { 128 if (event->isAlarmEnabled()) {
123 Alarm *alarm =event->alarms().first() ; 129 Alarm *alarm =event->alarms().first() ;
124 QDateTime t = alarm->time(); 130 QDateTime t = alarm->time();
125 int min = t.secsTo( event->dtStart() )/60; 131 int min = t.secsTo( event->dtStart() )/60;
126 QString s =i18n("(%1 min before)").arg( min ); 132 QString s =i18n("(%1 min before)").arg( min );
127 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate )); 133 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate ));
128 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 134 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
129 //addTag("p",s); 135 //addTag("p",s);
130 } 136 }
131 137
132 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 138 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
133 // mText.append(event->secrecyStr()+"<br>"); 139 // mText.append(event->secrecyStr()+"<br>");
134 formatCategories(event); 140 formatCategories(event);
135 if (!event->description().isEmpty()) { 141 if (!event->description().isEmpty()) {
136 addTag("p",i18n("<b>Details: </b>")); 142 addTag("p",i18n("<b>Details: </b>"));
137 addTag("p",event->description()); 143 addTag("p",event->description());
138 } 144 }
139 145
140 146
141 formatReadOnly(event); 147 formatReadOnly(event);
142 formatAttendees(event); 148 formatAttendees(event);
143 149
144 150
145} 151}
146 152
147void KIncidenceFormatter::setTodo(Todo *event ) 153void KIncidenceFormatter::setTodo(Todo *event )
148{ 154{
149 int mode = 0; 155 int mode = 0;
150 mCurrentIncidence = event; 156 mCurrentIncidence = event;
151 bool shortDate = true; 157 bool shortDate = true;
152 if (mode == 0 ) 158 if (mode == 0 )
153 addTag("h3",event->summary()); 159 addTag("h3",event->summary());
154 else { 160 else {
155 if ( mColorMode == 1 ) { 161 if ( mColorMode == 1 ) {
156 mText +="<font color=\"#00A000\">"; 162 mText +="<font color=\"#00A000\">";
157 } 163 }
158 if ( mColorMode == 2 ) { 164 if ( mColorMode == 2 ) {
159 mText +="<font color=\"#B00000\">"; 165 mText +="<font color=\"#B00000\">";
160 } 166 }
161 if ( mode == 1 ) { 167 if ( mode == 1 ) {
162 addTag("h2",i18n( "Local: " ) +event->summary()); 168 addTag("h2",i18n( "Local: " ) +event->summary());
163 } else { 169 } else {
164 addTag("h2",i18n( "Remote: " ) +event->summary()); 170 addTag("h2",i18n( "Remote: " ) +event->summary());
165 } 171 }
166 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 172 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
167 if ( mColorMode ) 173 if ( mColorMode )
168 mText += "</font>"; 174 mText += "</font>";
169 } 175 }
170 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 176 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
171 mText +="<font color=\"#B00000\">"; 177 mText +="<font color=\"#B00000\">";
172 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) ); 178 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) );
173 mText += "</font>"; 179 mText += "</font>";
174 } else { 180 } else {
175 mText.append(i18n("<p><i>%1 % completed</i></p>") 181 mText.append(i18n("<p><i>%1 % completed</i></p>")
176 .arg(event->percentComplete())); 182 .arg(event->percentComplete()));
177 } 183 }
178 if (event->cancelled ()) { 184 if (event->cancelled ()) {
179 mText +="<font color=\"#B00000\">"; 185 mText +="<font color=\"#B00000\">";
180 addTag("i",i18n("This todo has been cancelled!")); 186 addTag("i",i18n("This todo has been cancelled!"));
181 mText.append("<br>"); 187 mText.append("<br>");
182 mText += "</font>"; 188 mText += "</font>";
183 } 189 }
184 190
185 if (!event->location().isEmpty()) { 191 if (!event->location().isEmpty()) {
186 addTag("b",i18n("Location: ")); 192 addTag("b",i18n("Location: "));
187 mText.append(event->location()+"<br>"); 193 mText.append(event->location()+"<br>");
188 } 194 }
189 if (event->hasDueDate()) { 195 if (event->hasDueDate()) {
190 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate))); 196 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate)));
191 } 197 }
192 mText.append(i18n("<p><b>Priority:</b> %2</p>") 198 mText.append(i18n("<p><b>Priority:</b> %2</p>")
193 .arg(QString::number(event->priority()))); 199 .arg(QString::number(event->priority())));
194 200
195 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 201 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
196 formatCategories(event); 202 formatCategories(event);
197 if (!event->description().isEmpty()) { 203 if (!event->description().isEmpty()) {
198 addTag("p",i18n("<b>Details: </b>")); 204 addTag("p",i18n("<b>Details: </b>"));
199 addTag("p",event->description()); 205 addTag("p",event->description());
200 } 206 }
201 207
202 208
203 209
204 formatReadOnly(event); 210 formatReadOnly(event);
205 formatAttendees(event); 211 formatAttendees(event);
206 212
207} 213}
208 214
209void KIncidenceFormatter::setJournal(Journal* ) 215void KIncidenceFormatter::setJournal(Journal* )
210{ 216{
211 217
212} 218}
213 219
214void KIncidenceFormatter::formatCategories(Incidence *event) 220void KIncidenceFormatter::formatCategories(Incidence *event)
215{ 221{
216 if (!event->categoriesStr().isEmpty()) { 222 if (!event->categoriesStr().isEmpty()) {
217 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStr() ); 223 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStr() );
218 //mText.append(event->categoriesStr()); 224 //mText.append(event->categoriesStr());
219 } 225 }
220} 226}
221void KIncidenceFormatter::addTag(const QString & tag,const QString & text) 227void KIncidenceFormatter::addTag(const QString & tag,const QString & text)
222{ 228{
223 int number=text.contains("\n"); 229 int number=text.contains("\n");
224 QString str = "<" + tag + ">"; 230 QString str = "<" + tag + ">";
225 QString tmpText=text; 231 QString tmpText=text;
226 QString tmpStr=str; 232 QString tmpStr=str;
227 if(number !=-1) 233 if(number !=-1)
228 { 234 {
229 if (number > 0) { 235 if (number > 0) {
230 int pos=0; 236 int pos=0;
231 QString tmp; 237 QString tmp;
232 for(int i=0;i<=number;i++) { 238 for(int i=0;i<=number;i++) {
233 pos=tmpText.find("\n"); 239 pos=tmpText.find("\n");
234 tmp=tmpText.left(pos); 240 tmp=tmpText.left(pos);
235 tmpText=tmpText.right(tmpText.length()-pos-1); 241 tmpText=tmpText.right(tmpText.length()-pos-1);
236 tmpStr+=tmp+"<br>"; 242 tmpStr+=tmp+"<br>";
237 } 243 }
238 } 244 }
239 else tmpStr += tmpText; 245 else tmpStr += tmpText;
240 tmpStr+="</" + tag + ">"; 246 tmpStr+="</" + tag + ">";
241 mText.append(tmpStr); 247 mText.append(tmpStr);
242 } 248 }
243 else 249 else
244 { 250 {
245 str += text + "</" + tag + ">"; 251 str += text + "</" + tag + ">";
diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp
index e84f672..5181eaf 100644
--- a/libkcal/recurrence.cpp
+++ b/libkcal/recurrence.cpp
@@ -754,256 +754,257 @@ void Recurrence::addYearlyMonthPos(short _rPos, const QBitArray &_rDays)
754} 754}
755 755
756const QPtrList<int> &Recurrence::yearNums() const 756const QPtrList<int> &Recurrence::yearNums() const
757{ 757{
758 return rYearNums; 758 return rYearNums;
759} 759}
760void Recurrence::addYearlyMonth(short _rPos ) 760void Recurrence::addYearlyMonth(short _rPos )
761{ 761{
762 if (mRecurReadOnly || recurs != rYearlyMonth) // invalid day/month number 762 if (mRecurReadOnly || recurs != rYearlyMonth) // invalid day/month number
763 return; 763 return;
764 rMonthPos *tmpPos = new rMonthPos; 764 rMonthPos *tmpPos = new rMonthPos;
765 if ( _rPos > 0) { 765 if ( _rPos > 0) {
766 tmpPos->rPos = _rPos; 766 tmpPos->rPos = _rPos;
767 tmpPos->negative = false; 767 tmpPos->negative = false;
768 } else { 768 } else {
769 tmpPos->rPos = -_rPos; // take abs() 769 tmpPos->rPos = -_rPos; // take abs()
770 tmpPos->negative = true; 770 tmpPos->negative = true;
771 } 771 }
772 rMonthPositions.append(tmpPos); 772 rMonthPositions.append(tmpPos);
773} 773}
774void Recurrence::addYearlyNum(short _rNum) 774void Recurrence::addYearlyNum(short _rNum)
775{ 775{
776 if (mRecurReadOnly 776 if (mRecurReadOnly
777 || (recurs != rYearlyMonth && recurs != rYearlyDay && recurs != rYearlyPos) 777 || (recurs != rYearlyMonth && recurs != rYearlyDay && recurs != rYearlyPos)
778 || _rNum <= 0) // invalid day/month number 778 || _rNum <= 0) // invalid day/month number
779 return; 779 return;
780 780
781 if (mCompatVersion < 310 && mCompatRecurs == rYearlyDay) { 781 if (mCompatVersion < 310 && mCompatRecurs == rYearlyDay) {
782 // Backwards compatibility for KDE < 3.1. 782 // Backwards compatibility for KDE < 3.1.
783 // Dates were stored as day numbers, with a fiddle to take account of leap years. 783 // Dates were stored as day numbers, with a fiddle to take account of leap years.
784 // Convert the day number to a month. 784 // Convert the day number to a month.
785 if (_rNum <= 0 || _rNum > 366 || (_rNum == 366 && mRecurStart.date().daysInYear() < 366)) 785 if (_rNum <= 0 || _rNum > 366 || (_rNum == 366 && mRecurStart.date().daysInYear() < 366))
786 return; // invalid day number 786 return; // invalid day number
787 _rNum = QDate(mRecurStart.date().year(), 1, 1).addDays(_rNum - 1).month(); 787 _rNum = QDate(mRecurStart.date().year(), 1, 1).addDays(_rNum - 1).month();
788 } else 788 } else
789 if ((recurs == rYearlyMonth || recurs == rYearlyPos) && _rNum > 12 789 if ((recurs == rYearlyMonth || recurs == rYearlyPos) && _rNum > 12
790 || recurs == rYearlyDay && _rNum > 366) 790 || recurs == rYearlyDay && _rNum > 366)
791 return; // invalid day number 791 return; // invalid day number
792 792
793 uint i = 0; 793 uint i = 0;
794 for (int* it = rYearNums.first(); it && _rNum >= *it; it = rYearNums.next()) { 794 for (int* it = rYearNums.first(); it && _rNum >= *it; it = rYearNums.next()) {
795 if (_rNum == *it) 795 if (_rNum == *it)
796 return; // this day/month is already in the list - avoid duplication 796 return; // this day/month is already in the list - avoid duplication
797 ++i; 797 ++i;
798 } 798 }
799 799
800 int *tmpNum = new int; 800 int *tmpNum = new int;
801 *tmpNum = _rNum; 801 *tmpNum = _rNum;
802 rYearNums.insert(i, tmpNum); // insert the day/month in a sorted position 802 rYearNums.insert(i, tmpNum); // insert the day/month in a sorted position
803 803
804 if (mCompatVersion < 310 && mCompatDuration > 0) { 804 if (mCompatVersion < 310 && mCompatDuration > 0) {
805 // Backwards compatibility for KDE < 3.1. 805 // Backwards compatibility for KDE < 3.1.
806 // rDuration was set to the number of time periods to recur. 806 // rDuration was set to the number of time periods to recur.
807 // Convert this to the number of occurrences. 807 // Convert this to the number of occurrences.
808 QDate end(mRecurStart.date().year() + (mCompatDuration-1+mRecurExDatesCount)*rFreq, 12, 31); 808 QDate end(mRecurStart.date().year() + (mCompatDuration-1+mRecurExDatesCount)*rFreq, 12, 31);
809 rDuration = INT_MAX; // ensure that recurCalc() does its job correctly 809 rDuration = INT_MAX; // ensure that recurCalc() does its job correctly
810 rDuration = recurCalc(COUNT_TO_DATE, end); 810 rDuration = recurCalc(COUNT_TO_DATE, end);
811 } 811 }
812 812
813 if (mParent) mParent->updated(); 813 if (mParent) mParent->updated();
814} 814}
815 815
816 816
817QDateTime Recurrence::getNextDateTime(const QDateTime &preDateTime, bool *last) const 817QDateTime Recurrence::getNextDateTime(const QDateTime &preDateTime, bool *last) const
818{ 818{
819 if (last) 819 if (last)
820 *last = false; 820 *last = false;
821 int freq; 821 int freq;
822 switch (recurs) 822 switch (recurs)
823 { 823 {
824 case rMinutely: 824 case rMinutely:
825 freq = rFreq * 60; 825 freq = rFreq * 60;
826 break; 826 break;
827 case rHourly: 827 case rHourly:
828 freq = rFreq * 3600; 828 freq = rFreq * 3600;
829 break; 829 break;
830 case rDaily: 830 case rDaily:
831 case rWeekly: 831 case rWeekly:
832 case rMonthlyPos: 832 case rMonthlyPos:
833 case rMonthlyDay: 833 case rMonthlyDay:
834 case rYearlyMonth: 834 case rYearlyMonth:
835 case rYearlyDay: 835 case rYearlyDay:
836 case rYearlyPos: { 836 case rYearlyPos: {
837 QDate preDate = preDateTime.date(); 837 QDate preDate = preDateTime.date();
838 if (!mFloats && mRecurStart.time() > preDateTime.time()) 838 if (!mFloats && mRecurStart.time() > preDateTime.time())
839 preDate = preDate.addDays(-1); 839 preDate = preDate.addDays(-1);
840 return QDateTime(getNextDateNoTime(preDate, last), mRecurStart.time()); 840 return QDateTime(getNextDateNoTime(preDate, last), mRecurStart.time());
841 } 841 }
842 default: 842 default:
843 return QDateTime(); 843 return QDateTime();
844 } 844 }
845 845
846 // It's a sub-daily recurrence 846 // It's a sub-daily recurrence
847 if (preDateTime < mRecurStart) 847 if (preDateTime < mRecurStart)
848 return mRecurStart; 848 return mRecurStart;
849 int count = mRecurStart.secsTo(preDateTime) / freq + 2; 849 int count = mRecurStart.secsTo(preDateTime) / freq + 2;
850 if (rDuration > 0) { 850 if (rDuration > 0) {
851 if (count > rDuration) 851 if (count > rDuration)
852 return QDateTime(); 852 return QDateTime();
853 if (last && count == rDuration) 853 if (last && count == rDuration)
854 *last = true; 854 *last = true;
855 } 855 }
856 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq); 856 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq);
857 if (rDuration == 0) { 857 if (rDuration == 0) {
858 if (endtime > rEndDateTime) 858 if (endtime > rEndDateTime)
859 return QDateTime(); 859 return QDateTime();
860 if (last && endtime == rEndDateTime) 860 if (last && endtime == rEndDateTime)
861 *last = true; 861 *last = true;
862 } 862 }
863 return endtime; 863 return endtime;
864} 864}
865 865
866QDate Recurrence::getNextDate(const QDate &preDate, bool *last) const 866QDate Recurrence::getNextDate(const QDate &preDate, bool *last) const
867{ 867{
868 if (last) 868 if (last)
869 *last = false; 869 *last = false;
870 switch (recurs) 870 switch (recurs)
871 { 871 {
872 case rMinutely: 872 case rMinutely:
873 case rHourly: 873 case rHourly:
874 return getNextDateTime(QDateTime(preDate, QTime(23,59,59)), last).date(); 874 return getNextDateTime(QDateTime(preDate, QTime(23,59,59)), last).date();
875 case rDaily: 875 case rDaily:
876 case rWeekly: 876 case rWeekly:
877 case rMonthlyPos: 877 case rMonthlyPos:
878 case rMonthlyDay: 878 case rMonthlyDay:
879 case rYearlyMonth: 879 case rYearlyMonth:
880 case rYearlyDay: 880 case rYearlyDay:
881 case rYearlyPos: 881 case rYearlyPos:
882 qDebug("Recurrence::getNextDate: MAY BE BROKEN ");
882 return getNextDateNoTime(preDate, last); 883 return getNextDateNoTime(preDate, last);
883 default: 884 default:
884 return QDate(); 885 return QDate();
885 } 886 }
886} 887}
887 888
888 889
889QDateTime Recurrence::getPreviousDateTime(const QDateTime &afterDateTime, bool *last) const 890QDateTime Recurrence::getPreviousDateTime(const QDateTime &afterDateTime, bool *last) const
890{ 891{
891 if (last) 892 if (last)
892 *last = false; 893 *last = false;
893 int freq; 894 int freq;
894 switch (recurs) 895 switch (recurs)
895 { 896 {
896 case rMinutely: 897 case rMinutely:
897 freq = rFreq * 60; 898 freq = rFreq * 60;
898 break; 899 break;
899 case rHourly: 900 case rHourly:
900 freq = rFreq * 3600; 901 freq = rFreq * 3600;
901 break; 902 break;
902 case rDaily: 903 case rDaily:
903 case rWeekly: 904 case rWeekly:
904 case rMonthlyPos: 905 case rMonthlyPos:
905 case rMonthlyDay: 906 case rMonthlyDay:
906 case rYearlyMonth: 907 case rYearlyMonth:
907 case rYearlyDay: 908 case rYearlyDay:
908 case rYearlyPos: { 909 case rYearlyPos: {
909 QDate afterDate = afterDateTime.date(); 910 QDate afterDate = afterDateTime.date();
910 if (!mFloats && mRecurStart.time() < afterDateTime.time()) 911 if (!mFloats && mRecurStart.time() < afterDateTime.time())
911 afterDate = afterDate.addDays(1); 912 afterDate = afterDate.addDays(1);
912 return QDateTime(getPreviousDateNoTime(afterDate, last), mRecurStart.time()); 913 return QDateTime(getPreviousDateNoTime(afterDate, last), mRecurStart.time());
913 } 914 }
914 default: 915 default:
915 return QDateTime(); 916 return QDateTime();
916 } 917 }
917 918
918 // It's a sub-daily recurrence 919 // It's a sub-daily recurrence
919 if (afterDateTime <= mRecurStart) 920 if (afterDateTime <= mRecurStart)
920 return QDateTime(); 921 return QDateTime();
921 int count = (mRecurStart.secsTo(afterDateTime) - 1) / freq + 1; 922 int count = (mRecurStart.secsTo(afterDateTime) - 1) / freq + 1;
922 if (rDuration > 0) { 923 if (rDuration > 0) {
923 if (count > rDuration) 924 if (count > rDuration)
924 count = rDuration; 925 count = rDuration;
925 if (last && count == rDuration) 926 if (last && count == rDuration)
926 *last = true; 927 *last = true;
927 } 928 }
928 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq); 929 QDateTime endtime = mRecurStart.addSecs((count - 1)*freq);
929 if (rDuration == 0) { 930 if (rDuration == 0) {
930 if (endtime > rEndDateTime) 931 if (endtime > rEndDateTime)
931 endtime = rEndDateTime; 932 endtime = rEndDateTime;
932 if (last && endtime == rEndDateTime) 933 if (last && endtime == rEndDateTime)
933 *last = true; 934 *last = true;
934 } 935 }
935 return endtime; 936 return endtime;
936} 937}
937 938
938QDate Recurrence::getPreviousDate(const QDate &afterDate, bool *last) const 939QDate Recurrence::getPreviousDate(const QDate &afterDate, bool *last) const
939{ 940{
940 if (last) 941 if (last)
941 *last = false; 942 *last = false;
942 switch (recurs) 943 switch (recurs)
943 { 944 {
944 case rMinutely: 945 case rMinutely:
945 case rHourly: 946 case rHourly:
946 return getPreviousDateTime(QDateTime(afterDate, QTime(0,0,0)), last).date(); 947 return getPreviousDateTime(QDateTime(afterDate, QTime(0,0,0)), last).date();
947 case rDaily: 948 case rDaily:
948 case rWeekly: 949 case rWeekly:
949 case rMonthlyPos: 950 case rMonthlyPos:
950 case rMonthlyDay: 951 case rMonthlyDay:
951 case rYearlyMonth: 952 case rYearlyMonth:
952 case rYearlyDay: 953 case rYearlyDay:
953 case rYearlyPos: 954 case rYearlyPos:
954 return getPreviousDateNoTime(afterDate, last); 955 return getPreviousDateNoTime(afterDate, last);
955 default: 956 default:
956 return QDate(); 957 return QDate();
957 } 958 }
958} 959}
959 960
960 961
961/***************************** PROTECTED FUNCTIONS ***************************/ 962/***************************** PROTECTED FUNCTIONS ***************************/
962 963
963bool Recurrence::recursSecondly(const QDate &qd, int secondFreq) const 964bool Recurrence::recursSecondly(const QDate &qd, int secondFreq) const
964{ 965{
965 if ((qd >= mRecurStart.date()) && 966 if ((qd >= mRecurStart.date()) &&
966 ((rDuration > 0) && (qd <= endDate()) || 967 ((rDuration > 0) && (qd <= endDate()) ||
967 ((rDuration == 0) && (qd <= rEndDateTime.date())) || 968 ((rDuration == 0) && (qd <= rEndDateTime.date())) ||
968 (rDuration == -1))) { 969 (rDuration == -1))) {
969 // The date queried falls within the range of the event. 970 // The date queried falls within the range of the event.
970 if (secondFreq < 24*3600) 971 if (secondFreq < 24*3600)
971 return true; // the event recurs at least once each day 972 return true; // the event recurs at least once each day
972 int after = mRecurStart.secsTo(QDateTime(qd)); 973 int after = mRecurStart.secsTo(QDateTime(qd));
973 if (after / secondFreq != (after + 24*3600) / secondFreq) 974 if (after / secondFreq != (after + 24*3600) / secondFreq)
974 return true; 975 return true;
975 } 976 }
976 return false; 977 return false;
977} 978}
978 979
979bool Recurrence::recursMinutelyAt(const QDateTime &dt, int minuteFreq) const 980bool Recurrence::recursMinutelyAt(const QDateTime &dt, int minuteFreq) const
980{ 981{
981 if ((dt >= mRecurStart) && 982 if ((dt >= mRecurStart) &&
982 ((rDuration > 0) && (dt <= endDateTime()) || 983 ((rDuration > 0) && (dt <= endDateTime()) ||
983 ((rDuration == 0) && (dt <= rEndDateTime)) || 984 ((rDuration == 0) && (dt <= rEndDateTime)) ||
984 (rDuration == -1))) { 985 (rDuration == -1))) {
985 // The time queried falls within the range of the event. 986 // The time queried falls within the range of the event.
986 if (((mRecurStart.secsTo(dt) / 60) % minuteFreq) == 0) 987 if (((mRecurStart.secsTo(dt) / 60) % minuteFreq) == 0)
987 return true; 988 return true;
988 } 989 }
989 return false; 990 return false;
990} 991}
991 992
992bool Recurrence::recursDaily(const QDate &qd) const 993bool Recurrence::recursDaily(const QDate &qd) const
993{ 994{
994 QDate dStart = mRecurStart.date(); 995 QDate dStart = mRecurStart.date();
995 if ((dStart.daysTo(qd) % rFreq) == 0) { 996 if ((dStart.daysTo(qd) % rFreq) == 0) {
996 // The date is a day which recurs 997 // The date is a day which recurs
997 if (qd >= dStart 998 if (qd >= dStart
998 && ((rDuration > 0 && qd <= endDate()) || 999 && ((rDuration > 0 && qd <= endDate()) ||
999 (rDuration == 0 && qd <= rEndDateTime.date()) || 1000 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1000 rDuration == -1)) { 1001 rDuration == -1)) {
1001 // The date queried falls within the range of the event. 1002 // The date queried falls within the range of the event.
1002 return true; 1003 return true;
1003 } 1004 }
1004 } 1005 }
1005 return false; 1006 return false;
1006} 1007}
1007 1008
1008bool Recurrence::recursWeekly(const QDate &qd) const 1009bool Recurrence::recursWeekly(const QDate &qd) const
1009{ 1010{
@@ -1041,256 +1042,257 @@ bool Recurrence::recursMonthly(const QDate &qd) const
1041 rDuration == -1)) { 1042 rDuration == -1)) {
1042 // The date queried falls within the range of the event. 1043 // The date queried falls within the range of the event.
1043 QValueList<int> days; 1044 QValueList<int> days;
1044 int daysInMonth = qd.daysInMonth(); 1045 int daysInMonth = qd.daysInMonth();
1045 if (recurs == rMonthlyDay) 1046 if (recurs == rMonthlyDay)
1046 getMonthlyDayDays(days, daysInMonth); 1047 getMonthlyDayDays(days, daysInMonth);
1047 else if (recurs == rMonthlyPos) 1048 else if (recurs == rMonthlyPos)
1048 getMonthlyPosDays(days, daysInMonth, QDate(year, month, 1).dayOfWeek()); 1049 getMonthlyPosDays(days, daysInMonth, QDate(year, month, 1).dayOfWeek());
1049 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) { 1050 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) {
1050 if (*it == day) 1051 if (*it == day)
1051 return true; 1052 return true;
1052 } 1053 }
1053 // no dates matched 1054 // no dates matched
1054 } 1055 }
1055 } 1056 }
1056 return false; 1057 return false;
1057} 1058}
1058 1059
1059bool Recurrence::recursYearlyByMonth(const QDate &qd) const 1060bool Recurrence::recursYearlyByMonth(const QDate &qd) const
1060{ 1061{
1061 QDate dStart = mRecurStart.date(); 1062 QDate dStart = mRecurStart.date();
1062 int startDay = dStart.day(); 1063 int startDay = dStart.day();
1063 int qday = qd.day(); 1064 int qday = qd.day();
1064 int qmonth = qd.month(); 1065 int qmonth = qd.month();
1065 int qyear = qd.year(); 1066 int qyear = qd.year();
1066 bool match = (qday == startDay); 1067 bool match = (qday == startDay);
1067 if (!match && startDay == 29 && dStart.month() == 2) { 1068 if (!match && startDay == 29 && dStart.month() == 2) {
1068 // It's a recurrence on February 29th 1069 // It's a recurrence on February 29th
1069 switch (mFeb29YearlyType) { 1070 switch (mFeb29YearlyType) {
1070 case rFeb28: 1071 case rFeb28:
1071 if (qday == 28 && qmonth == 2 && !QDate::leapYear(qyear)) 1072 if (qday == 28 && qmonth == 2 && !QDate::leapYear(qyear))
1072 match = true; 1073 match = true;
1073 break; 1074 break;
1074 case rMar1: 1075 case rMar1:
1075 if (qday == 1 && qmonth == 3 && !QDate::leapYear(qyear)) { 1076 if (qday == 1 && qmonth == 3 && !QDate::leapYear(qyear)) {
1076 qmonth = 2; 1077 qmonth = 2;
1077 match = true; 1078 match = true;
1078 } 1079 }
1079 break; 1080 break;
1080 case rFeb29: 1081 case rFeb29:
1081 break; 1082 break;
1082 } 1083 }
1083 } 1084 }
1084 1085
1085 if (match) { 1086 if (match) {
1086 // The day of the month matches. Calculate how many years ahead 1087 // The day of the month matches. Calculate how many years ahead
1087 // this date is from the original event's date. 1088 // this date is from the original event's date.
1088 int yearsAhead = (qyear - dStart.year()); 1089 int yearsAhead = (qyear - dStart.year());
1089 if (yearsAhead % rFreq == 0) { 1090 if (yearsAhead % rFreq == 0) {
1090 // The date is in a year which recurs 1091 // The date is in a year which recurs
1091 if (qd >= dStart 1092 if (qd >= dStart
1092 && ((rDuration > 0 && qd <= endDate()) || 1093 && ((rDuration > 0 && qd <= endDate()) ||
1093 (rDuration == 0 && qd <= rEndDateTime.date()) || 1094 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1094 rDuration == -1)) { 1095 rDuration == -1)) {
1095 // The date queried falls within the range of the event. 1096 // The date queried falls within the range of the event.
1096 int i = qmonth; 1097 int i = qmonth;
1097 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1098 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1098 if (i == *qlin.current()) 1099 if (i == *qlin.current())
1099 return true; 1100 return true;
1100 } 1101 }
1101 } 1102 }
1102 } 1103 }
1103 } 1104 }
1104 return false; 1105 return false;
1105} 1106}
1106 1107
1107bool Recurrence::recursYearlyByPos(const QDate &qd) const 1108bool Recurrence::recursYearlyByPos(const QDate &qd) const
1108{ 1109{
1109 QDate dStart = mRecurStart.date(); 1110 QDate dStart = mRecurStart.date();
1110 int year = qd.year(); 1111 int year = qd.year();
1111 int month = qd.month(); 1112 int month = qd.month();
1112 int day = qd.day(); 1113 int day = qd.day();
1113 // calculate how many years ahead this date is from the original 1114 // calculate how many years ahead this date is from the original
1114 // event's date 1115 // event's date
1115 int yearsAhead = (year - dStart.year()); 1116 int yearsAhead = (year - dStart.year());
1116 if (yearsAhead % rFreq == 0) { 1117 if (yearsAhead % rFreq == 0) {
1117 // The date is in a year which recurs 1118 // The date is in a year which recurs
1118 if (qd >= dStart 1119 if (qd >= dStart
1119 && ((rDuration > 0 && qd <= endDate()) || 1120 && ((rDuration > 0 && qd <= endDate()) ||
1120 (rDuration == 0 && qd <= rEndDateTime.date()) || 1121 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1121 rDuration == -1)) { 1122 rDuration == -1)) {
1122 // The date queried falls within the range of the event. 1123 // The date queried falls within the range of the event.
1123 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1124 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1124 if (month == *qlin.current()) { 1125 if (month == *qlin.current()) {
1125 // The month recurs 1126 // The month recurs
1126 QValueList<int> days; 1127 QValueList<int> days;
1127 getMonthlyPosDays(days, qd.daysInMonth(), QDate(year, month, 1).dayOfWeek()); 1128 getMonthlyPosDays(days, qd.daysInMonth(), QDate(year, month, 1).dayOfWeek());
1128 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) { 1129 for (QValueList<int>::Iterator it = days.begin(); it != days.end(); ++it) {
1129 if (*it == day) 1130 if (*it == day)
1130 return true; 1131 return true;
1131 } 1132 }
1132 } 1133 }
1133 } 1134 }
1134 } 1135 }
1135 } 1136 }
1136 return false; 1137 return false;
1137} 1138}
1138 1139
1139bool Recurrence::recursYearlyByDay(const QDate &qd) const 1140bool Recurrence::recursYearlyByDay(const QDate &qd) const
1140{ 1141{
1141 QDate dStart = mRecurStart.date(); 1142 QDate dStart = mRecurStart.date();
1142 // calculate how many years ahead this date is from the original 1143 // calculate how many years ahead this date is from the original
1143 // event's date 1144 // event's date
1144 int yearsAhead = (qd.year() - dStart.year()); 1145 int yearsAhead = (qd.year() - dStart.year());
1145 if (yearsAhead % rFreq == 0) { 1146 if (yearsAhead % rFreq == 0) {
1146 // The date is in a year which recurs 1147 // The date is in a year which recurs
1147 if (qd >= dStart 1148 if (qd >= dStart
1148 && ((rDuration > 0 && qd <= endDate()) || 1149 && ((rDuration > 0 && qd <= endDate()) ||
1149 (rDuration == 0 && qd <= rEndDateTime.date()) || 1150 (rDuration == 0 && qd <= rEndDateTime.date()) ||
1150 rDuration == -1)) { 1151 rDuration == -1)) {
1151 // The date queried falls within the range of the event. 1152 // The date queried falls within the range of the event.
1152 int i = qd.dayOfYear(); 1153 int i = qd.dayOfYear();
1153 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) { 1154 for (QPtrListIterator<int> qlin(rYearNums); qlin.current(); ++qlin) {
1154 if (i == *qlin.current()) 1155 if (i == *qlin.current())
1155 return true; 1156 return true;
1156 } 1157 }
1157 } 1158 }
1158 } 1159 }
1159 return false; 1160 return false;
1160} 1161}
1161 1162
1162/* Get the date of the next recurrence, after the specified date. 1163/* Get the date of the next recurrence, after the specified date.
1163 * If 'last' is non-null, '*last' is set to true if the next recurrence is the 1164 * If 'last' is non-null, '*last' is set to true if the next recurrence is the
1164 * last recurrence, else false. 1165 * last recurrence, else false.
1165 * Reply = date of next recurrence, or invalid date if none. 1166 * Reply = date of next recurrence, or invalid date if none.
1166 */ 1167 */
1167QDate Recurrence::getNextDateNoTime(const QDate &preDate, bool *last) const 1168QDate Recurrence::getNextDateNoTime(const QDate &preDate, bool *last) const
1168{ 1169{
1170
1169 if (last) 1171 if (last)
1170 *last = false; 1172 *last = false;
1171 QDate dStart = mRecurStart.date(); 1173 QDate dStart = mRecurStart.date();
1172 if (preDate < dStart) 1174 if (preDate < dStart)
1173 return dStart; 1175 return dStart;
1174 QDate earliestDate = preDate.addDays(1); 1176 QDate earliestDate = preDate.addDays(1);
1175 QDate nextDate; 1177 QDate nextDate;
1176 1178
1177 switch (recurs) { 1179 switch (recurs) {
1178 case rDaily: 1180 case rDaily:
1179 nextDate = dStart.addDays((dStart.daysTo(preDate)/rFreq + 1) * rFreq); 1181 nextDate = dStart.addDays((dStart.daysTo(preDate)/rFreq + 1) * rFreq);
1180 break; 1182 break;
1181 1183
1182 case rWeekly: { 1184 case rWeekly: {
1183 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart 1185 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart
1184 int earliestDayOfWeek = earliestDate.dayOfWeek(); 1186 int earliestDayOfWeek = earliestDate.dayOfWeek();
1185 int weeksAhead = start.daysTo(earliestDate) / 7; 1187 int weeksAhead = start.daysTo(earliestDate) / 7;
1186 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week 1188 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week
1187 weeksAhead -= notThisWeek; // latest week which recurred 1189 weeksAhead -= notThisWeek; // latest week which recurred
1188 int weekday = 0; 1190 int weekday = 0;
1189 // First check for any remaining day this week, if this week is a recurring week 1191 // First check for any remaining day this week, if this week is a recurring week
1190 if (!notThisWeek) 1192 if (!notThisWeek)
1191 weekday = getFirstDayInWeek(earliestDayOfWeek); 1193 weekday = getFirstDayInWeek(earliestDayOfWeek);
1192 // Check for a day in the next scheduled week 1194 // Check for a day in the next scheduled week
1193 if (!weekday && earliestDayOfWeek > 1) 1195 if (!weekday && earliestDayOfWeek > 1)
1194 weekday = getFirstDayInWeek(rWeekStart) + rFreq*7; 1196 weekday = getFirstDayInWeek(rWeekStart) + rFreq*7;
1195 if (weekday) 1197 if (weekday)
1196 nextDate = start.addDays(weeksAhead*7 + weekday - 1); 1198 nextDate = start.addDays(weeksAhead*7 + weekday - 1);
1197 break; 1199 break;
1198 } 1200 }
1199 case rMonthlyDay: 1201 case rMonthlyDay:
1200 case rMonthlyPos: { 1202 case rMonthlyPos: {
1201 int startYear = dStart.year(); 1203 int startYear = dStart.year();
1202 int startMonth = dStart.month(); // 1..12 1204 int startMonth = dStart.month(); // 1..12
1203 int earliestYear = earliestDate.year(); 1205 int earliestYear = earliestDate.year();
1204 int monthsAhead = (earliestYear - startYear)*12 + earliestDate.month() - startMonth; 1206 int monthsAhead = (earliestYear - startYear)*12 + earliestDate.month() - startMonth;
1205 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month 1207 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month
1206 monthsAhead -= notThisMonth; // latest month which recurred 1208 monthsAhead -= notThisMonth; // latest month which recurred
1207 // Check for the first later day in the current month 1209 // Check for the first later day in the current month
1208 if (!notThisMonth) 1210 if (!notThisMonth)
1209 nextDate = getFirstDateInMonth(earliestDate); 1211 nextDate = getFirstDateInMonth(earliestDate);
1210 if (!nextDate.isValid() && earliestDate.day() > 1) { 1212 if (!nextDate.isValid() && earliestDate.day() > 1) {
1211 // Check for a day in the next scheduled month 1213 // Check for a day in the next scheduled month
1212 int months = startMonth - 1 + monthsAhead + rFreq; 1214 int months = startMonth - 1 + monthsAhead + rFreq;
1213 nextDate = getFirstDateInMonth(QDate(startYear + months/12, months%12 + 1, 1)); 1215 nextDate = getFirstDateInMonth(QDate(startYear + months/12, months%12 + 1, 1));
1214 } 1216 }
1215 break; 1217 break;
1216 } 1218 }
1217 case rYearlyMonth: 1219 case rYearlyMonth:
1218 case rYearlyPos: 1220 case rYearlyPos:
1219 case rYearlyDay: { 1221 case rYearlyDay: {
1220 int startYear = dStart.year(); 1222 int startYear = dStart.year();
1221 int yearsAhead = earliestDate.year() - startYear; 1223 int yearsAhead = earliestDate.year() - startYear;
1222 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year 1224 int notThisYear = yearsAhead % rFreq; // zero if this year is a recurring year
1223 yearsAhead -= notThisYear; // latest year which recurred 1225 yearsAhead -= notThisYear; // latest year which recurred
1224 // Check for the first later date in the current year 1226 // Check for the first later date in the current year
1225 if (!notThisYear) 1227 if (!notThisYear)
1226 nextDate = getFirstDateInYear(earliestDate); 1228 nextDate = getFirstDateInYear(earliestDate);
1227 // Check for a date in the next scheduled year 1229 // Check for a date in the next scheduled year
1228 if (!nextDate.isValid() && earliestDate.dayOfYear() > 1) 1230 if (!nextDate.isValid() && earliestDate.dayOfYear() > 1)
1229 nextDate = getFirstDateInYear(QDate(startYear + yearsAhead + rFreq, 1, 1)); 1231 nextDate = getFirstDateInYear(QDate(startYear + yearsAhead + rFreq, 1, 1));
1230 break; 1232 break;
1231 } 1233 }
1232 case rNone: 1234 case rNone:
1233 default: 1235 default:
1234 return QDate(); 1236 return QDate();
1235 } 1237 }
1236 1238
1237 if (rDuration >= 0 && nextDate.isValid()) { 1239 if (rDuration >= 0 && nextDate.isValid()) {
1238 // Check that the date found is within the range of the recurrence 1240 // Check that the date found is within the range of the recurrence
1239 QDate end = endDate(); 1241 QDate end = endDate();
1240 if (nextDate > end) 1242 if (nextDate > end)
1241 return QDate(); 1243 return QDate();
1242 if (last && nextDate == end) 1244 if (last && nextDate == end)
1243 *last = true; 1245 *last = true;
1244 } 1246 }
1245 return nextDate; 1247 return nextDate;
1246} 1248}
1247 1249
1248/* Get the date of the last previous recurrence, before the specified date. 1250/* Get the date of the last previous recurrence, before the specified date.
1249 * Reply = date of previous recurrence, or invalid date if none. 1251 * Reply = date of previous recurrence, or invalid date if none.
1250 */ 1252 */
1251QDate Recurrence::getPreviousDateNoTime(const QDate &afterDate, bool *last) const 1253QDate Recurrence::getPreviousDateNoTime(const QDate &afterDate, bool *last) const
1252{ 1254{
1253 if (last) 1255 if (last)
1254 *last = false; 1256 *last = false;
1255 QDate dStart = mRecurStart.date(); 1257 QDate dStart = mRecurStart.date();
1256 QDate latestDate = afterDate.addDays(-1); 1258 QDate latestDate = afterDate.addDays(-1);
1257 if (latestDate < dStart) 1259 if (latestDate < dStart)
1258 return QDate(); 1260 return QDate();
1259 QDate prevDate; 1261 QDate prevDate;
1260 1262
1261 switch (recurs) { 1263 switch (recurs) {
1262 case rDaily: 1264 case rDaily:
1263 prevDate = dStart.addDays((dStart.daysTo(latestDate) / rFreq) * rFreq); 1265 prevDate = dStart.addDays((dStart.daysTo(latestDate) / rFreq) * rFreq);
1264 break; 1266 break;
1265 1267
1266 case rWeekly: { 1268 case rWeekly: {
1267 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart 1269 QDate start = dStart.addDays(1 - dStart.dayOfWeek()); // start of week for dStart
1268 int latestDayOfWeek = latestDate.dayOfWeek(); 1270 int latestDayOfWeek = latestDate.dayOfWeek();
1269 int weeksAhead = start.daysTo(latestDate) / 7; 1271 int weeksAhead = start.daysTo(latestDate) / 7;
1270 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week 1272 int notThisWeek = weeksAhead % rFreq; // zero if this week is a recurring week
1271 weeksAhead -= notThisWeek; // latest week which recurred 1273 weeksAhead -= notThisWeek; // latest week which recurred
1272 int weekday = 0; 1274 int weekday = 0;
1273 // First check for any previous day this week, if this week is a recurring week 1275 // First check for any previous day this week, if this week is a recurring week
1274 if (!notThisWeek) 1276 if (!notThisWeek)
1275 weekday = getLastDayInWeek(latestDayOfWeek); 1277 weekday = getLastDayInWeek(latestDayOfWeek);
1276 // Check for a day in the previous scheduled week 1278 // Check for a day in the previous scheduled week
1277 if (!weekday) { 1279 if (!weekday) {
1278 int weekEnd = (rWeekStart + 5)%7 + 1; 1280 int weekEnd = (rWeekStart + 5)%7 + 1;
1279 if (latestDayOfWeek < weekEnd) { 1281 if (latestDayOfWeek < weekEnd) {
1280 if (!notThisWeek) 1282 if (!notThisWeek)
1281 weeksAhead -= rFreq; 1283 weeksAhead -= rFreq;
1282 weekday = getLastDayInWeek(weekEnd); 1284 weekday = getLastDayInWeek(weekEnd);
1283 } 1285 }
1284 } 1286 }
1285 if (weekday) 1287 if (weekday)
1286 prevDate = start.addDays(weeksAhead*7 + weekday - 1); 1288 prevDate = start.addDays(weeksAhead*7 + weekday - 1);
1287 break; 1289 break;
1288 } 1290 }
1289 case rMonthlyDay: 1291 case rMonthlyDay:
1290 case rMonthlyPos: { 1292 case rMonthlyPos: {
1291 int startYear = dStart.year(); 1293 int startYear = dStart.year();
1292 int startMonth = dStart.month(); // 1..12 1294 int startMonth = dStart.month(); // 1..12
1293 int latestYear = latestDate.year(); 1295 int latestYear = latestDate.year();
1294 int monthsAhead = (latestYear - startYear)*12 + latestDate.month() - startMonth; 1296 int monthsAhead = (latestYear - startYear)*12 + latestDate.month() - startMonth;
1295 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month 1297 int notThisMonth = monthsAhead % rFreq; // zero if this month is a recurring month
1296 monthsAhead -= notThisMonth; // latest month which recurred 1298 monthsAhead -= notThisMonth; // latest month which recurred
diff --git a/microkde/kdeui/ktoolbar.cpp b/microkde/kdeui/ktoolbar.cpp
index 09ad0c8..35d4916 100644
--- a/microkde/kdeui/ktoolbar.cpp
+++ b/microkde/kdeui/ktoolbar.cpp
@@ -753,257 +753,257 @@ KToolBarButton * KToolBar::getButton (int id)
753 return 0; 753 return 0;
754//US return dynamic_cast<KToolBarButton *>( *it ); 754//US return dynamic_cast<KToolBarButton *>( *it );
755 return (KToolBarButton *)( *it ); 755 return (KToolBarButton *)( *it );
756} 756}
757 757
758 758
759void KToolBar::alignItemRight (int id, bool right ) 759void KToolBar::alignItemRight (int id, bool right )
760{ 760{
761 Id2WidgetMap::Iterator it = id2widget.find( id ); 761 Id2WidgetMap::Iterator it = id2widget.find( id );
762 if ( it == id2widget.end() ) 762 if ( it == id2widget.end() )
763 return; 763 return;
764 if ( rightAligned && !right && (*it) == rightAligned ) 764 if ( rightAligned && !right && (*it) == rightAligned )
765 rightAligned = 0; 765 rightAligned = 0;
766 if ( (*it) && right ) 766 if ( (*it) && right )
767 rightAligned = (*it); 767 rightAligned = (*it);
768} 768}
769 769
770 770
771QWidget *KToolBar::getWidget (int id) 771QWidget *KToolBar::getWidget (int id)
772{ 772{
773 Id2WidgetMap::Iterator it = id2widget.find( id ); 773 Id2WidgetMap::Iterator it = id2widget.find( id );
774 return ( it == id2widget.end() ) ? 0 : (*it); 774 return ( it == id2widget.end() ) ? 0 : (*it);
775} 775}
776 776
777 777
778void KToolBar::setItemAutoSized (int id, bool yes ) 778void KToolBar::setItemAutoSized (int id, bool yes )
779{ 779{
780 QWidget *w = getWidget(id); 780 QWidget *w = getWidget(id);
781 if ( w && yes ) 781 if ( w && yes )
782 setStretchableWidget( w ); 782 setStretchableWidget( w );
783} 783}
784 784
785 785
786void KToolBar::clear () 786void KToolBar::clear ()
787{ 787{
788 QToolBar::clear(); 788 QToolBar::clear();
789 widget2id.clear(); 789 widget2id.clear();
790 id2widget.clear(); 790 id2widget.clear();
791} 791}
792 792
793 793
794void KToolBar::removeItem(int id) 794void KToolBar::removeItem(int id)
795{ 795{
796 Id2WidgetMap::Iterator it = id2widget.find( id ); 796 Id2WidgetMap::Iterator it = id2widget.find( id );
797 if ( it == id2widget.end() ) 797 if ( it == id2widget.end() )
798 { 798 {
799 kdDebug(220) << "KToolBar::removeItem item " << id << " not found" << endl; 799 kdDebug(220) << "KToolBar::removeItem item " << id << " not found" << endl;
800 return; 800 return;
801 } 801 }
802 QWidget * w = (*it); 802 QWidget * w = (*it);
803 id2widget.remove( id ); 803 id2widget.remove( id );
804 widget2id.remove( w ); 804 widget2id.remove( w );
805 widgets.removeRef( w ); 805 widgets.removeRef( w );
806 delete w; 806 delete w;
807} 807}
808 808
809 809
810void KToolBar::removeItemDelayed(int id) 810void KToolBar::removeItemDelayed(int id)
811{ 811{
812 Id2WidgetMap::Iterator it = id2widget.find( id ); 812 Id2WidgetMap::Iterator it = id2widget.find( id );
813 if ( it == id2widget.end() ) 813 if ( it == id2widget.end() )
814 { 814 {
815 kdDebug(220) << "KToolBar::removeItem item " << id << " not found" << endl; 815 kdDebug(220) << "KToolBar::removeItem item " << id << " not found" << endl;
816 return; 816 return;
817 } 817 }
818 QWidget * w = (*it); 818 QWidget * w = (*it);
819 id2widget.remove( id ); 819 id2widget.remove( id );
820 widget2id.remove( w ); 820 widget2id.remove( w );
821 widgets.removeRef( w ); 821 widgets.removeRef( w );
822 822
823 w->blockSignals(true); 823 w->blockSignals(true);
824 d->idleButtons.append(w); 824 d->idleButtons.append(w);
825 layoutTimer->start( 50, TRUE ); 825 layoutTimer->start( 50, TRUE );
826} 826}
827 827
828 828
829void KToolBar::hideItem (int id) 829void KToolBar::hideItem (int id)
830{ 830{
831 QWidget *w = getWidget(id); 831 QWidget *w = getWidget(id);
832 if ( w ) 832 if ( w )
833 w->hide(); 833 w->hide();
834} 834}
835 835
836 836
837void KToolBar::showItem (int id) 837void KToolBar::showItem (int id)
838{ 838{
839 QWidget *w = getWidget(id); 839 QWidget *w = getWidget(id);
840 if ( w ) 840 if ( w )
841 w->show(); 841 w->show();
842} 842}
843 843
844 844
845int KToolBar::itemIndex (int id) 845int KToolBar::itemIndex (int id)
846{ 846{
847 QWidget *w = getWidget(id); 847 QWidget *w = getWidget(id);
848 return w ? widgets.findRef(w) : -1; 848 return w ? widgets.findRef(w) : -1;
849} 849}
850 850
851 851
852void KToolBar::setFullSize(bool flag ) 852void KToolBar::setFullSize(bool flag )
853{ 853{
854 setHorizontalStretchable( flag ); 854 setHorizontalStretchable( flag );
855 setVerticalStretchable( flag ); 855 setVerticalStretchable( flag );
856} 856}
857 857
858 858
859bool KToolBar::fullSize() const 859bool KToolBar::fullSize() const
860{ 860{
861 return isHorizontalStretchable() || isVerticalStretchable(); 861 return isHorizontalStretchable() || isVerticalStretchable();
862} 862}
863 863
864 864
865void KToolBar::enableMoving(bool flag ) 865void KToolBar::enableMoving(bool flag )
866{ 866{
867//US setMovingEnabled(flag); 867//US setMovingEnabled(flag);
868 this->mainWindow()->setToolBarsMovable(flag); 868 this->mainWindow()->setToolBarsMovable(flag);
869} 869}
870 870
871 871
872void KToolBar::setBarPos (BarPosition bpos) 872void KToolBar::setBarPos (BarPosition bpos)
873{ 873{
874 if ( !mainWindow() ) 874 if ( !mainWindow() )
875 return; 875 return;
876//US mainWindow()->moveDockWindow( this, (Dock)bpos ); 876//US mainWindow()->moveDockWindow( this, (Dock)bpos );
877 mainWindow()->moveToolBar( this, (QMainWindow::ToolBarDock)bpos ); 877 mainWindow()->moveToolBar( this, (QMainWindow::ToolBarDock)bpos );
878} 878}
879 879
880 880
881KToolBar::BarPosition KToolBar::barPos() const 881const KToolBar::BarPosition KToolBar::barPos()
882{ 882{
883 if ( !(QMainWindow*)mainWindow() ) 883 if ( !(QMainWindow*)mainWindow() )
884 return KToolBar::Top; 884 return KToolBar::Top;
885//US Dock dock; 885//US Dock dock;
886 QMainWindow::ToolBarDock dock; 886 QMainWindow::ToolBarDock dock;
887 int dm1, dm2; 887 int dm1, dm2;
888 bool dm3; 888 bool dm3;
889 ((QMainWindow*)mainWindow())->getLocation( (QToolBar*)this, dock, dm1, dm3, dm2 ); 889 ((QMainWindow*)mainWindow())->getLocation( (QToolBar*)this, dock, dm1, dm3, dm2 );
890//US if ( dock == DockUnmanaged ) { 890//US if ( dock == DockUnmanaged ) {
891 if ( dock == QMainWindow::Unmanaged ) { 891 if ( dock == QMainWindow::Unmanaged ) {
892 return (KToolBar::BarPosition)Top; 892 return (KToolBar::BarPosition)Top;
893 } 893 }
894 return (BarPosition)dock; 894 return (BarPosition)dock;
895} 895}
896 896
897 897
898bool KToolBar::enable(BarStatus stat) 898bool KToolBar::enable(BarStatus stat)
899{ 899{
900 bool mystat = isVisible(); 900 bool mystat = isVisible();
901 901
902 if ( (stat == Toggle && mystat) || stat == Hide ) 902 if ( (stat == Toggle && mystat) || stat == Hide )
903 hide(); 903 hide();
904 else 904 else
905 show(); 905 show();
906 906
907 return isVisible() == mystat; 907 return isVisible() == mystat;
908} 908}
909 909
910 910
911void KToolBar::setMaxHeight ( int h ) 911void KToolBar::setMaxHeight ( int h )
912{ 912{
913 setMaximumHeight( h ); 913 setMaximumHeight( h );
914} 914}
915 915
916int KToolBar::maxHeight() 916int KToolBar::maxHeight()
917{ 917{
918 return maximumHeight(); 918 return maximumHeight();
919} 919}
920 920
921 921
922void KToolBar::setMaxWidth (int dw) 922void KToolBar::setMaxWidth (int dw)
923{ 923{
924 setMaximumWidth( dw ); 924 setMaximumWidth( dw );
925} 925}
926 926
927 927
928int KToolBar::maxWidth() 928int KToolBar::maxWidth()
929{ 929{
930 return maximumWidth(); 930 return maximumWidth();
931} 931}
932 932
933 933
934void KToolBar::setTitle (const QString& _title) 934void KToolBar::setTitle (const QString& _title)
935{ 935{
936 setLabel( _title ); 936 setLabel( _title );
937} 937}
938 938
939 939
940void KToolBar::enableFloating (bool ) 940void KToolBar::enableFloating (bool )
941{ 941{
942} 942}
943 943
944 944
945void KToolBar::setIconText(IconText it) 945void KToolBar::setIconText(IconText it)
946{ 946{
947 setIconText( it, true ); 947 setIconText( it, true );
948} 948}
949 949
950 950
951void KToolBar::setIconText(IconText icontext, bool update) 951void KToolBar::setIconText(IconText icontext, bool update)
952{ 952{
953 bool doUpdate=false; 953 bool doUpdate=false;
954 954
955 if (icontext != d->m_iconText) { 955 if (icontext != d->m_iconText) {
956 d->m_iconText = icontext; 956 d->m_iconText = icontext;
957 doUpdate=true; 957 doUpdate=true;
958 } 958 }
959 959
960 if (update == false) 960 if (update == false)
961 return; 961 return;
962 962
963 if (doUpdate) 963 if (doUpdate)
964 emit modechange(); // tell buttons what happened 964 emit modechange(); // tell buttons what happened
965 965
966 // ugly hack to force a QMainWindow::triggerLayout( TRUE ) 966 // ugly hack to force a QMainWindow::triggerLayout( TRUE )
967 if ( mainWindow() ) { 967 if ( mainWindow() ) {
968 QMainWindow *mw = mainWindow(); 968 QMainWindow *mw = mainWindow();
969 mw->setUpdatesEnabled( FALSE ); 969 mw->setUpdatesEnabled( FALSE );
970 mw->setToolBarsMovable( !mw->toolBarsMovable() ); 970 mw->setToolBarsMovable( !mw->toolBarsMovable() );
971 mw->setToolBarsMovable( !mw->toolBarsMovable() ); 971 mw->setToolBarsMovable( !mw->toolBarsMovable() );
972 mw->setUpdatesEnabled( TRUE ); 972 mw->setUpdatesEnabled( TRUE );
973 } 973 }
974} 974}
975 975
976 976
977KToolBar::IconText KToolBar::iconText() const 977KToolBar::IconText KToolBar::iconText() const
978{ 978{
979 return d->m_iconText; 979 return d->m_iconText;
980} 980}
981 981
982 982
983void KToolBar::setIconSize(int size) 983void KToolBar::setIconSize(int size)
984{ 984{
985 setIconSize( size, true ); 985 setIconSize( size, true );
986} 986}
987 987
988void KToolBar::setIconSize(int size, bool update) 988void KToolBar::setIconSize(int size, bool update)
989{ 989{
990 bool doUpdate=false; 990 bool doUpdate=false;
991 991
992 if ( size != d->m_iconSize ) { 992 if ( size != d->m_iconSize ) {
993 d->m_iconSize = size; 993 d->m_iconSize = size;
994 doUpdate=true; 994 doUpdate=true;
995 } 995 }
996 996
997 if (update == false) 997 if (update == false)
998 return; 998 return;
999 999
1000 if (doUpdate) 1000 if (doUpdate)
1001 emit modechange(); // tell buttons what happened 1001 emit modechange(); // tell buttons what happened
1002 1002
1003 // ugly hack to force a QMainWindow::triggerLayout( TRUE ) 1003 // ugly hack to force a QMainWindow::triggerLayout( TRUE )
1004 if ( mainWindow() ) { 1004 if ( mainWindow() ) {
1005 QMainWindow *mw = mainWindow(); 1005 QMainWindow *mw = mainWindow();
1006 mw->setUpdatesEnabled( FALSE ); 1006 mw->setUpdatesEnabled( FALSE );
1007 mw->setToolBarsMovable( !mw->toolBarsMovable() ); 1007 mw->setToolBarsMovable( !mw->toolBarsMovable() );
1008 mw->setToolBarsMovable( !mw->toolBarsMovable() ); 1008 mw->setToolBarsMovable( !mw->toolBarsMovable() );
1009 mw->setUpdatesEnabled( TRUE ); 1009 mw->setUpdatesEnabled( TRUE );
diff --git a/microkde/kdeui/ktoolbar.h b/microkde/kdeui/ktoolbar.h
index 49ff856..7a5c114 100644
--- a/microkde/kdeui/ktoolbar.h
+++ b/microkde/kdeui/ktoolbar.h
@@ -621,257 +621,257 @@ public:
621 * as @ref QLineEdit plus completion signals. 621 * as @ref QLineEdit plus completion signals.
622 */ 622 */
623 KLineEdit * getLined (int id); 623 KLineEdit * getLined (int id);
624 624
625 /** 625 /**
626 * Returns a pointer to KToolBarButton. 626 * Returns a pointer to KToolBarButton.
627 * 627 *
628 * Example: 628 * Example:
629 * <pre> 629 * <pre>
630 * KToolBarButton * button = toolbar->getButton(button_id); 630 * KToolBarButton * button = toolbar->getButton(button_id);
631 * </pre> 631 * </pre>
632 * That way you can get access to other public methods 632 * That way you can get access to other public methods
633 * that @ref KToolBarButton provides. 633 * that @ref KToolBarButton provides.
634 * 634 *
635 * Using this method is not recommended. 635 * Using this method is not recommended.
636 */ 636 */
637 KToolBarButton * getButton (int id); 637 KToolBarButton * getButton (int id);
638 638
639 /** 639 /**
640 * Align item to the right. 640 * Align item to the right.
641 * 641 *
642 * This works only if toolbar is set to full width. 642 * This works only if toolbar is set to full width.
643 * @see setFullWidth() 643 * @see setFullWidth()
644 */ 644 */
645 void alignItemRight (int id, bool right = true); 645 void alignItemRight (int id, bool right = true);
646 646
647 /** 647 /**
648 * Returns a pointer to an inserted widget. 648 * Returns a pointer to an inserted widget.
649 * 649 *
650 * Wrong ids are not tested. 650 * Wrong ids are not tested.
651 * You can do with this whatever you want, 651 * You can do with this whatever you want,
652 * except change its height (hardcoded). If you change its width 652 * except change its height (hardcoded). If you change its width
653 * you will probably have to call QToolBar::updateRects(true) 653 * you will probably have to call QToolBar::updateRects(true)
654 * @see QWidget 654 * @see QWidget
655 * @see updateRects() 655 * @see updateRects()
656 * 656 *
657 * KDE4: make this const! 657 * KDE4: make this const!
658 */ 658 */
659 QWidget *getWidget (int id); 659 QWidget *getWidget (int id);
660 660
661 /** 661 /**
662 * Set item autosized. 662 * Set item autosized.
663 * 663 *
664 * This works only if the toolbar is set to full width. 664 * This works only if the toolbar is set to full width.
665 * Only @p one item can be autosized, and it has to be 665 * Only @p one item can be autosized, and it has to be
666 * the last left-aligned item. Items that come after this must be right 666 * the last left-aligned item. Items that come after this must be right
667 * aligned. Items that can be right aligned are Lineds, Frames, Widgets and 667 * aligned. Items that can be right aligned are Lineds, Frames, Widgets and
668 * Combos. An autosized item will resize itself whenever the toolbar geometry 668 * Combos. An autosized item will resize itself whenever the toolbar geometry
669 * changes to the last right-aligned item (or to end of toolbar if there 669 * changes to the last right-aligned item (or to end of toolbar if there
670 * are no right-aligned items.) 670 * are no right-aligned items.)
671 * @see setFullWidth() 671 * @see setFullWidth()
672 * @see alignItemRight() 672 * @see alignItemRight()
673 */ 673 */
674 void setItemAutoSized (int id, bool yes = true); 674 void setItemAutoSized (int id, bool yes = true);
675 675
676 /** 676 /**
677 * Remove all items. 677 * Remove all items.
678 * 678 *
679 * The toolbar is redrawn after it. 679 * The toolbar is redrawn after it.
680 */ 680 */
681 void clear (); 681 void clear ();
682 682
683 /** 683 /**
684 * Remove item @p id. 684 * Remove item @p id.
685 * 685 *
686 * Item is deleted. Toolbar is redrawn after it. 686 * Item is deleted. Toolbar is redrawn after it.
687 */ 687 */
688 void removeItem (int id); 688 void removeItem (int id);
689 689
690 /** 690 /**
691 * Remove item @p id. 691 * Remove item @p id.
692 * 692 *
693 * Item is deleted when toolbar is redrawn. 693 * Item is deleted when toolbar is redrawn.
694 */ 694 */
695 void removeItemDelayed (int id); 695 void removeItemDelayed (int id);
696 696
697 /** 697 /**
698 * Hide item. 698 * Hide item.
699 */ 699 */
700 void hideItem (int id); 700 void hideItem (int id);
701 701
702 /** 702 /**
703 * Show item. 703 * Show item.
704 */ 704 */
705 void showItem (int id); 705 void showItem (int id);
706 706
707 /** 707 /**
708 * Returns the index of the given item. 708 * Returns the index of the given item.
709 * 709 *
710 * KDE4: make this const! 710 * KDE4: make this const!
711 */ 711 */
712 int itemIndex (int id); 712 int itemIndex (int id);
713 713
714 /** 714 /**
715 * Set toolbar to full parent size (default). 715 * Set toolbar to full parent size (default).
716 * 716 *
717 * In full size mode the bar 717 * In full size mode the bar
718 * extends over the parent's full width or height. If the mode is disabled 718 * extends over the parent's full width or height. If the mode is disabled
719 * the toolbar tries to take as much space as it needs without wrapping, but 719 * the toolbar tries to take as much space as it needs without wrapping, but
720 * it does not exceed the parent box. You can force a certain width or 720 * it does not exceed the parent box. You can force a certain width or
721 * height with @ref setMaxWidth() or @ref setMaxHeight(). 721 * height with @ref setMaxWidth() or @ref setMaxHeight().
722 * 722 *
723 * If you want to use right-aligned items or auto-sized items you must use 723 * If you want to use right-aligned items or auto-sized items you must use
724 * full size mode. 724 * full size mode.
725 */ 725 */
726 void setFullSize(bool flag = true); 726 void setFullSize(bool flag = true);
727 727
728 /** 728 /**
729 * @return @p true if the full-size mode is enabled. Otherwise 729 * @return @p true if the full-size mode is enabled. Otherwise
730 * it returns @false. 730 * it returns @false.
731 */ 731 */
732 bool fullSize() const; 732 bool fullSize() const;
733 733
734 /** 734 /**
735 * @deprecated use setMovingEnabled(bool) instead. 735 * @deprecated use setMovingEnabled(bool) instead.
736 * Enable or disable moving of toolbar. 736 * Enable or disable moving of toolbar.
737 */ 737 */
738 void enableMoving(bool flag = true); 738 void enableMoving(bool flag = true);
739 739
740 /** 740 /**
741 * Set position of toolbar. 741 * Set position of toolbar.
742 * @see BarPosition() 742 * @see BarPosition()
743 */ 743 */
744 void setBarPos (BarPosition bpos); 744 void setBarPos (BarPosition bpos);
745 745
746 /** 746 /**
747 * Returns position of toolbar. 747 * Returns position of toolbar.
748 */ 748 */
749 BarPosition barPos() const; 749 const BarPosition barPos();
750 750
751 /** 751 /**
752 * @deprecated 752 * @deprecated
753 * Show, hide, or toggle toolbar. 753 * Show, hide, or toggle toolbar.
754 * 754 *
755 * This method is provided for compatibility only, 755 * This method is provided for compatibility only,
756 * please use show() and/or hide() instead. 756 * please use show() and/or hide() instead.
757 * @see BarStatus 757 * @see BarStatus
758 */ 758 */
759 bool enable(BarStatus stat); 759 bool enable(BarStatus stat);
760 760
761 /** 761 /**
762 * @deprecated 762 * @deprecated
763 * Use setMaximumHeight() instead. 763 * Use setMaximumHeight() instead.
764 */ 764 */
765 void setMaxHeight (int h); // Set max height for vertical toolbars 765 void setMaxHeight (int h); // Set max height for vertical toolbars
766 766
767 /** 767 /**
768 * @deprecated 768 * @deprecated
769 * Use maximumHeight() instead. 769 * Use maximumHeight() instead.
770 * Returns the value that was set with @ref setMaxHeight(). 770 * Returns the value that was set with @ref setMaxHeight().
771 */ 771 */
772 int maxHeight(); 772 int maxHeight();
773 773
774 /** 774 /**
775 * @deprecated 775 * @deprecated
776 * Use setMaximumWidth() instead. 776 * Use setMaximumWidth() instead.
777 * Set maximal width of horizontal (top or bottom) toolbar. 777 * Set maximal width of horizontal (top or bottom) toolbar.
778 */ 778 */
779 void setMaxWidth (int dw); 779 void setMaxWidth (int dw);
780 780
781 /** 781 /**
782 * @deprecated 782 * @deprecated
783 * Use maximumWidth() instead. 783 * Use maximumWidth() instead.
784 * Returns the value that was set with @ref setMaxWidth(). 784 * Returns the value that was set with @ref setMaxWidth().
785 */ 785 */
786 int maxWidth(); 786 int maxWidth();
787 787
788 /** 788 /**
789 * Set title for toolbar when it floats. 789 * Set title for toolbar when it floats.
790 * 790 *
791 * Titles are however not (yet) 791 * Titles are however not (yet)
792 * visible. You can't change toolbar's title while it's floating. 792 * visible. You can't change toolbar's title while it's floating.
793 */ 793 */
794 void setTitle (const QString& _title); 794 void setTitle (const QString& _title);
795 795
796 /** 796 /**
797 * @deprecated 797 * @deprecated
798 * Use enableMoving() instead. 798 * Use enableMoving() instead.
799 */ 799 */
800 void enableFloating (bool arrrrrrgh); 800 void enableFloating (bool arrrrrrgh);
801 801
802 /** 802 /**
803 * Set the kind of painting for buttons. 803 * Set the kind of painting for buttons.
804 * 804 *
805 * Choose from: 805 * Choose from:
806 * @li IconOnly (only icons), 806 * @li IconOnly (only icons),
807 * @li IconTextRight (icon and text, text is left from icons), 807 * @li IconTextRight (icon and text, text is left from icons),
808 * @li TextOnly (only text), 808 * @li TextOnly (only text),
809 * @li IconTextBottom (icons and text, text is under icons). 809 * @li IconTextBottom (icons and text, text is under icons).
810 * @see IconText 810 * @see IconText
811 * 811 *
812 */ 812 */
813 void setIconText(IconText it); 813 void setIconText(IconText it);
814 // Note: don't merge with the next one, it breaks Qt properties 814 // Note: don't merge with the next one, it breaks Qt properties
815 815
816 /** 816 /**
817 * Similar to @ref setIconText(IconText it) but allows you to 817 * Similar to @ref setIconText(IconText it) but allows you to
818 * disable or enable updating. If @p update is false, then the 818 * disable or enable updating. If @p update is false, then the
819 * buttons will not be updated. This is useful only if you know 819 * buttons will not be updated. This is useful only if you know
820 * that you will be forcing an update later. 820 * that you will be forcing an update later.
821 */ 821 */
822 void setIconText(IconText it, bool update); 822 void setIconText(IconText it, bool update);
823 823
824 /** 824 /**
825 * @return The current text style for buttons. 825 * @return The current text style for buttons.
826 */ 826 */
827 IconText iconText() const; 827 IconText iconText() const;
828 828
829 /** 829 /**
830 * Set the icon size to load. Usually you should not call 830 * Set the icon size to load. Usually you should not call
831 * this, the icon size is taken care of by KIconLoader 831 * this, the icon size is taken care of by KIconLoader
832 * and globally configured. 832 * and globally configured.
833 * By default, the toolbar will load icons of size 32 for main 833 * By default, the toolbar will load icons of size 32 for main
834 * toolbars and 22 for other toolbars 834 * toolbars and 22 for other toolbars
835 * @see KIconLoader. 835 * @see KIconLoader.
836 * 836 *
837 * @param size The size to use 837 * @param size The size to use
838 */ 838 */
839 void setIconSize(int size); 839 void setIconSize(int size);
840 // Note: don't merge with the next one, it breaks Qt properties 840 // Note: don't merge with the next one, it breaks Qt properties
841 841
842 /** 842 /**
843 * Same as @ref setIconText(int size) but allows you 843 * Same as @ref setIconText(int size) but allows you
844 * to disable the toolbar update. 844 * to disable the toolbar update.
845 * 845 *
846 * @param size The size to use 846 * @param size The size to use
847 * @param update If true, then the toolbar will be updated after 847 * @param update If true, then the toolbar will be updated after
848 * this 848 * this
849 */ 849 */
850 void setIconSize(int size, bool update); 850 void setIconSize(int size, bool update);
851 851
852 /** 852 /**
853 * @return The current icon size for buttons. 853 * @return The current icon size for buttons.
854 */ 854 */
855 int iconSize() const; 855 int iconSize() const;
856 856
857 /** 857 /**
858 * This allows you to enable or disable the context menu. 858 * This allows you to enable or disable the context menu.
859 * 859 *
860 * @param enable If false, then the context menu will be disabled 860 * @param enable If false, then the context menu will be disabled
861 */ 861 */
862 void setEnableContextMenu(bool enable = true); 862 void setEnableContextMenu(bool enable = true);
863 863
864 /** 864 /**
865 * Returns whether or not the context menu is disabled 865 * Returns whether or not the context menu is disabled
866 * 866 *
867 * @return The context menu state 867 * @return The context menu state
868 */ 868 */
869 bool contextMenuEnabled() const; 869 bool contextMenuEnabled() const;
870 870
871 /** 871 /**
872 * This will inform a toolbar button to ignore certain style 872 * This will inform a toolbar button to ignore certain style
873 * changes. Specifically, it will ignore IconText (always IconOnly) 873 * changes. Specifically, it will ignore IconText (always IconOnly)
874 * and will not allow image effects to apply. 874 * and will not allow image effects to apply.
875 * 875 *
876 * @param id The button to exclude from styles 876 * @param id The button to exclude from styles
877 * @param no_style If true, then it is excluded (default: true). 877 * @param no_style If true, then it is excluded (default: true).