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