korganizer

koeditorgeneraltodo.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
00004     Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 
00025 #include <qtooltip.h>
00026 #include <qfiledialog.h>
00027 #include <qlayout.h>
00028 #include <qvbox.h>
00029 #include <qbuttongroup.h>
00030 #include <qvgroupbox.h>
00031 #include <qwidgetstack.h>
00032 #include <qdatetime.h>
00033 #include <qcheckbox.h>
00034 #include <qlabel.h>
00035 #include <qspinbox.h>
00036 #include <qpushbutton.h>
00037 #include <qwhatsthis.h>
00038 
00039 #include <kglobal.h>
00040 #include <klocale.h>
00041 #include <kiconloader.h>
00042 #include <kmessagebox.h>
00043 #include <kdebug.h>
00044 #include <kstandarddirs.h>
00045 #include <kfiledialog.h>
00046 #include <ktextedit.h>
00047 
00048 #include <libkcal/todo.h>
00049 
00050 #include <libkdepim/kdateedit.h>
00051 
00052 #include "koprefs.h"
00053 #include "koglobals.h"
00054 #include "ktimeedit.h"
00055 
00056 #include "koeditorgeneraltodo.h"
00057 #include "koeditorgeneraltodo.moc"
00058 
00059 KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
00060                                          const char* name)
00061   : KOEditorGeneral( parent, name)
00062 {
00063   setType( "Todo" );
00064 }
00065 
00066 KOEditorGeneralTodo::~KOEditorGeneralTodo()
00067 {
00068 }
00069 
00070 void KOEditorGeneralTodo::finishSetup()
00071 {
00072   QWidget::setTabOrder( mSummaryEdit, mLocationEdit );
00073   QWidget::setTabOrder( mLocationEdit, mStartCheck );
00074   QWidget::setTabOrder( mStartCheck, mStartDateEdit );
00075   QWidget::setTabOrder( mStartDateEdit, mStartTimeEdit );
00076   QWidget::setTabOrder( mStartTimeEdit, mDueCheck );
00077   QWidget::setTabOrder( mDueCheck, mDueDateEdit );
00078   QWidget::setTabOrder( mDueDateEdit, mDueTimeEdit );
00079   QWidget::setTabOrder( mDueTimeEdit, mTimeButton );
00080   QWidget::setTabOrder( mTimeButton, mCompletedCombo );
00081   QWidget::setTabOrder( mCompletedCombo, mPriorityCombo );
00082   QWidget::setTabOrder( mPriorityCombo, mAlarmButton );
00083   QWidget::setTabOrder( mAlarmButton, mAlarmTimeEdit );
00084   QWidget::setTabOrder( mAlarmTimeEdit, mAlarmIncrCombo );
00085 //   QWidget::setTabOrder( mAlarmIncrCombo, mAlarmSoundButton );
00086   QWidget::setTabOrder( mAlarmIncrCombo, mAlarmEditButton );
00087 //   QWidget::setTabOrder( mAlarmSoundButton, mAlarmProgramButton );
00088 //   QWidget::setTabOrder( mAlarmProgramButton, mDescriptionEdit );
00089   QWidget::setTabOrder( mAlarmEditButton, mDescriptionEdit );
00090   QWidget::setTabOrder( mDescriptionEdit, mCategoriesButton );
00091   QWidget::setTabOrder( mCategoriesButton, mSecrecyCombo );
00092 //  QWidget::setTabOrder( mSecrecyCombo, mDescriptionEdit );
00093 
00094   mSummaryEdit->setFocus();
00095 }
00096 
00097 void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
00098 {
00099   kdDebug(5850) << k_funcinfo << endl;
00100   QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
00101 
00102   QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
00103                                           i18n("Date && Time"),parent);
00104   timeLayout->addWidget(timeGroupBox);
00105 
00106   QFrame *timeBoxFrame = new QFrame(timeGroupBox);
00107   QWhatsThis::add( timeBoxFrame,
00108                    i18n("Sets options for due and start dates and times "
00109                         "for this to-do.") );
00110 
00111   QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,1,1);
00112   layoutTimeBox->setSpacing(topLayout->spacing());
00113 
00114 
00115   QString whatsThis = i18n("Sets the start date for this to-do");
00116   mStartCheck = new QCheckBox(i18n("Sta&rt:"),timeBoxFrame);
00117   QWhatsThis::add( mStartCheck, whatsThis );
00118   layoutTimeBox->addWidget(mStartCheck,0,0);
00119   connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
00120   connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(startDateModified()));
00121 
00122   mStartDateEdit = new KDateEdit(timeBoxFrame);
00123   QWhatsThis::add( mStartDateEdit, whatsThis );
00124   layoutTimeBox->addWidget(mStartDateEdit,0,1);
00125   connect(mStartDateEdit,SIGNAL(dateChanged(const QDate&)),SLOT(startDateModified()));
00126 
00127   mStartTimeEdit = new KTimeEdit(timeBoxFrame);
00128   QWhatsThis::add( mStartTimeEdit,
00129                    i18n("Sets the start time for this to-do.") );
00130   layoutTimeBox->addWidget(mStartTimeEdit,0,2);
00131   connect(mStartTimeEdit,SIGNAL(timeChanged(QTime)),SLOT(startDateModified()));
00132 
00133   whatsThis = i18n("Sets the due date for this to-do.");
00134   mDueCheck = new QCheckBox(i18n("&Due:"),timeBoxFrame);
00135   QWhatsThis::add( mDueCheck, whatsThis );
00136   layoutTimeBox->addWidget(mDueCheck,1,0);
00137   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
00138   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
00139   connect(mDueCheck,SIGNAL(toggled(bool)),SIGNAL(dueDateEditToggle(bool)));
00140   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(dateChanged()));
00141 
00142   mDueDateEdit = new KDateEdit(timeBoxFrame);
00143   QWhatsThis::add( mDueDateEdit, whatsThis );
00144   layoutTimeBox->addWidget(mDueDateEdit,1,1);
00145   connect(mDueDateEdit,SIGNAL(dateChanged(const QDate&)),SLOT(dateChanged()));
00146 
00147   mDueTimeEdit = new KTimeEdit(timeBoxFrame);
00148   QWhatsThis::add( mDueTimeEdit,
00149                    i18n("Sets the due time for this to-do.") );
00150   layoutTimeBox->addWidget(mDueTimeEdit,1,2);
00151   connect(mDueTimeEdit,SIGNAL(timeChanged( QTime )),SLOT(dateChanged()));
00152 
00153   mTimeButton = new QCheckBox(i18n("Ti&me associated"),timeBoxFrame);
00154   QWhatsThis::add( mTimeButton,
00155                    i18n("Sets whether or not this to-do's start and due dates "
00156                         "have times associated with them.") );
00157   layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,2);
00158 
00159   connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
00160   connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(dateChanged()));
00161 
00162   // some more layouting
00163   layoutTimeBox->setColStretch(3,1);
00164 
00165   QBoxLayout *secLayout = new QHBoxLayout();
00166   layoutTimeBox->addLayout( secLayout, 0, 4 );
00167   initSecrecy( timeBoxFrame, secLayout );
00168 }
00169 
00170 
00171 void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
00172 {
00173   QString whatsThis = i18n("Sets the current completion status of this to-do "
00174                            "as a percentage.");
00175   mCompletedCombo = new QComboBox(parent);
00176   QWhatsThis::add( mCompletedCombo, whatsThis );
00177   for (int i = 0; i <= 100; i+=10) {
00178     // xgettext:no-c-format
00179     QString label = i18n("Percent complete", "%1 %").arg (i);
00180     mCompletedCombo->insertItem(label);
00181   }
00182   connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
00183   topLayout->addWidget(mCompletedCombo);
00184 
00185   mCompletedLabel = new QLabel(i18n("co&mpleted"),parent);
00186   topLayout->addWidget(mCompletedLabel);
00187   mCompletedLabel->setBuddy( mCompletedCombo );
00188   mCompletionDateEdit = new KDateEdit( parent );
00189   mCompletionDateEdit->hide();
00190   topLayout->addWidget( mCompletionDateEdit );
00191   mCompletionTimeEdit = new KTimeEdit( parent, QTime() );
00192   mCompletionTimeEdit->hide();
00193   topLayout->addWidget( mCompletionTimeEdit );
00194 }
00195 
00196 void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
00197 {
00198   QString whatsThis = i18n("Sets the priority of this to-do on a scale "
00199                            "from one to nine, with one being the highest "
00200                            "priority, five being a medium priority, and "
00201                            "nine being the lowest. In programs that have a "
00202                            "different scale, the numbers will be adjusted "
00203                            "to match the appropriate scale.");
00204   QLabel *priorityLabel = new QLabel(i18n("&Priority:"),parent);
00205   topLayout->addWidget(priorityLabel);
00206 
00207   mPriorityCombo = new QComboBox(parent);
00208   mPriorityCombo->insertItem(i18n("unspecified"));
00209   mPriorityCombo->insertItem(i18n("1 (highest)"));
00210   mPriorityCombo->insertItem(i18n("2"));
00211   mPriorityCombo->insertItem(i18n("3"));
00212   mPriorityCombo->insertItem(i18n("4"));
00213   mPriorityCombo->insertItem(i18n("5 (medium)"));
00214   mPriorityCombo->insertItem(i18n("6"));
00215   mPriorityCombo->insertItem(i18n("7"));
00216   mPriorityCombo->insertItem(i18n("8"));
00217   mPriorityCombo->insertItem(i18n("9 (lowest)"));
00218   topLayout->addWidget(mPriorityCombo);
00219   priorityLabel->setBuddy( mPriorityCombo );
00220 }
00221 
00222 void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
00223 {
00224   QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
00225 
00226   initCompletion( parent, statusLayout );
00227 
00228   statusLayout->addStretch( 1 );
00229 
00230   initPriority( parent, statusLayout );
00231 }
00232 
00233 void KOEditorGeneralTodo::setDefaults( const QDateTime &due, bool allDay )
00234 {
00235   kdDebug(5850) << k_funcinfo << due <<endl;
00236   KOEditorGeneral::setDefaults(allDay);
00237 
00238   mTimeButton->setChecked( !allDay );
00239   mTimeButton->setEnabled( mTimeButton->isChecked() /* i.e. !allDay */ );
00240 
00241   enableTimeEdits( !allDay );
00242 
00243   mDueCheck->setChecked( due.isValid() );
00244   enableDueEdit( due.isValid() );
00245 
00246   mStartCheck->setChecked(false);
00247   enableStartEdit(false);
00248 
00249   if ( due.isValid() ) {
00250     mDueDateEdit->setDate( due.date() );
00251     mDueTimeEdit->setTime( due.time() );
00252   } else {
00253     // Make it due tomorrow.
00254     mDueDateEdit->setDate( QDate::currentDate().addDays(1) );
00255     mDueTimeEdit->setTime( QTime::currentTime() );
00256   }
00257 
00258   if ( !due.isValid() || (QDateTime::currentDateTime() < due) ) {
00259     mStartDateEdit->setDate( QDate::currentDate() );
00260     mStartTimeEdit->setTime( QTime::currentTime() );
00261   } else {
00262     mStartDateEdit->setDate( due.date().addDays( -1 ) );
00263     mStartTimeEdit->setTime( due.time() );
00264   }
00265   mStartDateModified = false;
00266 
00267   mPriorityCombo->setCurrentItem(5);
00268 
00269   mCompletedCombo->setCurrentItem(0);
00270 }
00271 
00272 void KOEditorGeneralTodo::readTodo(Todo *todo, Calendar *calendar)
00273 {
00274   KOEditorGeneral::readIncidence(todo, calendar);
00275 
00276   QDateTime dueDT;
00277 
00278   if (todo->hasDueDate()) {
00279     enableAlarm( true );
00280     dueDT = todo->dtDue();
00281     mDueDateEdit->setDate(todo->dtDue().date());
00282     mDueTimeEdit->setTime(todo->dtDue().time());
00283     mDueCheck->setChecked(true);
00284   } else {
00285     enableAlarm( false );
00286     mDueDateEdit->setEnabled(false);
00287     mDueTimeEdit->setEnabled(false);
00288     mDueDateEdit->setDate(QDate::currentDate());
00289     mDueTimeEdit->setTime(QTime::currentTime());
00290     mDueCheck->setChecked(false);
00291   }
00292 
00293   if (todo->hasStartDate()) {
00294     mStartDateEdit->setDate(todo->dtStart().date());
00295     mStartTimeEdit->setTime(todo->dtStart().time());
00296     mStartCheck->setChecked(true);
00297   } else {
00298     mStartDateEdit->setEnabled(false);
00299     mStartTimeEdit->setEnabled(false);
00300     mStartDateEdit->setDate(QDate::currentDate());
00301     mStartTimeEdit->setTime(QTime::currentTime());
00302     mStartCheck->setChecked(false);
00303   }
00304 
00305   mTimeButton->setChecked( !todo->doesFloat() );
00306 
00307   mAlreadyComplete = false;
00308   mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00309   if (todo->isCompleted() && todo->hasCompletedDate()) {
00310     mCompleted = todo->completed();
00311     mAlreadyComplete = true;
00312   }
00313   setCompletedDate();
00314 
00315   mPriorityCombo->setCurrentItem( todo->priority() );
00316   mStartDateModified = false;
00317 }
00318 
00319 void KOEditorGeneralTodo::writeTodo(Todo *todo)
00320 {
00321   KOEditorGeneral::writeIncidence(todo);
00322 
00323   // temp. until something better happens.
00324   QString tmpStr;
00325 
00326   todo->setHasDueDate(mDueCheck->isChecked());
00327   todo->setHasStartDate(mStartCheck->isChecked());
00328 
00329   QDate tmpSDate, tmpDDate;
00330   QTime tmpSTime, tmpDTime;
00331   QDateTime tmpStartDT, tmpDueDT;
00332   if ( mTimeButton->isChecked() ) {
00333     todo->setFloats(false);
00334 
00335     // set due date/time
00336     tmpDDate = mDueDateEdit->date();
00337     tmpDTime = mDueTimeEdit->getTime();
00338     tmpDueDT.setDate(tmpDDate);
00339     tmpDueDT.setTime(tmpDTime);
00340 
00341     // set start date/time
00342     if ( mStartCheck->isChecked() ) {
00343       tmpSDate = mStartDateEdit->date();
00344       tmpSTime = mStartTimeEdit->getTime();
00345       tmpStartDT.setDate(tmpSDate);
00346       tmpStartDT.setTime(tmpSTime);
00347     } else {
00348       tmpStartDT = tmpDueDT;
00349     }
00350   } else {
00351     todo->setFloats(true);
00352 
00353     // need to change this.
00354     tmpDDate = mDueDateEdit->date();
00355     tmpDTime.setHMS(0,0,0);
00356     tmpDueDT.setDate(tmpDDate);
00357     tmpDueDT.setTime(tmpDTime);
00358 
00359     if ( mStartCheck->isChecked() ) {
00360       tmpSDate = mStartDateEdit->date();
00361       tmpSTime.setHMS(0,0,0);
00362       tmpStartDT.setDate(tmpSDate);
00363       tmpStartDT.setTime(tmpSTime);
00364     } else {
00365       tmpStartDT = tmpDueDT;
00366     }
00367   }
00368 
00369   // TODO: Don't use the due date for the recurrence, but the start date (cf. rfc 2445)
00370   if ( todo->doesRecur() && !mStartDateModified ) {
00371     todo->setDtDue( tmpDueDT );
00372   } else {
00373       todo->setDtDue( tmpDueDT, true );
00374       todo->setDtStart( tmpStartDT );
00375       todo->setDtRecurrence( tmpDueDT );
00376   }
00377 
00378   todo->setPriority( mPriorityCombo->currentItem() );
00379 
00380   // set completion state
00381   todo->setPercentComplete(mCompletedCombo->currentItem() * 10);
00382 
00383   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00384     QDateTime completed( mCompletionDateEdit->date(),
00385                          mCompletionTimeEdit->getTime() );
00386     int difference = mCompleted.secsTo( completed );
00387     if ( (difference < 60) && (difference > -60) &&
00388          (completed.time().minute() == mCompleted.time().minute() ) ) {
00389       // completion time wasn't changed substantially (only the seconds
00390       // truncated, but that's an effect done by KTimeEdit automatically).
00391       completed = mCompleted;
00392     }
00393     todo->setCompleted( completed );
00394   }
00395 }
00396 
00397 void KOEditorGeneralTodo::enableDueEdit(bool enable)
00398 {
00399   mDueDateEdit->setEnabled( enable );
00400 
00401   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00402     mTimeButton->setEnabled(true);
00403   } else {
00404     mTimeButton->setEnabled(false);
00405   }
00406 
00407   if (enable) {
00408     mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
00409   } else {
00410     mDueTimeEdit->setEnabled( false );
00411   }
00412 }
00413 
00414 void KOEditorGeneralTodo::enableStartEdit( bool enable )
00415 {
00416   mStartDateEdit->setEnabled( enable );
00417 
00418   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00419     mTimeButton->setEnabled(true);
00420   }
00421   else {
00422     mTimeButton->setEnabled(false);
00423     mTimeButton->setChecked(false);
00424   }
00425 
00426   if (enable) {
00427     mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
00428   } else {
00429     mStartTimeEdit->setEnabled( false );
00430   }
00431 }
00432 
00433 void KOEditorGeneralTodo::enableTimeEdits(bool enable)
00434 {
00435   if(mStartCheck->isChecked()) {
00436     mStartTimeEdit->setEnabled( enable );
00437   }
00438   if(mDueCheck->isChecked()) {
00439     mDueTimeEdit->setEnabled( enable );
00440   }
00441 }
00442 
00443 void KOEditorGeneralTodo::showAlarm()
00444 {
00445   enableAlarm( mDueCheck->isChecked() );
00446 }
00447 
00448 bool KOEditorGeneralTodo::validateInput()
00449 {
00450   if (mDueCheck->isChecked()) {
00451     if (!mDueDateEdit->date().isValid()) {
00452       KMessageBox::sorry(0,i18n("Please specify a valid due date."));
00453       return false;
00454     }
00455     if (mTimeButton->isChecked()) {
00456       if (!mDueTimeEdit->inputIsValid()) {
00457         KMessageBox::sorry(0,i18n("Please specify a valid due time."));
00458         return false;
00459       }
00460     }
00461   }
00462 
00463   if (mStartCheck->isChecked()) {
00464     if (!mStartDateEdit->date().isValid()) {
00465       KMessageBox::sorry(0,i18n("Please specify a valid start date."));
00466       return false;
00467     }
00468     if (mTimeButton->isChecked()) {
00469       if (!mStartTimeEdit->inputIsValid()) {
00470         KMessageBox::sorry(0,i18n("Please specify a valid start time."));
00471         return false;
00472       }
00473     }
00474   }
00475 
00476   if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
00477     QDateTime startDate;
00478     QDateTime dueDate;
00479     startDate.setDate(mStartDateEdit->date());
00480     dueDate.setDate(mDueDateEdit->date());
00481     if (mTimeButton->isChecked()) {
00482       startDate.setTime(mStartTimeEdit->getTime());
00483       dueDate.setTime(mDueTimeEdit->getTime());
00484     }
00485     if (startDate > dueDate) {
00486       KMessageBox::sorry(0,
00487                          i18n("The start date cannot be after the due date."));
00488       return false;
00489     }
00490   }
00491 
00492   return KOEditorGeneral::validateInput();
00493 }
00494 
00495 void KOEditorGeneralTodo::completedChanged(int index)
00496 {
00497   if (index == 10) {
00498     mCompleted = QDateTime::currentDateTime();
00499   }
00500   setCompletedDate();
00501 }
00502 
00503 void KOEditorGeneralTodo::dateChanged()
00504 {
00505   KLocale *l = KGlobal::locale();
00506   QString dateTimeStr = "";
00507 
00508   if ( mStartCheck->isChecked() ) {
00509     dateTimeStr += i18n("Start: %1").arg(
00510                                      l->formatDate( mStartDateEdit->date() ) );
00511     if ( mTimeButton->isChecked() )
00512       dateTimeStr += QString(" %1").arg(
00513                                    l->formatTime( mStartTimeEdit->getTime() ) );
00514   }
00515 
00516   if ( mDueCheck->isChecked() ) {
00517     dateTimeStr += i18n("   Due: %1").arg(
00518                                       l->formatDate( mDueDateEdit->date() ) );
00519     if ( mTimeButton->isChecked() )
00520       dateTimeStr += QString(" %1").arg(
00521                                     l->formatTime( mDueTimeEdit->getTime() ) );
00522   }
00523 
00524   emit dateTimeStrChanged( dateTimeStr );
00525   QDateTime endDt( mDueDateEdit->date(), mDueTimeEdit->getTime() );
00526   emit signalDateTimeChanged( endDt, endDt );
00527 }
00528 
00529 void KOEditorGeneralTodo::startDateModified()
00530 {
00531   mStartDateModified = true;
00532   dateChanged();
00533 }
00534 
00535 void KOEditorGeneralTodo::setCompletedDate()
00536 {
00537   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00538     mCompletedLabel->setText(i18n("co&mpleted on"));
00539 //        .arg(KGlobal::locale()->formatDateTime(mCompleted)));
00540     mCompletionDateEdit->show();
00541     mCompletionTimeEdit->show();
00542     mCompletionDateEdit->setDate( mCompleted.date() );
00543     mCompletionTimeEdit->setTime( mCompleted.time() );
00544   } else {
00545     mCompletedLabel->setText(i18n("co&mpleted"));
00546     mCompletionDateEdit->hide();
00547     mCompletionTimeEdit->hide();
00548   }
00549 }
00550 
00551 void KOEditorGeneralTodo::modified (Todo* todo, int modification)
00552 {
00553   switch (modification) {
00554   case KOGlobals::PRIORITY_MODIFIED:
00555     mPriorityCombo->setCurrentItem( todo->priority() );
00556     break;
00557   case KOGlobals::COMPLETION_MODIFIED:
00558     mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00559     if (todo->isCompleted() && todo->hasCompletedDate()) {
00560       mCompleted = todo->completed();
00561     }
00562     setCompletedDate();
00563     break;
00564   case KOGlobals::CATEGORY_MODIFIED:
00565     setCategories( todo->categories() );
00566     break;
00567   case KOGlobals::UNKNOWN_MODIFIED: // fall through
00568   default:
00569     readTodo( todo, 0 );
00570     break;
00571   }
00572 }