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 #include <tqwidget.h>
00027 #include <tqtooltip.h>
00028 #include <tqlayout.h>
00029 #include <tqvbox.h>
00030 #include <tqhbox.h>
00031 #include <tqbuttongroup.h>
00032 #include <tqvgroupbox.h>
00033 #include <tqdatetime.h>
00034 #include <tqlineedit.h>
00035 #include <tqlabel.h>
00036 #include <tqcheckbox.h>
00037 #include <tqpushbutton.h>
00038 #include <tqcombobox.h>
00039 #include <tqspinbox.h>
00040 #include <tqwhatsthis.h>
00041
00042 #include <kglobal.h>
00043 #include <kdialog.h>
00044 #include <kdebug.h>
00045 #include <klocale.h>
00046 #include <kiconloader.h>
00047 #include <kmessagebox.h>
00048 #include <kfiledialog.h>
00049 #include <ksqueezedtextlabel.h>
00050 #include <kstandarddirs.h>
00051 #include <ktextedit.h>
00052 #include <krestrictedline.h>
00053
00054 #include <libkcal/todo.h>
00055 #include <libkcal/event.h>
00056 #include <libkcal/incidenceformatter.h>
00057 #include <libkcal/resourcecached.h>
00058
00059 #include <libkdepim/kdateedit.h>
00060 #include <libkdepim/categoryselectdialog.h>
00061
00062 #include "koprefs.h"
00063 #include "koglobals.h"
00064
00065 #include "koeditorgeneral.h"
00066 #include "koeditoralarms.h"
00067 #include "koeditorattachments.h"
00068 #include "koeditorgeneral.moc"
00069 #include "kohelper.h"
00070
00071 KOEditorGeneral::KOEditorGeneral( TQObject *parent, const char* name) :
00072 TQObject( parent, name ), mAttachments(0)
00073 {
00074 mType = "Event";
00075 ResourceCached::setEditorWindowOpen(true);
00076 mAlarmList.setAutoDelete( true );
00077 }
00078
00079 KOEditorGeneral::~KOEditorGeneral()
00080 {
00081 ResourceCached::setEditorWindowOpen(false);
00082 }
00083
00084
00085 FocusLineEdit::FocusLineEdit( TQWidget *parent )
00086 : TQLineEdit( parent ), mSkipFirst( true )
00087 {
00088 }
00089
00090 void FocusLineEdit::focusInEvent ( TQFocusEvent *e )
00091 {
00092 if ( !mSkipFirst ) {
00093 emit focusReceivedSignal();
00094 } else {
00095 mSkipFirst = false;
00096 }
00097 TQLineEdit::focusInEvent( e );
00098 }
00099
00100
00101 void KOEditorGeneral::initHeader( TQWidget *parent,TQBoxLayout *topLayout)
00102 {
00103 TQGridLayout *headerLayout = new TQGridLayout();
00104 headerLayout->setSpacing( topLayout->spacing() );
00105 topLayout->addLayout( headerLayout );
00106
00107 TQString whatsThis = i18n("Sets the Title of this event or to-do.");
00108 TQLabel *summaryLabel = new TQLabel( i18n("T&itle:"), parent );
00109 TQWhatsThis::add( summaryLabel, whatsThis );
00110 TQFont f = summaryLabel->font();
00111 f.setBold( true );
00112 summaryLabel->setFont(f);
00113 headerLayout->addWidget(summaryLabel,1,0);
00114
00115 mSummaryEdit = new FocusLineEdit( parent );
00116 TQWhatsThis::add( mSummaryEdit, whatsThis );
00117 connect( mSummaryEdit, TQT_SIGNAL( focusReceivedSignal() ),
00118 TQT_SIGNAL( focusReceivedSignal() ) );
00119 headerLayout->addWidget(mSummaryEdit,1,1);
00120 summaryLabel->setBuddy( mSummaryEdit );
00121
00122 mAttendeeSummaryLabel = new TQLabel( parent );
00123 updateAttendeeSummary( 0 );
00124 headerLayout->addWidget( mAttendeeSummaryLabel, 1, 2 );
00125
00126 whatsThis = i18n("Sets where the event or to-do will take place.");
00127 TQLabel *locationLabel = new TQLabel( i18n("&Location:"), parent );
00128 TQWhatsThis::add( locationLabel, whatsThis );
00129 headerLayout->addWidget(locationLabel,2,0);
00130
00131 mLocationEdit = new TQLineEdit( parent );
00132 TQWhatsThis::add( mLocationEdit, whatsThis );
00133 headerLayout->addMultiCellWidget( mLocationEdit, 2, 2, 1, 2 );
00134 locationLabel->setBuddy( mLocationEdit );
00135
00136 TQBoxLayout *thirdLineLayout = new TQHBoxLayout();
00137 headerLayout->addMultiCellLayout( thirdLineLayout, 3, 3, 0, 2 );
00138
00139 mResourceLabel = new TQLabel( parent );
00140 mResourceLabel->hide();
00141 thirdLineLayout->addWidget( mResourceLabel );
00142
00143 whatsThis = i18n("Allows you to select the categories that this event or to-do belongs to.");
00144 TQLabel *categoriesLabel = new TQLabel( i18n("Categories:"), parent );
00145 TQWhatsThis::add( categoriesLabel, whatsThis );
00146 thirdLineLayout->addWidget( categoriesLabel );
00147 mCategoriesLabel = new KSqueezedTextLabel( parent );
00148 TQWhatsThis::add( mCategoriesLabel, whatsThis );
00149 mCategoriesLabel->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
00150 thirdLineLayout->addWidget( mCategoriesLabel );
00151
00152 mCategoriesButton = new TQPushButton( parent );
00153 mCategoriesButton->setText(i18n("Select..."));
00154 TQWhatsThis::add( mCategoriesButton, whatsThis );
00155 connect(mCategoriesButton,TQT_SIGNAL(clicked()),TQT_SLOT(selectCategories()));
00156 thirdLineLayout->addWidget( mCategoriesButton );
00157 }
00158
00159 void KOEditorGeneral::initSecrecy(TQWidget *parent, TQBoxLayout *topLayout)
00160 {
00161 TQBoxLayout *secrecyLayout = new TQHBoxLayout( topLayout );
00162
00163 TQLabel *secrecyLabel = new TQLabel(i18n("Acc&ess:"),parent);
00164 TQString whatsThis = i18n("Sets whether the access to this event or to-do "
00165 "is restricted. Please note that KOrganizer "
00166 "currently does not use this setting, so the "
00167 "implementation of the restrictions will depend "
00168 "on the groupware server. This means that events "
00169 "or to-dos marked as private or confidential may "
00170 "be visible to others.");
00171 TQWhatsThis::add( secrecyLabel, whatsThis );
00172 secrecyLayout->addWidget(secrecyLabel);
00173
00174 mSecrecyCombo = new TQComboBox(parent);
00175 TQWhatsThis::add( mSecrecyCombo, whatsThis );
00176 mSecrecyCombo->insertStringList(Incidence::secrecyList());
00177 secrecyLayout->addWidget(mSecrecyCombo);
00178 secrecyLabel->setBuddy( mSecrecyCombo );
00179 }
00180
00181 void KOEditorGeneral::initDescription(TQWidget *parent,TQBoxLayout *topLayout)
00182 {
00183 mDescriptionEdit = new KTextEdit(parent);
00184 TQWhatsThis::add( mDescriptionEdit,
00185 i18n("Sets the description for this event or to-do. This "
00186 "will be displayed in a reminder if one is set, "
00187 "as well as in a tooltip when you hover over the "
00188 "event.") );
00189 mDescriptionEdit->append("");
00190 mDescriptionEdit->setReadOnly(false);
00191 mDescriptionEdit->setOverwriteMode(false);
00192 mDescriptionEdit->setWordWrap( KTextEdit::WidgetWidth );
00193 mDescriptionEdit->setTabChangesFocus( true );;
00194 topLayout->addWidget(mDescriptionEdit, 4);
00195 }
00196
00197 void KOEditorGeneral::initAlarm( TQWidget *parent, TQBoxLayout *topLayout )
00198 {
00199 TQBoxLayout *alarmLayout = new TQHBoxLayout( topLayout );
00200
00201 mAlarmButton = new TQCheckBox( parent );
00202 TQWhatsThis::add( mAlarmButton, i18n( "Enable reminders for this event or to-do." ) );
00203 TQToolTip::add( mAlarmButton, i18n( "Enable reminders" ) );
00204 alarmLayout->addWidget( mAlarmButton );
00205
00206 mAlarmAdvancedButton = new TQPushButton( parent );
00207 mAlarmAdvancedButton->setIconSet( KOGlobals::self()->smallIconSet( "bell", 16 ) );
00208 TQWhatsThis::add( mAlarmAdvancedButton,
00209 i18n( "Push this button to create an advanced set of reminders "
00210 "for this event or to-do." ) );
00211 TQToolTip::add( mAlarmAdvancedButton, i18n( "Set an advanced reminder" ) );
00212 connect( mAlarmAdvancedButton, TQT_SIGNAL(clicked()), TQT_SLOT(editAlarms()) );
00213 alarmLayout->addWidget( mAlarmAdvancedButton );
00214
00215 mSimpleAlarmBox = new TQHBox( parent );
00216 alarmLayout->addWidget( mSimpleAlarmBox );
00217
00218 TQString whatsThis, toolTip;
00219 if ( mType == "Event" ) {
00220 whatsThis = i18n( "Set the time before the event starts when the reminder will be triggered." );
00221 toolTip = i18n( "Set the start time trigger offset" );
00222 } else {
00223 whatsThis = i18n( "Set the time before the to-do is due when the reminder will be triggered." );
00224 toolTip = i18n( "Set the due time trigger offset" );
00225 }
00226 mAlarmTimeEdit = new TQSpinBox( 0, 99999, 1, mSimpleAlarmBox, "alarmTimeEdit" );
00227 mAlarmTimeEdit->setValue( 0 );
00228 TQWhatsThis::add( mAlarmTimeEdit, whatsThis );
00229 TQToolTip::add( mAlarmTimeEdit, toolTip );
00230
00231 mAlarmIncrCombo = new TQComboBox( false, mSimpleAlarmBox );
00232 mAlarmIncrCombo->insertItem( i18n("minute(s)") );
00233 mAlarmIncrCombo->insertItem( i18n("hour(s)") );
00234 mAlarmIncrCombo->insertItem( i18n("day(s)") );
00235 TQWhatsThis::add( mAlarmIncrCombo, whatsThis );
00236 TQToolTip::add( mAlarmIncrCombo, toolTip );
00237
00238 mAlarmInfoLabel = new TQLabel( parent );
00239 if ( mType == "Event" ) {
00240 mAlarmInfoLabel->setText( i18n( "before the start" ) );
00241 } else {
00242 mAlarmInfoLabel->setText( i18n( "before the due time" ) );
00243 }
00244 alarmLayout->addWidget( mAlarmInfoLabel );
00245
00246 mAlarmAdvancedButton->setEnabled( false );
00247 mAlarmTimeEdit->setEnabled( false );
00248 mAlarmIncrCombo->setEnabled( false );
00249 mAlarmInfoLabel->setEnabled( false );
00250 connect( mAlarmButton, TQT_SIGNAL(toggled(bool)), mAlarmAdvancedButton, TQT_SLOT(setEnabled(bool)) );
00251 connect( mAlarmButton, TQT_SIGNAL(toggled(bool)), mAlarmTimeEdit, TQT_SLOT(setEnabled(bool)) );
00252 connect( mAlarmButton, TQT_SIGNAL(toggled(bool)), mAlarmIncrCombo, TQT_SLOT(setEnabled(bool)) );
00253 connect( mAlarmButton, TQT_SIGNAL(toggled(bool)), mAlarmInfoLabel, TQT_SLOT(setEnabled(bool)) );
00254 }
00255
00256 void KOEditorGeneral::initAttachments(TQWidget *parent,TQBoxLayout *topLayout)
00257 {
00258 mAttachments = new KOEditorAttachments( KDialog::spacingHint(), parent );
00259 connect( mAttachments, TQT_SIGNAL( openURL( const KURL & ) ) ,
00260 this, TQT_SIGNAL( openURL( const KURL & ) ) );
00261 topLayout->addWidget( mAttachments, 1 );
00262 }
00263
00264 void KOEditorGeneral::setType( const TQCString &type )
00265 {
00266
00267 mType = type;
00268 }
00269
00270 void KOEditorGeneral::addAttachments( const TQStringList &attachments,
00271 const TQStringList &mimeTypes,
00272 bool inlineAttachments )
00273 {
00274 TQStringList::ConstIterator it;
00275 uint i = 0;
00276 for ( it = attachments.begin(); it != attachments.end(); ++it, ++i ) {
00277 if ( !(*it).isEmpty() ) {
00278 TQString mimeType;
00279 if ( mimeTypes.count() > i ) {
00280 mimeType = mimeTypes[ i ];
00281 }
00282 mAttachments->addUriAttachment( *it, mimeType, TQString(), inlineAttachments );
00283 }
00284 }
00285 }
00286
00287 void KOEditorGeneral::selectCategories()
00288 {
00289 KPIM::CategorySelectDialog *categoryDialog = new KPIM::CategorySelectDialog( KOPrefs::instance(), mCategoriesButton );
00290 KOGlobals::fitDialogToScreen( categoryDialog );
00291 categoryDialog->setSelected( mCategories );
00292
00293 connect(categoryDialog, TQT_SIGNAL(editCategories()), this, TQT_SIGNAL(openCategoryDialog()));
00294 connect(this, TQT_SIGNAL(updateCategoryConfig()), categoryDialog, TQT_SLOT(updateCategoryConfig()));
00295
00296 if ( categoryDialog->exec() ) {
00297 setCategories( categoryDialog->selectedCategories() );
00298 }
00299 delete categoryDialog;
00300 }
00301
00302
00303 void KOEditorGeneral::editAlarms()
00304 {
00305 if ( mAlarmIsSimple ) {
00306 mAlarmList.clear();
00307 Alarm *al = alarmFromSimplePage( 0 );
00308 if ( al ) {
00309 mAlarmList.append( al );
00310 }
00311 }
00312
00313 KOEditorAlarms *dlg = new KOEditorAlarms( mType, &mAlarmList, mAlarmAdvancedButton );
00314 if ( dlg->exec() != KDialogBase::Cancel ) {
00315 if ( mType == "Event" ) {
00316 Event *e = new Event;
00317 Alarm::List::ConstIterator it;
00318 for( it = mAlarmList.begin(); it != mAlarmList.end(); ++it ) {
00319 Alarm *a = (*it)->clone();
00320 a->setParent( e );
00321 e->addAlarm( a );
00322 }
00323 updateAlarmWidgets( e );
00324 delete e;
00325 } else {
00326 Todo *t = new Todo;
00327 Alarm::List::ConstIterator it;
00328 for( it = mAlarmList.begin(); it != mAlarmList.end(); ++it ) {
00329 Alarm *a = (*it)->clone();
00330 a->setParent( t );
00331 t->addAlarm( a );
00332 }
00333 updateAlarmWidgets( t );
00334 delete t;
00335 }
00336 }
00337 }
00338
00339 void KOEditorGeneral::enableAlarm( bool enable )
00340 {
00341 mAlarmAdvancedButton->setEnabled( enable );
00342 }
00343
00344 void KOEditorGeneral::toggleAlarm( bool on )
00345 {
00346 mAlarmButton->setChecked( on );
00347 }
00348
00349 void KOEditorGeneral::setCategories( const TQStringList &categories )
00350 {
00351 mCategoriesLabel->setText( categories.join(",") );
00352 mCategories = categories;
00353 }
00354
00355 void KOEditorGeneral::setDefaults(bool )
00356 {
00357 mAlarmList.clear();
00358 updateDefaultAlarmTime();
00359 updateAlarmWidgets( 0 );
00360
00361 mSecrecyCombo->setCurrentItem( Incidence::SecrecyPublic );
00362 mAttachments->setDefaults();
00363 }
00364
00365 void KOEditorGeneral::updateDefaultAlarmTime()
00366 {
00367 int reminderTime = KOPrefs::instance()->mReminderTime;
00368 int index = KOPrefs::instance()->mReminderTimeUnits;
00369 if ( index < 0 || index > 2 ) {
00370 index = 0;
00371 }
00372 mAlarmTimeEdit->setValue( reminderTime );
00373 mAlarmIncrCombo->setCurrentItem( index );
00374 }
00375
00376 bool KOEditorGeneral::isSimpleAlarm( Alarm *alarm ) const
00377 {
00378
00379
00380
00381 bool simple = false;
00382 if ( alarm->type() == Alarm::Display && alarm->text().isEmpty() &&
00383 alarm->repeatCount() == 0 && !alarm->hasTime() ) {
00384 if ( mType == "Event" &&
00385 alarm->hasStartOffset() && alarm->startOffset().asSeconds() <= 0 ) {
00386 simple = true;
00387 }
00388 if ( mType == "Todo" &&
00389 alarm->hasEndOffset() && alarm->endOffset().asSeconds() <= 0 ) {
00390 simple = true;
00391 }
00392 }
00393 return simple;
00394 }
00395
00396 static TQString etc = i18n( "elipsis", "..." );
00397 void KOEditorGeneral::updateAlarmWidgets( Incidence *incidence )
00398 {
00399 uint maxLen = 75;
00400
00401 if ( incidence ) {
00402 mAlarmButton->setChecked( incidence->isAlarmEnabled() );
00403 }
00404
00405 if ( mAlarmList.isEmpty() ) {
00406 mAlarmIsSimple = true;
00407 mSimpleAlarmBox->show();
00408 bool on;
00409 if ( mType == "Event" ) {
00410 on = KOPrefs::instance()->defaultEventReminders();
00411 } else if ( mType == "Todo" ) {
00412 on = KOPrefs::instance()->defaultTodoReminders();
00413 } else {
00414 on = false;
00415 }
00416 mAlarmButton->setChecked( on );
00417 mAlarmAdvancedButton->setEnabled( on );
00418 } else if ( mAlarmList.count() > 1 ) {
00419 mAlarmIsSimple = false;
00420 mAlarmAdvancedButton->setEnabled( true );
00421 mSimpleAlarmBox->hide();
00422 if ( incidence ) {
00423 TQString remStr = IncidenceFormatter::reminderStringList( incidence ).join( ", " );
00424 if ( remStr.length() > maxLen ) {
00425 maxLen -= etc.length();
00426 remStr = remStr.left( maxLen );
00427 remStr += etc;
00428 }
00429 mAlarmInfoLabel->setText( i18n( "Triggers %1" ).arg( remStr ) );
00430 }
00431 } else {
00432 Alarm *alarm = mAlarmList.first();
00433 if ( isSimpleAlarm( alarm ) ) {
00434 mAlarmIsSimple = true;
00435 mSimpleAlarmBox->show();
00436 int offset;
00437 if ( mType == "Event" ) {
00438 offset = alarm->startOffset().asSeconds();
00439 mAlarmInfoLabel->setText( i18n( "before the start" ) );
00440 }
00441 if ( mType == "Todo" ) {
00442 if ( alarm->hasStartOffset() ) {
00443 offset = alarm->startOffset().asSeconds();
00444 mAlarmInfoLabel->setText( i18n( "before the start" ) );
00445 } else {
00446 offset = alarm->endOffset().asSeconds();
00447 mAlarmInfoLabel->setText( i18n( "before the due time" ) );
00448 }
00449 }
00450 offset = offset / -60;
00451 int useoffset = offset;
00452 if ( offset == 0 ) {
00453 mAlarmIncrCombo->setCurrentItem( 0 );
00454 } else if (offset % (24*60) == 0) {
00455 useoffset = offset / (24*60);
00456 mAlarmIncrCombo->setCurrentItem(2);
00457 } else if (offset % 60 == 0) {
00458 useoffset = offset / 60;
00459 mAlarmIncrCombo->setCurrentItem(1);
00460 }
00461 mAlarmTimeEdit->setValue( useoffset );
00462 } else {
00463 mAlarmIsSimple = false;
00464 mAlarmAdvancedButton->setEnabled( true );
00465 mSimpleAlarmBox->hide();
00466 if ( incidence ) {
00467 TQString remStr = IncidenceFormatter::reminderStringList( incidence ).first();
00468 mAlarmInfoLabel->setText( i18n( "Triggers %1" ).arg( remStr ) );
00469 }
00470 }
00471 }
00472 }
00473
00474 void KOEditorGeneral::readIncidence( Incidence *incidence, Calendar *calendar )
00475 {
00476 mSummaryEdit->setText( incidence->summary() );
00477 mLocationEdit->setText( incidence->location() );
00478 mDescriptionEdit->setText( incidence->description() );
00479
00480 mSecrecyCombo->setCurrentItem( incidence->secrecy() );
00481
00482
00483 mAlarmList.clear();
00484 Alarm::List::ConstIterator it;
00485 Alarm::List alarms = incidence->alarms();
00486 for( it = alarms.begin(); it != alarms.end(); ++it ) {
00487 Alarm *al = new Alarm( *(*it) );
00488 al->setParent( 0 );
00489 mAlarmList.append( al );
00490 }
00491 updateDefaultAlarmTime();
00492 updateAlarmWidgets( incidence );
00493
00494 setCategories( incidence->categories() );
00495
00496 mAttachments->readIncidence( incidence );
00497
00498 TQString resLabel = IncidenceFormatter::resourceString( calendar, incidence );
00499 if ( !resLabel.isEmpty() ) {
00500 mResourceLabel->setText( i18n( "Calendar: %1" ).arg( resLabel ) );
00501 mResourceLabel->show();
00502 }
00503 }
00504
00505 Alarm *KOEditorGeneral::alarmFromSimplePage( Incidence *incidence ) const
00506 {
00507 if ( mAlarmButton->isChecked() ) {
00508 Alarm *alarm = new Alarm( 0 );
00509 alarm->setDisplayAlarm( "" );
00510 alarm->setEnabled(true);
00511 TQString tmpStr = mAlarmTimeEdit->text();
00512 int j = mAlarmTimeEdit->value() * -60;
00513 if ( mAlarmIncrCombo->currentItem() == 1 ) {
00514 j = j * 60;
00515 } else if ( mAlarmIncrCombo->currentItem() == 2 ) {
00516 j = j * (60 * 24);
00517 }
00518 if ( mType == "Event" ) {
00519 alarm->setStartOffset( j );
00520 }
00521 if ( mType == "Todo" ) {
00522 Todo *todo = static_cast<Todo *>( incidence );
00523 if ( todo && todo->hasStartDate() && !todo->hasDueDate() ) {
00524 alarm->setStartOffset( j );
00525 } else {
00526 alarm->setEndOffset( j );
00527 }
00528 }
00529 return alarm;
00530 } else {
00531 return 0;
00532 }
00533 }
00534 void KOEditorGeneral::writeIncidence( Incidence *incidence )
00535 {
00536 incidence->setSummary(mSummaryEdit->text());
00537 incidence->setLocation(mLocationEdit->text());
00538 incidence->setDescription(mDescriptionEdit->text());
00539 incidence->setCategories(mCategories);
00540 incidence->setSecrecy(mSecrecyCombo->currentItem());
00541
00542
00543 incidence->clearAlarms();
00544 if ( mAlarmIsSimple ) {
00545 Alarm *al = alarmFromSimplePage( incidence );
00546 if ( al ) {
00547 al->setParent( incidence );
00548 al->setEnabled( mAlarmButton->isChecked() );
00549 incidence->addAlarm( al );
00550 }
00551 } else {
00552
00553 Alarm::List::ConstIterator it;
00554 for( it = mAlarmList.begin(); it != mAlarmList.end(); ++it ) {
00555 Alarm *al = new Alarm( *(*it) );
00556 al->setParent( incidence );
00557 al->setEnabled( mAlarmButton->isChecked() );
00558 incidence->addAlarm( al );
00559 }
00560 }
00561 mAttachments->writeIncidence( incidence );
00562 }
00563
00564 void KOEditorGeneral::setSummary( const TQString &text )
00565 {
00566 mSummaryEdit->setText( text );
00567 }
00568
00569 void KOEditorGeneral::setDescription( const TQString &text )
00570 {
00571 mDescriptionEdit->setText( text );
00572 }
00573
00574 TQObject *KOEditorGeneral::typeAheadReceiver() const
00575 {
00576 return TQT_TQOBJECT(mSummaryEdit);
00577 }
00578
00579 void KOEditorGeneral::updateAttendeeSummary(int count)
00580 {
00581 if ( count <= 0 )
00582 mAttendeeSummaryLabel->setText( i18n("No attendees") );
00583 else
00584 mAttendeeSummaryLabel->setText( i18n( "One attendee", "%n attendees", count ) );
00585 }