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