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