31#include <tqdatetimeedit.h>
32#include <tqcheckbox.h>
33#include <tqlineedit.h>
34#include <tqbuttongroup.h>
38#include <kcalendarsystem.h>
42#include <libkcal/incidenceformatter.h>
44#include "calprintdefaultplugins.h"
46#include "calprintincidenceconfig_base.h"
47#include "calprintdayconfig_base.h"
48#include "calprintweetdeconfig_base.h"
49#include "calprintmonthconfig_base.h"
50#include "calprinttodoconfig_base.h"
52static TQString cleanString(
const TQString &instr )
55 return ret.replace(
'\n',
' ' );
66CalPrintIncidence::~CalPrintIncidence()
70TQWidget *CalPrintIncidence::createConfigWidget( TQWidget *w )
72 return new CalPrintIncidenceConfig_Base( w );
77 CalPrintIncidenceConfig_Base *cfg =
78 dynamic_cast<CalPrintIncidenceConfig_Base*
>( mConfigWidget );
80 mUseColors = cfg->mColors->isChecked();
81 mShowOptions = cfg->mShowDetails->isChecked();
82 mShowSubitemsNotes = cfg->mShowSubitemsNotes->isChecked();
83 mShowAttendees = cfg->mShowAttendees->isChecked();
84 mShowAttachments = cfg->mShowAttachments->isChecked();
90 CalPrintIncidenceConfig_Base *cfg =
91 dynamic_cast<CalPrintIncidenceConfig_Base*
>( mConfigWidget );
93 cfg->mColors->setChecked( mUseColors );
94 cfg->mShowDetails->setChecked(mShowOptions);
95 cfg->mShowSubitemsNotes->setChecked(mShowSubitemsNotes);
96 cfg->mShowAttendees->setChecked(mShowAttendees);
97 cfg->mShowAttachments->setChecked(mShowAttachments);
104 mUseColors = mConfig->readBoolEntry(
"Use Colors",
false );
105 mShowOptions = mConfig->readBoolEntry(
"Show Options",
false );
106 mShowSubitemsNotes = mConfig->readBoolEntry(
"Show Subitems and Notes",
false );
107 mShowAttendees = mConfig->readBoolEntry(
"Use Attendees",
false );
108 mShowAttachments = mConfig->readBoolEntry(
"Use Attachments",
false );
117 mConfig->writeEntry(
"Use Colors", mUseColors );
118 mConfig->writeEntry(
"Show Options", mShowOptions );
119 mConfig->writeEntry(
"Show Subitems and Notes", mShowSubitemsNotes );
120 mConfig->writeEntry(
"Use Attendees", mShowAttendees );
121 mConfig->writeEntry(
"Use Attachments", mShowAttachments );
129 TimePrintStringsVisitor() {}
131 bool act( IncidenceBase *incidence )
133 return incidence->
accept( *
this );
135 TQString mStartCaption, mStartString;
136 TQString mEndCaption, mEndString;
137 TQString mDurationCaption, mDurationString;
140 bool visit( Event *event ) {
141 if ( event->
dtStart().isValid() ) {
142 mStartCaption = i18n(
"Start date: " );
143 mStartString = IncidenceFormatter::dateTimeToString(
146 mStartCaption = i18n(
"No start date" );
147 mStartString = TQString();
151 mEndCaption = i18n(
"End date: " );
152 mEndString = IncidenceFormatter::dateTimeToString(
154 }
else if ( event->hasDuration() ) {
155 mEndCaption = i18n(
"Duration: ");
156 int mins =
event->duration() / 60;
158 mEndString += i18n(
"1 hour ",
"%n hours ", mins/60 );
161 mEndString += i18n(
"1 minute ",
"%n minutes ", mins%60 );
164 mEndCaption = i18n(
"No end date");
165 mEndString = TQString();
169 bool visit( Todo *todo ) {
171 mStartCaption = i18n(
"Start date: " );
172 mStartString = IncidenceFormatter::dateTimeToString(
175 mStartCaption = i18n(
"No start date" );
176 mStartString = TQString();
180 mEndCaption = i18n(
"Due date: " );
181 mEndString = IncidenceFormatter::dateTimeToString(
184 mEndCaption = i18n(
"No due date");
185 mEndString = TQString();
189 bool visit( Journal *journal ) {
190 mStartCaption = i18n(
"Start date: " );
191 mStartString = IncidenceFormatter::dateTimeToString(
193 mEndCaption = TQString();
194 mEndString = TQString();
199int CalPrintIncidence::printCaptionAndText( TQPainter &p,
const TQRect &box,
const TQString &caption,
const TQString &text, TQFont captionFont, TQFont textFont )
201 TQFontMetrics captionFM( captionFont );
202 int textWd = captionFM.width( caption );
203 TQRect textRect( box );
205 TQFont oldFont( p.font() );
206 p.setFont( captionFont );
207 p.drawText( box, TQt::AlignLeft|TQt::AlignTop|TQt::SingleLine, caption );
209 if ( !text.isEmpty() ) {
210 textRect.setLeft( textRect.left() + textWd );
211 p.setFont( textFont );
212 p.drawText( textRect, TQt::AlignLeft|TQt::AlignTop|TQt::SingleLine, text );
214 p.setFont( oldFont );
215 return textRect.bottom();
218#include <tqfontdatabase.h>
219void CalPrintIncidence::print( TQPainter &p,
int width,
int height )
221 TQFont oldFont(p.font());
222 TQFont textFont(
"sans-serif", 11, TQFont::Normal );
223 TQFont captionFont(
"sans-serif", 11, TQFont::Bold );
224 p.setFont( textFont );
225 int lineHeight = p.fontMetrics().lineSpacing();
229 Incidence::List::ConstIterator it;
230 for ( it=mSelectedIncidences.begin(); it!=mSelectedIncidences.end(); ++it ) {
232 if ( !(*it) )
continue;
233 if ( it != mSelectedIncidences.begin() )
mPrinter->newPage();
266 TQRect box( 0, 0, width, height );
267 TQRect titleBox( box );
270 int titleBottom =
drawHeader( p, (*it)->summary(), TQDate(), TQDate(), titleBox,
true );
271 titleBox.setBottom( titleBottom );
273 TQRect timesBox( titleBox );
274 timesBox.setTop( titleBox.bottom() + padding() );
275 timesBox.setHeight( height / 8 );
277 TimePrintStringsVisitor stringVis;
278 int h = timesBox.top();
279 if ( stringVis.act(*it) ) {
280 TQRect textRect( timesBox.left()+padding(), timesBox.top()+padding(), 0, lineHeight );
281 textRect.setRight( timesBox.center().x() );
282 h = printCaptionAndText( p, textRect, stringVis.mStartCaption, stringVis.mStartString, captionFont, textFont );
284 textRect.setLeft( textRect.right() );
285 textRect.setRight( timesBox.right() - padding() );
286 h = TQMAX( printCaptionAndText( p, textRect, stringVis.mEndCaption, stringVis.mEndString, captionFont, textFont ), h );
290 if ( (*it)->doesRecur() ) {
291 TQRect recurBox( timesBox.left()+padding(), h+padding(), timesBox.right()-padding(), lineHeight );
292 KCal::Recurrence *recurs = (*it)->recurrence();
294 TQString displayString = IncidenceFormatter::recurrenceString((*it));
296 TQString exceptString;
297 if ( !recurs->exDates().isEmpty() ) {
298 exceptString = i18n(
"except for listed dates",
" except");
299 for ( uint i = 0; i < recurs->exDates().size(); i++ ) {
300 exceptString.append(
" ");
301 exceptString.append( TDEGlobal::locale()->formatDate(recurs->exDates()[i],
305 displayString.append(exceptString);
306 h = TQMAX( printCaptionAndText( p, recurBox, i18n(
"Repeats: "), displayString, captionFont, textFont ), h );
310 TQRect alarmBox( timesBox.left()+padding(), h+padding(), timesBox.right()-padding(), lineHeight );
311 Alarm::List alarms = (*it)->alarms();
312 if ( alarms.count() == 0 ) {
313 cap = i18n(
"No reminders");
316 cap = i18n(
"Reminder: ",
"%n reminders: ", alarms.count() );
318 TQStringList alarmStrings;
319 KCal::Alarm::List::ConstIterator it;
320 for ( it = alarms.begin(); it != alarms.end(); ++it ) {
329 offsetstr = i18n(
"N days/hours/minutes before/after the start/end",
"%1 before the start");
332 offsetstr = i18n(
"N days/hours/minutes before/after the start/end",
"%1 after the start");
337 offsetstr = i18n(
"N days/hours/minutes before/after the start/end",
"%1 before the end");
340 offsetstr = i18n(
"N days/hours/minutes before/after the start/end",
"%1 after the end");
344 offset = offset / 60;
345 int useoffset = offset;
347 if ( offset % (24*60) == 0 && offset>0 ) {
348 useoffset = offset / (24*60);
349 offsetstr = offsetstr.arg( i18n(
"1 day",
"%n days", useoffset ) );
350 }
else if (offset % 60 == 0 && offset>0 ) {
351 useoffset = offset / 60;
352 offsetstr = offsetstr.arg( i18n(
"1 hour",
"%n hours", useoffset ) );
355 offsetstr = offsetstr.arg( i18n(
"1 minute",
"%n minutes", useoffset ) );
357 alarmStrings << offsetstr;
359 txt = alarmStrings.join( i18n(
"Spacer for the joined list of categories",
", ") );
362 h = TQMAX( printCaptionAndText( p, alarmBox, cap, txt, captionFont, textFont ), h );
365 TQRect organizerBox( timesBox.left()+padding(), h+padding(), timesBox.right()-padding(), lineHeight );
366 h = TQMAX( printCaptionAndText( p, organizerBox, i18n(
"Organizer: "), (*it)->organizer().fullName(), captionFont, textFont ), h );
369 timesBox.setBottom( TQMAX( timesBox.bottom(), h+padding() ) );
370 drawBox( p, BOX_BORDER_WIDTH, timesBox );
373 TQRect locationBox( timesBox );
374 locationBox.setTop( timesBox.bottom() + padding() );
375 locationBox.setHeight( 0 );
377 (*it)->location(),
true,
true, captionFont, textFont );
378 locationBox.setBottom( locationBottom );
382 TQRect footerBox( locationBox );
383 footerBox.setBottom( box.bottom() );
384 footerBox.setTop( footerBox.bottom() - lineHeight - 2*padding() );
386 TQRect categoriesBox( footerBox );
387 categoriesBox.setBottom( footerBox.top() );
388 categoriesBox.setTop( categoriesBox.bottom() - lineHeight - 2*padding() );
390 TQRect attendeesBox( box.left(), categoriesBox.top()-padding()-box.height()/9, box.width(), box.height()/9 );
392 TQRect attachmentsBox( box.left(), attendeesBox.top()-padding()-box.height()/9, box.width()*3/4 - padding(), box.height()/9 );
393 TQRect optionsBox( attachmentsBox.right() + padding(), attachmentsBox.top(), 0, 0 );
394 optionsBox.setRight( box.right() );
395 optionsBox.setBottom( attachmentsBox.bottom() );
396 TQRect notesBox( optionsBox.left(), locationBox.bottom() + padding(), optionsBox.width(), 0 );
397 notesBox.setBottom( optionsBox.top() - padding() );
399 TQRect descriptionBox( notesBox );
400 descriptionBox.setLeft( box.left() );
401 descriptionBox.setRight( attachmentsBox.right() );
403 if (!mShowSubitemsNotes) {
404 descriptionBox.setRight( box.right() );
406 if (!mShowAttachments || !mShowAttendees) {
407 descriptionBox.setBottom( attachmentsBox.bottom() );
408 optionsBox.setTop( attendeesBox.top() );
409 optionsBox.setBottom( attendeesBox.bottom() );
410 notesBox.setBottom( attachmentsBox.bottom() );
412 attendeesBox.setRight( attachmentsBox.right() );
414 if (!mShowAttachments && !mShowAttendees) {
415 if (mShowSubitemsNotes) {
416 descriptionBox.setBottom( attendeesBox.bottom() );
419 descriptionBox.setBottom( attendeesBox.bottom() );
420 notesBox.setBottom( attendeesBox.bottom() );
424 if (mShowAttachments) {
426 attachmentsBox.setRight( box.right() );
427 attachmentsBox.setRight( box.right() );
429 if (!mShowAttendees) {
430 attachmentsBox.setTop( attendeesBox.top() );
431 attachmentsBox.setBottom( attendeesBox.bottom() );
436 (*it)->description(),
false,
437 false, captionFont, textFont );
439 if ( mShowSubitemsNotes ) {
440 if ( (*it)->relations().isEmpty() || (*it)->type() !=
"Todo" ) {
442 TQString(),
false,
false,
443 captionFont, textFont );
444 TQPen oldPen( p.pen() );
445 p.setPen( TQt::DotLine );
446 while ( (notesPosition +=
int(1.5*lineHeight)) < notesBox.bottom() ) {
447 p.drawLine( notesBox.left()+padding(), notesPosition, notesBox.right()-padding(), notesPosition );
451 Incidence::List relations = (*it)->relations();
452 TQString subitemCaption;
453 if ( relations.count() == 0 ) {
454 subitemCaption = i18n(
"No Subitems" );
457 subitemCaption = i18n(
"1 Subitem:",
461 Incidence::List::ConstIterator rit;
462 TQString subitemString;
463 TQString statusString;
464 TQString datesString;
466 for ( rit = relations.begin(); rit != relations.end(); ++rit ) {
472 statusString = (*rit)->statusStr();
473 if ( statusString.isEmpty() ) {
474 if ( (*rit)->status() == Incidence::StatusNone ) {
475 statusString = i18n(
"no status",
"none" );
477 statusString = i18n(
"unknown status",
"unknown" );
482 if ( (*rit)->dtStart().isValid() ) {
484 "Start Date: %1\n").arg(
485 TDEGlobal::locale()->formatDate( (*rit)->dtStart().date(),
487 if ( !(*rit)->doesFloat() ) {
489 "Start Time: %1\n").arg(
490 TDEGlobal::locale()->formatTime((*rit)->dtStart().time(),
494 if ( (*rit)->dtEnd().isValid() ) {
495 subitemString += i18n(
496 "Due Date: %1\n").arg(
497 TDEGlobal::locale()->formatDate( (*rit)->dtEnd().date(),
499 if ( !(*rit)->doesFloat() ) {
500 subitemString += i18n(
501 "subitem due time",
"Due Time: %1\n").arg(
502 TDEGlobal::locale()->formatTime((*rit)->dtEnd().time(),
506 subitemString += i18n(
"subitem counter",
"%1: ", count);
507 subitemString += (*rit)->summary();
508 subitemString +=
"\n";
509 if ( !datesString.isEmpty() ) {
510 subitemString += datesString;
511 subitemString +=
"\n";
513 subitemString += i18n(
"subitem Status: statusString",
514 "Status: %1\n").arg( statusString );
515 subitemString += IncidenceFormatter::recurrenceString((*rit)) +
"\n";
516 subitemString += i18n(
"subitem Priority: N",
517 "Priority: %1\n").arg( (*rit)->priority() );
518 subitemString += i18n(
"subitem Secrecy: secrecyString",
519 "Secrecy: %1\n").arg( (*rit)->secrecyStr() );
520 subitemString +=
"\n";
523 (*it)->description(),
false,
524 false, captionFont, textFont );
528 if ( mShowAttachments ) {
529 Attachment::List attachments = (*it)->attachments();
530 TQString attachmentCaption;
531 if ( attachments.count() == 0 ) {
532 attachmentCaption = i18n(
"No Attachments" );
535 attachmentCaption = i18n(
"1 Attachment:",
"%1 Attachments:", attachments.count() );
537 TQString attachmentString;
538 Attachment::List::ConstIterator ait = attachments.begin();
539 for ( ; ait != attachments.end(); ++ait ) {
540 if (!attachmentString.isEmpty()) {
541 attachmentString += i18n(
"Spacer for list of attachments",
" " );
543 attachmentString.append((*ait)->label());
546 attachmentCaption, attachmentString,
548 captionFont, textFont );
551 if ( mShowAttendees ) {
552 Attendee::List attendees = (*it)->attendees();
553 TQString attendeeCaption;
554 if ( attendees.count() == 0 )
555 attendeeCaption = i18n(
"No Attendees");
557 attendeeCaption = i18n(
"1 Attendee:",
"%n Attendees:", attendees.count() );
558 TQString attendeeString;
559 for ( Attendee::List::ConstIterator ait = attendees.begin(); ait != attendees.end(); ++ait ) {
560 if ( !attendeeString.isEmpty() ) attendeeString +=
"\n";
561 attendeeString += i18n(
"Formatting of an attendee: "
562 "'Name (Role): Status', e.g. 'Reinhold Kainhofer "
563 "<reinhold@kainhofer.com> (Participant): Awaiting Response'",
565 .arg( (*ait)->fullName() )
566 .arg( (*ait)->roleStr() ).arg( (*ait)->statusStr() );
569 false,
false, captionFont, textFont );
572 if ( mShowOptions ) {
573 TQString optionsString;
574 if ( !(*it)->statusStr().isEmpty() ) {
575 optionsString += i18n(
"Status: %1").arg( (*it)->statusStr() );
576 optionsString +=
"\n";
578 if ( !(*it)->secrecyStr().isEmpty() ) {
579 optionsString += i18n(
"Secrecy: %1").arg( (*it)->secrecyStr() );
580 optionsString +=
"\n";
582 if ( (*it)->type() ==
"Event" ) {
583 Event *e =
static_cast<Event*
>(*it);
585 optionsString += i18n(
"Show as: Busy");
587 optionsString += i18n(
"Show as: Free");
589 optionsString +=
"\n";
590 }
else if ( (*it)->type() ==
"Todo" ) {
591 Todo *t =
static_cast<Todo*
>(*it);
593 optionsString += i18n(
"This task is overdue!");
594 optionsString +=
"\n";
596 }
else if ( (*it)->type() ==
"Journal" ) {
600 optionsString,
false,
false, captionFont, textFont );
604 (*it)->categories().join( i18n(
"Spacer for the joined list of categories",
", ") ),
605 true,
false, captionFont, textFont );
609 p.setFont( oldFont );
620CalPrintDay::~CalPrintDay()
624TQWidget *CalPrintDay::createConfigWidget( TQWidget *w )
626 return new CalPrintDayConfig_Base( w );
631 CalPrintDayConfig_Base *cfg =
632 dynamic_cast<CalPrintDayConfig_Base*
>( mConfigWidget );
634 mFromDate = cfg->mFromDate->date();
635 mToDate = cfg->mToDate->date();
637 mStartTime = cfg->mFromTime->time();
638 mEndTime = cfg->mToTime->time();
639 mIncludeAllEvents = cfg->mIncludeAllEvents->isChecked();
641 mIncludeTodos = cfg->mIncludeTodos->isChecked();
642 mUseColors = cfg->mColors->isChecked();
648 CalPrintDayConfig_Base *cfg =
649 dynamic_cast<CalPrintDayConfig_Base*
>( mConfigWidget );
651 cfg->mFromDate->setDate( mFromDate );
652 cfg->mToDate->setDate( mToDate );
654 cfg->mFromTime->setTime( mStartTime );
655 cfg->mToTime->setTime( mEndTime );
656 cfg->mIncludeAllEvents->setChecked( mIncludeAllEvents );
658 cfg->mIncludeTodos->setChecked( mIncludeTodos );
659 cfg->mColors->setChecked( mUseColors );
667 TQTime tm1( dayStart() );
668 TQDateTime startTm( dt, tm1 );
669 TQDateTime endTm( dt, tm1.addSecs( 12 * 60 * 60 ) );
670 mStartTime = mConfig->readDateTimeEntry(
"Start time", &startTm ).time();
671 mEndTime = mConfig->readDateTimeEntry(
"End time", &endTm ).time();
672 mIncludeTodos = mConfig->readBoolEntry(
"Include todos",
false );
673 mIncludeAllEvents = mConfig->readBoolEntry(
"Include all events",
false );
682 mConfig->writeEntry(
"Start time", TQDateTime( TQDate(), mStartTime ) );
683 mConfig->writeEntry(
"End time", TQDateTime( TQDate(), mEndTime ) );
684 mConfig->writeEntry(
"Include todos", mIncludeTodos );
685 mConfig->writeEntry(
"Include all events", mIncludeAllEvents );
689void CalPrintDay::setDateRange(
const TQDate& from,
const TQDate& to )
692 CalPrintDayConfig_Base *cfg =
693 dynamic_cast<CalPrintDayConfig_Base*
>( mConfigWidget );
695 cfg->mFromDate->setDate( from );
696 cfg->mToDate->setDate( to );
700void CalPrintDay::print( TQPainter &p,
int width,
int height )
702 TQDate curDay( mFromDate );
708 TDELocale *local = TDEGlobal::locale();
711 TQTime curStartTime( mStartTime );
712 TQTime curEndTime( mEndTime );
716 if ( curEndTime <= curStartTime ) {
717 curStartTime = TQTime( curStartTime.hour(), 0, 0 );
718 curEndTime = curStartTime.addSecs( 3600 );
721 drawHeader( p, local->formatDate( curDay ), curDay, TQDate(), headerBox );
722 Event::List eventList = mCalendar->events( curDay,
727 Event::List alldayEvents, timedEvents;
728 Event::List::ConstIterator it;
729 for ( it = eventList.begin(); it != eventList.end(); ++it ) {
730 if ( (*it)->doesFloat() ) {
731 alldayEvents.append( *it );
733 timedEvents.append( *it );
738 TQFont textFont(
"sans-serif", fontSize, TQFont::Normal );
739 p.setFont( textFont );
740 uint lineSpacing = p.fontMetrics().lineSpacing();
742 uint maxAllDayEvents = 8;
743 uint allDayHeight = TQMIN( alldayEvents.count(), maxAllDayEvents ) * lineSpacing;
744 allDayHeight = TQMAX( allDayHeight, ( 5 * lineSpacing ) ) + ( 2 * padding() );
745 TQRect allDayBox( TIMELINE_WIDTH + padding(), headerBox.bottom() + padding(),
746 width - TIMELINE_WIDTH - padding(), allDayHeight );
747 if ( alldayEvents.count() > 0 ) {
749 TQFont oldFont( p.font() );
750 p.setFont( TQFont(
"sans-serif", 9, TQFont::Normal ) );
753 TQRect( 0, headerBox.bottom() + padding(), TIMELINE_WIDTH, allDayHeight ),
754 i18n(
"Today's Events" ),
755 TQt::AlignHCenter | TQt::AlignVCenter | TQt::WordBreak );
756 p.setFont( oldFont );
759 drawBox( p, BOX_BORDER_WIDTH, allDayBox );
761 Event::List::ConstIterator it;
762 TQRect eventBox( allDayBox );
763 eventBox.setLeft( TIMELINE_WIDTH + ( 2 * padding() ) );
764 eventBox.setTop( eventBox.top() + padding() );
765 eventBox.setBottom( eventBox.top() + lineSpacing );
767 for ( it = alldayEvents.begin(); it != alldayEvents.end(); ++it ) {
768 if ( count == maxAllDayEvents ) {
773 if ( (*it)->location().isEmpty() ) {
774 str = cleanString( (*it)->summary() );
776 str = i18n(
"summary, location",
"%1, %2" ).
777 arg( cleanString( (*it)->summary() ), cleanString( (*it)->location() ) );
780 eventBox.setTop( eventBox.bottom() );
781 eventBox.setBottom( eventBox.top() + lineSpacing );
784 allDayBox.setBottom( headerBox.bottom() );
787 TQRect dayBox( allDayBox );
788 dayBox.setTop( allDayBox.bottom() + padding() );
789 dayBox.setBottom( height );
791 curStartTime, curEndTime, dayBox );
793 TQRect tlBox( dayBox );
795 tlBox.setWidth( TIMELINE_WIDTH );
800 curDay = curDay.addDays( 1 );
801 if ( curDay <= mToDate ) {
804 }
while ( curDay <= mToDate );
817CalPrintWeek::~CalPrintWeek()
821TQWidget *CalPrintWeek::createConfigWidget( TQWidget *w )
823 return new CalPrintWeekConfig_Base( w );
828 CalPrintWeekConfig_Base *cfg =
829 dynamic_cast<CalPrintWeekConfig_Base*
>( mConfigWidget );
831 mFromDate = cfg->mFromDate->date();
832 mToDate = cfg->mToDate->date();
834 mWeekPrintType = (eWeekPrintType)( cfg->mPrintType->id(
835 cfg->mPrintType->selected() ) );
837 mStartTime = cfg->mFromTime->time();
838 mEndTime = cfg->mToTime->time();
840 mIncludeTodos = cfg->mIncludeTodos->isChecked();
841 mUseColors = cfg->mColors->isChecked();
847 CalPrintWeekConfig_Base *cfg =
848 dynamic_cast<CalPrintWeekConfig_Base*
>( mConfigWidget );
850 cfg->mFromDate->setDate( mFromDate );
851 cfg->mToDate->setDate( mToDate );
853 cfg->mPrintType->setButton( mWeekPrintType );
855 cfg->mFromTime->setTime( mStartTime );
856 cfg->mToTime->setTime( mEndTime );
858 cfg->mIncludeTodos->setChecked( mIncludeTodos );
859 cfg->mColors->setChecked( mUseColors );
867 TQTime tm1( dayStart() );
868 TQDateTime startTm( dt, tm1 );
869 TQDateTime endTm( dt, tm1.addSecs( 43200 ) );
870 mStartTime = mConfig->readDateTimeEntry(
"Start time", &startTm ).time();
871 mEndTime = mConfig->readDateTimeEntry(
"End time", &endTm ).time();
872 mIncludeTodos = mConfig->readBoolEntry(
"Include todos",
false );
873 mWeekPrintType =(eWeekPrintType)( mConfig->readNumEntry(
"Print type", (
int)Filofax ) );
882 mConfig->writeEntry(
"Start time", TQDateTime( TQDate(), mStartTime ) );
883 mConfig->writeEntry(
"End time", TQDateTime( TQDate(), mEndTime ) );
884 mConfig->writeEntry(
"Include todos", mIncludeTodos );
885 mConfig->writeEntry(
"Print type",
int( mWeekPrintType ) );
891 if ( mWeekPrintType == Filofax )
return KPrinter::Portrait;
892 else if ( mWeekPrintType == SplitWeek )
return KPrinter::Portrait;
893 else return KPrinter::Landscape;
896void CalPrintWeek::setDateRange(
const TQDate &from,
const TQDate &to )
899 CalPrintWeekConfig_Base *cfg =
900 dynamic_cast<CalPrintWeekConfig_Base*
>( mConfigWidget );
902 cfg->mFromDate->setDate( from );
903 cfg->mToDate->setDate( to );
907void CalPrintWeek::print( TQPainter &p,
int width,
int height )
909 TQDate curWeek, fromWeek, toWeek;
913 fromWeek = mFromDate.addDays( -weekdayCol );
915 toWeek = mToDate.addDays( 6 - weekdayCol );
917 curWeek = fromWeek.addDays( 6 );
918 TDELocale *local = TDEGlobal::locale();
920 TQString line1, line2, title;
925 TQRect weekBox( headerBox );
926 weekBox.setTop( headerBox.bottom() + padding() );
927 weekBox.setBottom( height );
929 switch ( mWeekPrintType ) {
932 line1 = local->formatDate( curWeek.addDays( -6 ) );
933 line2 = local->formatDate( curWeek );
934 if ( orientation() == KPrinter::Landscape ) {
935 title = i18n(
"date from-to",
"%1 - %2");
937 title = i18n(
"date from-\nto",
"%1 -\n%2");;
939 title = title.arg( line1 ).arg( line2 );
940 drawHeader( p, title, curWeek.addDays( -6 ), TQDate(), headerBox );
946 curWeek = curWeek.addDays( 7 );
947 if ( curWeek <= toWeek )
949 }
while ( curWeek <= toWeek );
955 line1 = local->formatDate( curWeek.addDays( -6 ) );
956 line2 = local->formatDate( curWeek );
957 if ( orientation() == KPrinter::Landscape ) {
958 title = i18n(
"date from - to (week number)",
"%1 - %2 (Week %3)");
960 title = i18n(
"date from -\nto (week number)",
"%1 -\n%2 (Week %3)");
962 title = title.arg( line1 ).arg( line2 ).arg( curWeek.weekNumber() );
963 drawHeader( p, title, curWeek, TQDate(), headerBox );
965 TQRect weekBox( headerBox );
966 weekBox.setTop( headerBox.bottom() + padding() );
967 weekBox.setBottom( height );
968 drawTimeTable( p, fromWeek, curWeek, mStartTime, mEndTime, weekBox );
972 fromWeek = fromWeek.addDays( 7 );
973 curWeek = fromWeek.addDays( 6 );
974 if ( curWeek <= toWeek )
976 }
while ( curWeek <= toWeek );
980 TQRect weekBox1( weekBox );
984 weekBox1.setRight(
int( ( width - TIMELINE_WIDTH ) * 3. / 4. + TIMELINE_WIDTH ) );
986 TQDate endLeft( fromWeek.addDays( 3 ) );
990 mStartTime, mEndTime, weekBox );
992 drawSplitHeaderRight( p, fromWeek, curWeek, TQDate(), width, hh );
994 mStartTime, mEndTime, weekBox1 );
998 fromWeek = fromWeek.addDays( 7 );
999 curWeek = fromWeek.addDays( 6 );
1000 if ( curWeek <= toWeek )
1002 }
while ( curWeek <= toWeek );
1019CalPrintMonth::~CalPrintMonth()
1023TQWidget *CalPrintMonth::createConfigWidget( TQWidget *w )
1025 return new CalPrintMonthConfig_Base( w );
1030 CalPrintMonthConfig_Base *cfg =
1031 dynamic_cast<CalPrintMonthConfig_Base *
>( mConfigWidget );
1033 mFromDate = TQDate( cfg->mFromYear->value(), cfg->mFromMonth->currentItem()+1, 1 );
1034 mToDate = TQDate( cfg->mToYear->value(), cfg->mToMonth->currentItem()+1, 1 );
1036 mWeekNumbers = cfg->mWeekNumbers->isChecked();
1037 mRecurDaily = cfg->mRecurDaily->isChecked();
1038 mRecurWeekly = cfg->mRecurWeekly->isChecked();
1039 mIncludeTodos = cfg->mIncludeTodos->isChecked();
1046 CalPrintMonthConfig_Base *cfg =
1047 dynamic_cast<CalPrintMonthConfig_Base *
>( mConfigWidget );
1048 setDateRange( mFromDate, mToDate );
1050 cfg->mWeekNumbers->setChecked( mWeekNumbers );
1051 cfg->mRecurDaily->setChecked( mRecurDaily );
1052 cfg->mRecurWeekly->setChecked( mRecurWeekly );
1053 cfg->mIncludeTodos->setChecked( mIncludeTodos );
1061 mWeekNumbers = mConfig->readBoolEntry(
"Print week numbers",
true );
1062 mRecurDaily = mConfig->readBoolEntry(
"Print daily incidences",
true );
1063 mRecurWeekly = mConfig->readBoolEntry(
"Print weekly incidences",
true );
1064 mIncludeTodos = mConfig->readBoolEntry(
"Include todos",
false );
1073 mConfig->writeEntry(
"Print week numbers", mWeekNumbers );
1074 mConfig->writeEntry(
"Print daily incidences", mRecurDaily );
1075 mConfig->writeEntry(
"Print weekly incidences", mRecurWeekly );
1076 mConfig->writeEntry(
"Include todos", mIncludeTodos );
1080void CalPrintMonth::setDateRange(
const TQDate &from,
const TQDate &to )
1083 CalPrintMonthConfig_Base *cfg =
1084 dynamic_cast<CalPrintMonthConfig_Base *
>( mConfigWidget );
1085 const KCalendarSystem *calSys = calendarSystem();
1086 if ( cfg && calSys ) {
1087 cfg->mFromMonth->clear();
1088 for (
int i=0; i<calSys->monthsInYear( mFromDate ); ++i ) {
1089 cfg->mFromMonth->insertItem( calSys->monthName( i+1, mFromDate.year() ) );
1091 cfg->mToMonth->clear();
1092 for (
int i=0; i<calSys->monthsInYear( mToDate ); ++i ) {
1093 cfg->mToMonth->insertItem( calSys->monthName( i+1, mToDate.year() ) );
1097 cfg->mFromMonth->setCurrentItem( from.month()-1 );
1098 cfg->mFromYear->setValue( to.year() );
1099 cfg->mToMonth->setCurrentItem( mToDate.month()-1 );
1100 cfg->mToYear->setValue( mToDate.year() );
1104void CalPrintMonth::print( TQPainter &p,
int width,
int height )
1106 TQDate curMonth, fromMonth, toMonth;
1108 fromMonth = mFromDate.addDays( -( mFromDate.day() - 1 ) );
1109 toMonth = mToDate.addDays( mToDate.daysInMonth() - mToDate.day() );
1111 curMonth = fromMonth;
1112 const KCalendarSystem *calSys = calendarSystem();
1113 if ( !calSys )
return;
1119 TQRect monthBox( 0, 0, width, height );
1120 monthBox.setTop( headerBox.bottom() + padding() );
1123 TQString title( i18n(
"monthname year",
"%1 %2") );
1124 title = title.arg( calSys->monthName( curMonth ) )
1125 .arg( curMonth.year() );
1126 TQDate tmp( fromMonth );
1128 tmp = tmp.addDays( -weekdayCol );
1130 drawHeader( p, title, curMonth.addMonths( -1 ), curMonth.addMonths( 1 ),
1132 drawMonthTable( p, curMonth, mWeekNumbers, mRecurDaily, mRecurWeekly, monthBox );
1136 curMonth = curMonth.addDays( curMonth.daysInMonth() );
1137 if ( curMonth <= toMonth )
mPrinter->newPage();
1138 }
while ( curMonth <= toMonth );
1151 mTodoSortField = TodoFieldUnset;
1152 mTodoSortDirection = TodoDirectionUnset;
1155CalPrintTodos::~CalPrintTodos()
1159TQWidget *CalPrintTodos::createConfigWidget( TQWidget *w )
1161 return new CalPrintTodoConfig_Base( w );
1166 CalPrintTodoConfig_Base *cfg =
1167 dynamic_cast<CalPrintTodoConfig_Base *
>( mConfigWidget );
1169 mPageTitle = cfg->mTitle->text();
1171 mTodoPrintType = (eTodoPrintType)( cfg->mPrintType->id(
1172 cfg->mPrintType->selected() ) );
1174 mFromDate = cfg->mFromDate->date();
1175 mToDate = cfg->mToDate->date();
1177 mIncludeDescription = cfg->mDescription->isChecked();
1178 mIncludePriority = cfg->mPriority->isChecked();
1179 mIncludeDueDate = cfg->mDueDate->isChecked();
1180 mIncludePercentComplete = cfg->mPercentComplete->isChecked();
1181 mConnectSubTodos = cfg->mConnectSubTodos->isChecked();
1182 mStrikeOutCompleted = cfg->mStrikeOutCompleted->isChecked();
1184 mTodoSortField = (eTodoSortField)cfg->mSortField->currentItem();
1185 mTodoSortDirection = (eTodoSortDirection)cfg->mSortDirection->currentItem();
1193 CalPrintTodoConfig_Base *cfg =
1194 dynamic_cast<CalPrintTodoConfig_Base *
>( mConfigWidget );
1196 cfg->mTitle->setText( mPageTitle );
1198 cfg->mPrintType->setButton( mTodoPrintType );
1200 cfg->mFromDate->setDate( mFromDate );
1201 cfg->mToDate->setDate( mToDate );
1203 cfg->mDescription->setChecked( mIncludeDescription );
1204 cfg->mPriority->setChecked( mIncludePriority );
1205 cfg->mDueDate->setChecked( mIncludeDueDate );
1206 cfg->mPercentComplete->setChecked( mIncludePercentComplete );
1207 cfg->mConnectSubTodos->setChecked( mConnectSubTodos );
1208 cfg->mStrikeOutCompleted->setChecked( mStrikeOutCompleted );
1210 if ( mTodoSortField != TodoFieldUnset ) {
1212 cfg->mSortField->insertItem( i18n(
"Summary") );
1213 cfg->mSortField->insertItem( i18n(
"Start Date") );
1214 cfg->mSortField->insertItem( i18n(
"Due Date") );
1215 cfg->mSortField->insertItem( i18n(
"Priority") );
1216 cfg->mSortField->insertItem( i18n(
"Percent Complete") );
1217 cfg->mSortField->setCurrentItem( (
int)mTodoSortField );
1220 if ( mTodoSortDirection != TodoDirectionUnset ) {
1222 cfg->mSortDirection->insertItem( i18n(
"Ascending") );
1223 cfg->mSortDirection->insertItem( i18n(
"Descending") );
1224 cfg->mSortDirection->setCurrentItem( (
int)mTodoSortDirection );
1232 mPageTitle = mConfig->readEntry(
"Page title", i18n(
"To-do list") );
1233 mTodoPrintType = (eTodoPrintType)mConfig->readNumEntry(
"Print type", (
int)TodosAll );
1234 mIncludeDescription = mConfig->readBoolEntry(
"Include description",
true );
1235 mIncludePriority = mConfig->readBoolEntry(
"Include priority",
true );
1236 mIncludeDueDate = mConfig->readBoolEntry(
"Include due date",
true );
1237 mIncludePercentComplete = mConfig->readBoolEntry(
"Include percentage completed",
true );
1238 mConnectSubTodos = mConfig->readBoolEntry(
"Connect subtodos",
true );
1239 mStrikeOutCompleted = mConfig->readBoolEntry(
"Strike out completed summaries",
true );
1240 mTodoSortField = (eTodoSortField)mConfig->readNumEntry(
"Sort field", (
int)TodoFieldSummary );
1241 mTodoSortDirection = (eTodoSortDirection)mConfig->readNumEntry(
"Sort direction", (
int)TodoDirectionAscending );
1250 mConfig->writeEntry(
"Page title", mPageTitle );
1251 mConfig->writeEntry(
"Print type",
int( mTodoPrintType ) );
1252 mConfig->writeEntry(
"Include description", mIncludeDescription );
1253 mConfig->writeEntry(
"Include priority", mIncludePriority );
1254 mConfig->writeEntry(
"Include due date", mIncludeDueDate );
1255 mConfig->writeEntry(
"Include percentage completed", mIncludePercentComplete );
1256 mConfig->writeEntry(
"Connect subtodos", mConnectSubTodos );
1257 mConfig->writeEntry(
"Strike out completed summaries", mStrikeOutCompleted );
1258 mConfig->writeEntry(
"Sort field", mTodoSortField );
1259 mConfig->writeEntry(
"Sort direction", mTodoSortDirection );
1263void CalPrintTodos::print( TQPainter &p,
int width,
int height )
1266 int pospriority = 0;
1267 int possummary = 100;
1268 int posdue = width - 65;
1269 int poscomplete = posdue - 70;
1270 int lineSpacing = 15;
1271 int fontHeight = 10;
1278 drawHeader( p, mPageTitle, mFromDate, TQDate(), headerBox );
1283 TQFont oldFont( p.font() );
1285 p.setFont( TQFont(
"sans-serif", 9, TQFont::Bold ) );
1286 lineSpacing = p.fontMetrics().lineSpacing();
1287 mCurrentLinePos += lineSpacing;
1288 if ( mIncludePriority ) {
1289 outStr += i18n(
"Priority" );
1290 p.drawText( pospriority, mCurrentLinePos - 2, outStr );
1295 outStr.truncate( 0 );
1296 outStr += i18n(
"Summary" );
1297 p.drawText( possummary, mCurrentLinePos - 2, outStr );
1299 if ( mIncludePercentComplete ) {
1300 if ( !mIncludeDueDate )
1301 poscomplete = posdue;
1302 outStr.truncate( 0 );
1303 outStr += i18n(
"Complete" );
1304 p.drawText( poscomplete, mCurrentLinePos - 2, outStr );
1309 if ( mIncludeDueDate ) {
1310 outStr.truncate( 0 );
1311 outStr += i18n(
"Due" );
1312 p.drawText( posdue, mCurrentLinePos - 2, outStr );
1317 p.setFont( TQFont(
"sans-serif", 10 ) );
1318 fontHeight = p.fontMetrics().height();
1320 Todo::List todoList;
1321 Todo::List tempList;
1322 Todo::List::ConstIterator it;
1326 switch( mTodoSortField ) {
1327 case TodoFieldSummary:
1329 case TodoFieldStartDate:
1331 case TodoFieldDueDate:
1333 case TodoFieldPriority:
1335 case TodoFieldPercentComplete:
1337 case TodoFieldUnset:
1342 switch( mTodoSortDirection ) {
1343 case TodoDirectionAscending:
1345 case TodoDirectionDescending:
1347 case TodoDirectionUnset:
1352 todoList = mCalendar->todos( sortField, sortDirection );
1353 switch( mTodoPrintType ) {
1356 case TodosUnfinished:
1357 for( it = todoList.begin(); it!= todoList.end(); ++it ) {
1358 if ( !(*it)->isCompleted() )
1359 tempList.append( *it );
1361 todoList = tempList;
1364 for( it = todoList.begin(); it!= todoList.end(); ++it ) {
1365 if ( (*it)->hasDueDate() ) {
1366 if ( (*it)->dtDue().date() >= mFromDate &&
1367 (*it)->dtDue().date() <= mToDate )
1368 tempList.append( *it );
1370 tempList.append( *it );
1373 todoList = tempList;
1379 for ( it=todoList.begin(); it!=todoList.end(); ++it ) {
1380 Todo *currEvent = *it;
1386 sortField, sortDirection,
1388 mStrikeOutCompleted, mIncludeDescription,
1389 pospriority, possummary, posdue, poscomplete,
1390 0, 0, mCurrentLinePos, width, height, todoList );
1395 p.setFont( oldFont );
Base class for KOrganizer printing classes.
void printEventString(TQPainter &p, const TQRect &box, const TQString &str, int flags=-1)
Print the given string (event summary) in the given rectangle.
virtual void loadConfig()=0
Load print format configuration from config file.
int footerHeight() const
Returns the height of the page footer.
static void drawBox(TQPainter &p, int linewidth, const TQRect &rect)
Draw a box with given width at the given coordinates.
int drawBoxWithCaption(TQPainter &p, const TQRect &box, const TQString &caption, const TQString &contents, bool sameLine, bool expand, const TQFont &captionFont, const TQFont &textFont)
Draw a component box with a heading (printed in bold).
int headerHeight() const
Returns the height of the page header.
void drawTimeTable(TQPainter &p, const TQDate &fromDate, const TQDate &toDate, TQTime &fromTime, TQTime &toTime, const TQRect &box)
Draw the timetable view of the given time range from fromDate to toDate.
void drawMonthTable(TQPainter &p, const TQDate &qd, bool weeknumbers, bool recurDaily, bool recurWeekly, const TQRect &box)
Draw the month table of the month containing the date qd.
static int weekdayColumn(int weekday)
Determines the column of the given weekday ( 1=Monday, 7=Sunday ), taking the start of the week setti...
void drawTodo(int &count, Todo *todo, TQPainter &p, TodoSortField sortField, SortDirection sortDir, bool connectSubTodos, bool strikeoutCompleted, bool desc, int posPriority, int posSummary, int posDueDt, int posPercentComplete, int level, int x, int &y, int width, int pageHeight, const Todo::List &todoList, TodoParentStart *r=0)
Draws single to-do and its (intented) sub-to-dos, optionally connects them by a tree-like line,...
int drawHeader(TQPainter &p, TQString title, const TQDate &month1, const TQDate &month2, const TQRect &box, bool expand=false)
Draw the gray header bar of the printout to the TQPainter.
void drawVerticalBox(TQPainter &p, int linewidth, const TQRect &box, const TQString &str, int flags=-1)
Draw an event box with vertical text.
void drawTimeLine(TQPainter &p, const TQTime &fromTime, const TQTime &toTime, const TQRect &box)
Draw a (vertical) time scale from time fromTime to toTime inside the given area of the painter.
virtual void saveConfig()=0
Write print format configuration to config file.
void drawWeek(TQPainter &p, const TQDate &qd, const TQRect &box)
Draw the week (filofax) table of the week containing the date qd.
int drawFooter(TQPainter &p, TQRect &box)
Draw a page footer containing the printing date and possibly other things, like a page number.
void drawAgendaDayBox(TQPainter &p, Event::List &eventList, const TQDate &qd, bool expandable, TQTime &fromTime, TQTime &toTime, const TQRect &box)
Draw the agenda box for the day print style (the box showing all events of that day).
bool hasStartOffset() const
Duration endOffset() const
bool hasEndOffset() const
Duration startOffset() const
virtual TQDateTime dtEnd() const
Transparency transparency() const
virtual TQDateTime dtStart() const
virtual bool accept(Visitor &)
Incidence * relatedTo() const
bool hasStartDate() const
TQDateTime dtStart(bool first=false) const
TQDateTime dtDue(bool first=false) const
virtual void setSettingsWidget()
Set configuration widget to reflect settings of current object.
virtual void setDateRange(const TQDate &from, const TQDate &to)
Set date range which should be printed.
virtual KPrinter::Orientation defaultOrientation()
Orientation of printout.
KPrinter * mPrinter
The printer object.
virtual void readSettingsWidget()
Read settings from configuration widget and apply them to current object.