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