00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <qpainter.h>
00028 #include <qdatetimeedit.h>
00029 #include <qdatetime.h>
00030 #include <qcheckbox.h>
00031 #include <qlineedit.h>
00032 #include <qbuttongroup.h>
00033
00034 #include <kglobal.h>
00035 #include <klocale.h>
00036 #include <kdebug.h>
00037 #include <kprinter.h>
00038 #include <kconfig.h>
00039 #include <kcalendarsystem.h>
00040
00041 #include <libkcal/todo.h>
00042 #include <libkcal/calendar.h>
00043
00044 #include <libkdepim/kdateedit.h>
00045
00046 #include "koprefs.h"
00047 #include "koglobals.h"
00048 #include "calprintplugins.h"
00049 #ifndef KORG_NOPRINTER
00050
00051 #include "calprintplugins.moc"
00052
00053 #include "calprintdayconfig_base.h"
00054 #include "calprintweekconfig_base.h"
00055 #include "calprintmonthconfig_base.h"
00056 #include "calprinttodoconfig_base.h"
00057
00058
00059
00060
00061
00062
00063 CalPrintDay::CalPrintDay( KPrinter *printer, Calendar *cal, KConfig *cfg )
00064 : CalPrintBase( printer, cal, cfg )
00065 {
00066 }
00067
00068 CalPrintDay::~CalPrintDay()
00069 {
00070 }
00071
00072 QWidget *CalPrintDay::configWidget( QWidget *w )
00073 {
00074 mConfigWidget = new CalPrintDayConfig_Base( w );
00075 setSettingsWidget();
00076 return mConfigWidget;
00077 }
00078
00079 void CalPrintDay::readSettingsWidget()
00080 {
00081 CalPrintDayConfig_Base *cfg =
00082 dynamic_cast<CalPrintDayConfig_Base*>( mConfigWidget );
00083 if ( cfg ) {
00084 mFromDate = cfg->mFromDate->date();
00085 mToDate = cfg->mToDate->date();
00086
00087 mStartTime = cfg->mFromTime->time();
00088 mEndTime = cfg->mToTime->time();
00089 mIncludeAllEvents = cfg->mIncludeAllEvents->isChecked();
00090
00091 mIncludeTodos = cfg->mIncludeTodos->isChecked();
00092 mUseColors = cfg->mColors->isChecked();
00093 }
00094 }
00095
00096 void CalPrintDay::setSettingsWidget()
00097 {
00098 CalPrintDayConfig_Base *cfg =
00099 dynamic_cast<CalPrintDayConfig_Base*>( mConfigWidget );
00100 if ( cfg ) {
00101 cfg->mFromDate->setDate( mFromDate );
00102 cfg->mToDate->setDate( mToDate );
00103
00104 cfg->mFromTime->setTime( mStartTime );
00105 cfg->mToTime->setTime( mEndTime );
00106 cfg->mIncludeAllEvents->setChecked( mIncludeAllEvents );
00107
00108 cfg->mIncludeTodos->setChecked( mIncludeTodos );
00109 cfg->mColors->setChecked( mUseColors );
00110 }
00111 }
00112
00113 void CalPrintDay::loadConfig()
00114 {
00115 if ( mConfig ) {
00116 QDate dt;
00117 QTime tm1( KOPrefs::instance()->mDayBegins.time() );
00118 QDateTime startTm( dt, tm1 );
00119 QDateTime endTm( dt, tm1.addSecs( 12 * 60 * 60 ) );
00120 mStartTime = mConfig->readDateTimeEntry( "Start time", &startTm ).time();
00121 mEndTime = mConfig->readDateTimeEntry( "End time", &endTm ).time();
00122 mIncludeTodos = mConfig->readBoolEntry( "Include todos", false );
00123 mIncludeAllEvents = mConfig->readBoolEntry( "Include all events", false );
00124 }
00125 setSettingsWidget();
00126 }
00127
00128 void CalPrintDay::saveConfig()
00129 {
00130 kdDebug() << "CalPrintDay::saveConfig()" << endl;
00131
00132 readSettingsWidget();
00133 if ( mConfig ) {
00134 mConfig->writeEntry( "Start time", QDateTime( QDate(), mStartTime ) );
00135 mConfig->writeEntry( "End time", QDateTime( QDate(), mEndTime ) );
00136 mConfig->writeEntry( "Include todos", mIncludeTodos );
00137 mConfig->writeEntry( "Include all events", mIncludeAllEvents );
00138 }
00139 }
00140
00141 void CalPrintDay::setDateRange( const QDate& from, const QDate& to )
00142 {
00143 CalPrintBase::setDateRange( from, to );
00144 CalPrintDayConfig_Base *cfg =
00145 dynamic_cast<CalPrintDayConfig_Base*>( mConfigWidget );
00146 if ( cfg ) {
00147 cfg->mFromDate->setDate( from );
00148 cfg->mToDate->setDate( to );
00149 }
00150 }
00151
00152 void CalPrintDay::print( QPainter &p, int width, int height )
00153 {
00154 QDate curDay( mFromDate );
00155
00156 do {
00157 int x = 0;
00158 int y = 0;
00159 int currHeight=( height - y ) / 20;
00160 QTime curStartTime( mStartTime );
00161 QTime curEndTime( mEndTime );
00162 if ( curStartTime.secsTo( curEndTime ) <= 3600 ) {
00163 if ( curStartTime.hour() == 0 ) {
00164 curStartTime = QTime( 0, 0, 0 );
00165 curEndTime = curStartTime.addSecs( 3600 );
00166 } else if ( curEndTime.hour() == 23 ) {
00167 curEndTime=QTime( 23, 59, 59 );
00168 if ( curStartTime > QTime( 23, 0, 0 ) ) {
00169 curStartTime = QTime( 23, 0, 0 );
00170 }
00171 } else {
00172 curStartTime = curStartTime.addSecs( -1200 );
00173 }
00174 curEndTime = curEndTime.addSecs( 1200 );
00175 }
00176
00177 KLocale *local = KGlobal::locale();
00178 drawHeader( p, local->formatDate( curDay, false ),
00179 curDay, QDate(), 0, 0, width, mHeaderHeight );
00180
00181 y += mHeaderHeight + 5;
00182 x = 80;
00183 Event::List eventList = mCalendar->events( curDay, true );
00184
00185 p.setFont( QFont( "helvetica", 12 ) );
00186 drawAllDayBox( p, eventList, curDay, true, x, y, width - x, currHeight );
00187 y += currHeight;
00188 drawAgendaDayBox( p, eventList, curDay, mIncludeAllEvents,
00189 curStartTime, curEndTime, x, y, width - x, height - y );
00190 drawTimeLine( p, curStartTime, curEndTime, 0, y, x - 5, height - y );
00191 curDay = curDay.addDays( 1 );
00192 if ( curDay <= mToDate ) mPrinter->newPage();
00193 } while ( curDay <= mToDate );
00194 }
00195
00196
00197
00198
00199
00200
00201
00202 CalPrintWeek::CalPrintWeek(KPrinter *printer, Calendar *cal, KConfig *cfg)
00203 :CalPrintBase(printer,cal,cfg)
00204 {
00205 }
00206
00207 CalPrintWeek::~CalPrintWeek()
00208 {
00209 }
00210
00211 QWidget *CalPrintWeek::configWidget( QWidget *w )
00212 {
00213 mConfigWidget = new CalPrintWeekConfig_Base( w );
00214 setSettingsWidget();
00215 return mConfigWidget;
00216 }
00217
00218 void CalPrintWeek::readSettingsWidget()
00219 {
00220 CalPrintWeekConfig_Base *cfg =
00221 dynamic_cast<CalPrintWeekConfig_Base*>( mConfigWidget );
00222 if ( cfg ) {
00223 mFromDate = cfg->mFromDate->date();
00224 mToDate = cfg->mToDate->date();
00225
00226 mWeekPrintType = (eWeekPrintType)( cfg->mPrintType->id(
00227 cfg->mPrintType->selected() ) );
00228
00229 mStartTime = cfg->mFromTime->time();
00230 mEndTime = cfg->mToTime->time();
00231
00232 mIncludeTodos = cfg->mIncludeTodos->isChecked();
00233 mUseColors = cfg->mColors->isChecked();
00234 }
00235 }
00236
00237 void CalPrintWeek::setSettingsWidget()
00238 {
00239 CalPrintWeekConfig_Base *cfg =
00240 dynamic_cast<CalPrintWeekConfig_Base*>( mConfigWidget );
00241 if ( cfg ) {
00242 cfg->mFromDate->setDate( mFromDate );
00243 cfg->mToDate->setDate( mToDate );
00244
00245 cfg->mPrintType->setButton( mWeekPrintType );
00246
00247 cfg->mFromTime->setTime( mStartTime );
00248 cfg->mToTime->setTime( mEndTime );
00249
00250 cfg->mIncludeTodos->setChecked( mIncludeTodos );
00251 cfg->mColors->setChecked( mUseColors );
00252 }
00253 }
00254
00255 void CalPrintWeek::loadConfig()
00256 {
00257 if ( mConfig ) {
00258 QDate dt;
00259 QTime tm1( KOPrefs::instance()->mDayBegins.time() );
00260 QDateTime startTm( dt, tm1 );
00261 QDateTime endTm( dt, tm1.addSecs( 43200 ) );
00262 mStartTime = mConfig->readDateTimeEntry( "Start time", &startTm ).time();
00263 mEndTime = mConfig->readDateTimeEntry( "End time", &endTm ).time();
00264 mIncludeTodos = mConfig->readBoolEntry( "Include todos", false );
00265 mWeekPrintType =(eWeekPrintType)( mConfig->readNumEntry( "Print type", (int)Filofax ) );
00266 }
00267 setSettingsWidget();
00268 }
00269
00270 void CalPrintWeek::saveConfig()
00271 {
00272 readSettingsWidget();
00273 if ( mConfig ) {
00274 mConfig->writeEntry( "Start time", QDateTime( QDate(), mStartTime ) );
00275 mConfig->writeEntry( "End time", QDateTime( QDate(), mEndTime ) );
00276 mConfig->writeEntry( "Include todos", mIncludeTodos );
00277 mConfig->writeEntry( "Print type", int( mWeekPrintType ) );
00278 }
00279 }
00280
00281 KPrinter::Orientation CalPrintWeek::orientation()
00282 {
00283 if ( mWeekPrintType == Filofax ) return KPrinter::Portrait;
00284 else if ( mWeekPrintType == SplitWeek ) return KPrinter::Portrait;
00285 else return KPrinter::Landscape;
00286 }
00287
00288 void CalPrintWeek::setDateRange( const QDate &from, const QDate &to )
00289 {
00290 CalPrintBase::setDateRange( from, to );
00291 CalPrintWeekConfig_Base *cfg =
00292 dynamic_cast<CalPrintWeekConfig_Base*>( mConfigWidget );
00293 if ( cfg ) {
00294 cfg->mFromDate->setDate( from );
00295 cfg->mToDate->setDate( to );
00296 }
00297 }
00298
00299 void CalPrintWeek::print( QPainter &p, int width, int height )
00300 {
00301 QDate curWeek, fromWeek, toWeek;
00302
00303
00304 int weekdayCol = weekdayColumn( mFromDate.dayOfWeek() );
00305 fromWeek = mFromDate.addDays( -weekdayCol );
00306 weekdayCol = weekdayColumn( mFromDate.dayOfWeek() );
00307 toWeek = mToDate.addDays( 6 - weekdayCol );
00308
00309 curWeek = fromWeek.addDays( 6 );
00310 KLocale *local = KGlobal::locale();
00311
00312 switch ( mWeekPrintType ) {
00313 case Filofax:
00314 do {
00315 QString line1( local->formatDate( curWeek.addDays( -6 ) ) );
00316 QString line2( local->formatDate( curWeek ) );
00317 drawHeader( p, line1 + "\n" + line2, curWeek.addDays( -6 ), QDate(),
00318 0, 0, width, mHeaderHeight );
00319 int top = mHeaderHeight + 10;
00320 drawWeek( p, curWeek, 0, top, width, height - top );
00321 curWeek = curWeek.addDays( 7 );
00322 if ( curWeek <= toWeek )
00323 mPrinter->newPage();
00324 } while ( curWeek <= toWeek );
00325 break;
00326
00327 case Timetable:
00328 default:
00329 do {
00330 QString line1( local->formatDate( curWeek.addDays( -6 ) ) );
00331 QString line2( local->formatDate( curWeek ) );
00332 int hh = int(mHeaderHeight * 2./3.);
00333 drawHeader( p, i18n("date from - to", "%1 - %2\nWeek %3").arg( line1 ).arg( line2 ).arg( curWeek.weekNumber() ),
00334 curWeek, QDate(), 0, 0, width, hh );
00335 drawTimeTable( p, fromWeek, curWeek,
00336 mStartTime, mEndTime, 0, hh + 5,
00337 width, height - hh - 5 );
00338 fromWeek = fromWeek.addDays( 7 );
00339 curWeek = fromWeek.addDays( 6 );
00340 if ( curWeek <= toWeek )
00341 mPrinter->newPage();
00342 } while ( curWeek <= toWeek );
00343 break;
00344
00345 case SplitWeek:
00346 do {
00347 QString line1( local->formatDate( curWeek.addDays( -6 ) ) );
00348 QString line2( local->formatDate( curWeek ) );
00349 QDate endLeft( fromWeek.addDays( 3 ) );
00350 int hh = mHeaderHeight;
00351
00352 drawTimeTable( p, fromWeek, endLeft,
00353 mStartTime, mEndTime, 0, hh + 5,
00354 width, height - hh - 5 );
00355 mPrinter->newPage();
00356 drawSplitHeaderRight( p, fromWeek, curWeek, QDate(), width, hh );
00357 drawTimeTable( p, endLeft.addDays( 1 ), curWeek,
00358 mStartTime, mEndTime, 0, hh + 5,
00359 int( ( width - 50 ) * 3. / 4. + 50 ), height - hh - 5 );
00360
00361 fromWeek = fromWeek.addDays( 7 );
00362 curWeek = fromWeek.addDays( 6 );
00363 if ( curWeek <= toWeek )
00364 mPrinter->newPage();
00365 } while ( curWeek <= toWeek );
00366 break;
00367 }
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377 CalPrintMonth::CalPrintMonth( KPrinter *printer, Calendar *cal, KConfig *cfg )
00378 : CalPrintBase( printer, cal, cfg )
00379 {
00380 }
00381
00382 CalPrintMonth::~CalPrintMonth()
00383 {
00384 }
00385
00386 QWidget *CalPrintMonth::configWidget( QWidget *w )
00387 {
00388 mConfigWidget = new CalPrintMonthConfig_Base( w );
00389 return mConfigWidget;
00390 }
00391
00392 void CalPrintMonth::readSettingsWidget()
00393 {
00394 CalPrintMonthConfig_Base *cfg =
00395 dynamic_cast<CalPrintMonthConfig_Base *>( mConfigWidget );
00396 if ( cfg ) {
00397 mFromDate = cfg->mFromDate->date();
00398 mToDate = cfg->mToDate->date();
00399
00400 mWeekNumbers = cfg->mWeekNumbers->isChecked();
00401
00402 mIncludeTodos = cfg->mIncludeTodos->isChecked();
00403
00404 }
00405 }
00406
00407 void CalPrintMonth::setSettingsWidget()
00408 {
00409 CalPrintMonthConfig_Base *cfg =
00410 dynamic_cast<CalPrintMonthConfig_Base *>( mConfigWidget );
00411 if ( cfg ) {
00412 cfg->mFromDate->setDate( mFromDate );
00413 cfg->mToDate->setDate( mToDate );
00414
00415 cfg->mWeekNumbers->setChecked( mWeekNumbers );
00416
00417 cfg->mIncludeTodos->setChecked( mIncludeTodos );
00418
00419 }
00420 }
00421
00422 void CalPrintMonth::loadConfig()
00423 {
00424 if ( mConfig ) {
00425 mWeekNumbers = mConfig->readBoolEntry( "Print week numbers", true );
00426 mIncludeTodos = mConfig->readBoolEntry( "Include todos", false );
00427 }
00428 setSettingsWidget();
00429 }
00430
00431 void CalPrintMonth::saveConfig()
00432 {
00433 readSettingsWidget();
00434 if ( mConfig ) {
00435 mConfig->writeEntry( "Print week numbers", mWeekNumbers );
00436 mConfig->writeEntry( "Include todos", mIncludeTodos );
00437 }
00438 }
00439
00440 void CalPrintMonth::setDateRange( const QDate &from, const QDate &to )
00441 {
00442 CalPrintBase::setDateRange( from, to );
00443 CalPrintMonthConfig_Base *cfg =
00444 dynamic_cast<CalPrintMonthConfig_Base *>( mConfigWidget );
00445 if ( cfg ) {
00446 cfg->mFromDate->setDate( from );
00447 cfg->mToDate->setDate( to );
00448 }
00449 }
00450
00451 void CalPrintMonth::print( QPainter &p, int width, int height )
00452 {
00453 QDate curMonth, fromMonth, toMonth;
00454
00455 fromMonth = mFromDate.addDays( -( mFromDate.day() - 1 ) );
00456 toMonth = mToDate.addDays( mToDate.daysInMonth() - mToDate.day() );
00457
00458 curMonth = fromMonth;
00459 do {
00460 QString title( i18n("monthname year", "%1 %2") );
00461 title = title.arg( KOGlobals::self()->calendarSystem()->monthName( curMonth ) )
00462 .arg( curMonth.year() );
00463 QDate tmp( fromMonth );
00464 int weekdayCol = weekdayColumn( tmp.dayOfWeek() );
00465 tmp = tmp.addDays( -weekdayCol );
00466
00467 drawHeader( p, title,
00468 curMonth.addMonths( -1 ), curMonth.addMonths( 1 ),
00469 0, 0, width, mHeaderHeight );
00470 drawMonth( p, curMonth, mWeekNumbers, 0, mHeaderHeight + 5,
00471 width, height - mHeaderHeight - 5 );
00472 curMonth = curMonth.addDays( curMonth.daysInMonth() );
00473 if ( curMonth <= toMonth ) mPrinter->newPage();
00474 } while ( curMonth <= toMonth );
00475
00476 }
00477
00478
00479
00480
00481
00482
00483
00484
00485 CalPrintTodos::CalPrintTodos( KPrinter *printer, Calendar *cal, KConfig *cfg )
00486 : CalPrintBase( printer, cal, cfg )
00487 {
00488 }
00489
00490 CalPrintTodos::~CalPrintTodos()
00491 {
00492 }
00493
00494 QWidget *CalPrintTodos::configWidget( QWidget *w )
00495 {
00496 mConfigWidget = new CalPrintTodoConfig_Base( w );
00497 return mConfigWidget;
00498 }
00499
00500 void CalPrintTodos::readSettingsWidget()
00501 {
00502 CalPrintTodoConfig_Base *cfg =
00503 dynamic_cast<CalPrintTodoConfig_Base *>( mConfigWidget );
00504 if ( cfg ) {
00505 mPageTitle = cfg->mTitle->text();
00506
00507 mTodoPrintType = (eTodoPrintType)( cfg->mPrintType->id(
00508 cfg->mPrintType->selected() ) );
00509
00510 mFromDate = cfg->mFromDate->date();
00511 mToDate = cfg->mToDate->date();
00512
00513 mIncludeDescription = cfg->mDescription->isChecked();
00514 mIncludePriority = cfg->mPriority->isChecked();
00515 mIncludeDueDate = cfg->mDueDate->isChecked();
00516 mConnectSubTodos = cfg->mConnectSubTodos->isChecked();
00517 }
00518 }
00519
00520 void CalPrintTodos::setSettingsWidget()
00521 {
00522 CalPrintTodoConfig_Base *cfg =
00523 dynamic_cast<CalPrintTodoConfig_Base *>( mConfigWidget );
00524 if ( cfg ) {
00525 cfg->mTitle->setText( mPageTitle );
00526
00527 cfg->mPrintType->setButton( mTodoPrintType );
00528
00529 cfg->mFromDate->setDate( mFromDate );
00530 cfg->mToDate->setDate( mToDate );
00531
00532 cfg->mDescription->setChecked( mIncludeDescription );
00533 cfg->mPriority->setChecked( mIncludePriority );
00534 cfg->mDueDate->setChecked( mIncludeDueDate );
00535 cfg->mConnectSubTodos->setChecked( mConnectSubTodos );
00536 }
00537 }
00538
00539 void CalPrintTodos::loadConfig()
00540 {
00541 if ( mConfig ) {
00542 mPageTitle = mConfig->readEntry( "Page title", i18n("Todo list") );
00543 mTodoPrintType = (eTodoPrintType)mConfig->readNumEntry( "Print type", (int)TodosAll );
00544 mIncludeDescription = mConfig->readBoolEntry( "Include description", true );
00545 mIncludePriority = mConfig->readBoolEntry( "Include priority", true );
00546 mIncludeDueDate = mConfig->readBoolEntry( "Include due date", true );
00547 mConnectSubTodos = mConfig->readBoolEntry( "Connect subtodos", true );
00548 }
00549 setSettingsWidget();
00550 }
00551
00552 void CalPrintTodos::saveConfig()
00553 {
00554 readSettingsWidget();
00555 if ( mConfig ) {
00556 mConfig->writeEntry( "Page title", mPageTitle );
00557 mConfig->writeEntry( "Print type", int( mTodoPrintType ) );
00558 mConfig->writeEntry( "Include description", mIncludeDescription );
00559 mConfig->writeEntry( "Include priority", mIncludePriority );
00560 mConfig->writeEntry( "Include due date", mIncludeDueDate );
00561 mConfig->writeEntry( "Connect subtodos", mConnectSubTodos );
00562 }
00563 }
00564
00565 void CalPrintTodos::print( QPainter &p, int width, int height )
00566 {
00567 int pospriority = 10;
00568 int possummary = 60;
00569 int posdue = width - 85;
00570 int lineSpacing = 15;
00571 int fontHeight = 10;
00572
00573 drawHeader( p, mPageTitle, mFromDate, QDate(),
00574 0, 0, width, mHeaderHeight );
00575
00576 int mCurrentLinePos = mHeaderHeight + 5;
00577 QString outStr;
00578 QFont oldFont( p.font() );
00579
00580
00581 p.setFont( QFont("helvetica", 10, QFont::Bold ) );
00582 lineSpacing = p.fontMetrics().lineSpacing();
00583 mCurrentLinePos += lineSpacing;
00584 if ( mIncludePriority ) {
00585 outStr += i18n("Priority");
00586 p.drawText( pospriority, mCurrentLinePos - 2, outStr);
00587 } else {
00588 possummary = 10;
00589 pospriority = -1;
00590 }
00591
00592 outStr.truncate( 0 );
00593 outStr += i18n("Summary");
00594 p.drawText( possummary, mCurrentLinePos - 2, outStr );
00595
00596 if ( mIncludeDueDate ) {
00597 outStr.truncate( 0 );
00598 outStr += i18n("Due");
00599 p.drawText( posdue, mCurrentLinePos - 2, outStr );
00600 } else {
00601 posdue = -1;
00602 }
00603
00604 p.setFont( QFont( "helvetica", 10 ) );
00605
00606 fontHeight = p.fontMetrics().height();
00607
00608 Todo::List todoList;
00609
00610
00611
00612 todoList = mCalendar->todos();
00613
00614
00615 int count = 0;
00616 for( int cprior = 1; cprior <= 6; cprior++ ) {
00617 Todo::List::ConstIterator it;
00618 for( it = todoList.begin(); it != todoList.end(); ++it ) {
00619 Todo *currEvent = *it;
00620
00621
00622 if ( currEvent->relatedTo() ) {
00623 continue;
00624 }
00625
00626 QDate start = currEvent->dtStart().date();
00627
00628 if ( ( !start.isValid() ) && ( start >= mToDate ) ) {
00629 continue;
00630 }
00631
00632 int priority = currEvent->priority();
00633
00634 if ( ( priority != cprior ) ||
00635 ( ( cprior == 6 ) && ( priority == 0 ) ) ) {
00636 continue;
00637 }
00638 count++;
00639 drawTodo( count, currEvent, p, mConnectSubTodos,
00640 mIncludeDescription, pospriority, possummary, posdue, 0,
00641 0, mCurrentLinePos, width, height, todoList );
00642 }
00643 }
00644 p.setFont( oldFont );
00645 }
00646
00647
00648 #endif