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, 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   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   QPushButton *recEditButton = new QPushButton( timeBoxFrame );
00167   recEditButton->setIconSet( KOGlobals::self()->smallIconSet( "recur", 16 ) );
00168   recLayout->addWidget( recEditButton );
00169   connect( recEditButton, 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 
00326   updateRecurrenceSummary( todo );
00327 
00328   mAlreadyComplete = false;
00329   mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00330   if (todo->isCompleted() && todo->hasCompletedDate()) {
00331     mCompleted = todo->completed();
00332     mAlreadyComplete = true;
00333   }
00334   setCompletedDate();
00335 
00336   mPriorityCombo->setCurrentItem( todo->priority() );
00337   mStartDateModified = false;
00338 }
00339 
00340 void KOEditorGeneralTodo::writeTodo(Todo *todo)
00341 {
00342   KOEditorGeneral::writeIncidence(todo);
00343 
00344   // temp. until something better happens.
00345   QString tmpStr;
00346 
00347   todo->setHasDueDate(mDueCheck->isChecked());
00348   todo->setHasStartDate(mStartCheck->isChecked());
00349 
00350   QDate tmpSDate, tmpDDate;
00351   QTime tmpSTime, tmpDTime;
00352   QDateTime tmpStartDT, tmpDueDT;
00353   if ( mTimeButton->isChecked() ) {
00354     todo->setFloats(false);
00355 
00356     // set due date/time
00357     tmpDDate = mDueDateEdit->date();
00358     tmpDTime = mDueTimeEdit->getTime();
00359     tmpDueDT.setDate(tmpDDate);
00360     tmpDueDT.setTime(tmpDTime);
00361 
00362     // set start date/time
00363     if ( mStartCheck->isChecked() ) {
00364       tmpSDate = mStartDateEdit->date();
00365       tmpSTime = mStartTimeEdit->getTime();
00366       tmpStartDT.setDate(tmpSDate);
00367       tmpStartDT.setTime(tmpSTime);
00368     } else {
00369       tmpStartDT = tmpDueDT;
00370     }
00371   } else {
00372     todo->setFloats(true);
00373 
00374     // need to change this.
00375     tmpDDate = mDueDateEdit->date();
00376     tmpDTime.setHMS(0,0,0);
00377     tmpDueDT.setDate(tmpDDate);
00378     tmpDueDT.setTime(tmpDTime);
00379 
00380     if ( mStartCheck->isChecked() ) {
00381       tmpSDate = mStartDateEdit->date();
00382       tmpSTime.setHMS(0,0,0);
00383       tmpStartDT.setDate(tmpSDate);
00384       tmpStartDT.setTime(tmpSTime);
00385     } else {
00386       tmpStartDT = tmpDueDT;
00387     }
00388   }
00389 
00390   // TODO: Don't use the due date for the recurrence, but the start date (cf. rfc 2445)
00391   if ( todo->doesRecur() && !mStartDateModified ) {
00392     todo->setDtDue( tmpDueDT );
00393   } else {
00394       todo->setDtDue( tmpDueDT, true );
00395       todo->setDtStart( tmpStartDT );
00396       todo->setDtRecurrence( tmpDueDT );
00397   }
00398 
00399   todo->setPriority( mPriorityCombo->currentItem() );
00400 
00401   // set completion state
00402   todo->setPercentComplete(mCompletedCombo->currentItem() * 10);
00403 
00404   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00405     QDateTime completed( mCompletionDateEdit->date(),
00406                          mCompletionTimeEdit->getTime() );
00407     int difference = mCompleted.secsTo( completed );
00408     if ( (difference < 60) && (difference > -60) &&
00409          (completed.time().minute() == mCompleted.time().minute() ) ) {
00410       // completion time wasn't changed substantially (only the seconds
00411       // truncated, but that's an effect done by KTimeEdit automatically).
00412       completed = mCompleted;
00413     }
00414     todo->setCompleted( completed );
00415   }
00416 }
00417 
00418 void KOEditorGeneralTodo::enableDueEdit(bool enable)
00419 {
00420   mDueDateEdit->setEnabled( enable );
00421 
00422   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00423     mTimeButton->setEnabled(true);
00424   } else {
00425     mTimeButton->setEnabled(false);
00426   }
00427 
00428   if (enable) {
00429     mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
00430   } else {
00431     mDueTimeEdit->setEnabled( false );
00432   }
00433 }
00434 
00435 void KOEditorGeneralTodo::enableStartEdit( bool enable )
00436 {
00437   mStartDateEdit->setEnabled( enable );
00438 
00439   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00440     mTimeButton->setEnabled(true);
00441   }
00442   else {
00443     mTimeButton->setEnabled(false);
00444     mTimeButton->setChecked(false);
00445   }
00446 
00447   if (enable) {
00448     mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
00449   } else {
00450     mStartTimeEdit->setEnabled( false );
00451   }
00452 }
00453 
00454 void KOEditorGeneralTodo::enableTimeEdits(bool enable)
00455 {
00456   if(mStartCheck->isChecked()) {
00457     mStartTimeEdit->setEnabled( enable );
00458   }
00459   if(mDueCheck->isChecked()) {
00460     mDueTimeEdit->setEnabled( enable );
00461   }
00462 }
00463 
00464 void KOEditorGeneralTodo::showAlarm()
00465 {
00466   enableAlarm( mDueCheck->isChecked() );
00467 }
00468 
00469 bool KOEditorGeneralTodo::validateInput()
00470 {
00471   if (mDueCheck->isChecked()) {
00472     if (!mDueDateEdit->date().isValid()) {
00473       KMessageBox::sorry(0,i18n("Please specify a valid due date."));
00474       return false;
00475     }
00476     if (mTimeButton->isChecked()) {
00477       if (!mDueTimeEdit->inputIsValid()) {
00478         KMessageBox::sorry(0,i18n("Please specify a valid due time."));
00479         return false;
00480       }
00481     }
00482   }
00483 
00484   if (mStartCheck->isChecked()) {
00485     if (!mStartDateEdit->date().isValid()) {
00486       KMessageBox::sorry(0,i18n("Please specify a valid start date."));
00487       return false;
00488     }
00489     if (mTimeButton->isChecked()) {
00490       if (!mStartTimeEdit->inputIsValid()) {
00491         KMessageBox::sorry(0,i18n("Please specify a valid start time."));
00492         return false;
00493       }
00494     }
00495   }
00496 
00497   if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
00498     QDateTime startDate;
00499     QDateTime dueDate;
00500     startDate.setDate(mStartDateEdit->date());
00501     dueDate.setDate(mDueDateEdit->date());
00502     if (mTimeButton->isChecked()) {
00503       startDate.setTime(mStartTimeEdit->getTime());
00504       dueDate.setTime(mDueTimeEdit->getTime());
00505     }
00506     if (startDate > dueDate) {
00507       KMessageBox::sorry(0,
00508                          i18n("The start date cannot be after the due date."));
00509       return false;
00510     }
00511   }
00512 
00513   return KOEditorGeneral::validateInput();
00514 }
00515 
00516 void KOEditorGeneralTodo::updateRecurrenceSummary( Todo *todo )
00517 {
00518   if ( todo->doesRecur() ) {
00519     mRecEditLabel->setText( IncidenceFormatter::recurrenceString( todo ) );
00520   } else {
00521     mRecEditLabel->setText( QString() );
00522   }
00523 }
00524 
00525 void KOEditorGeneralTodo::completedChanged(int index)
00526 {
00527   if (index == 10) {
00528     mCompleted = QDateTime::currentDateTime();
00529   }
00530   setCompletedDate();
00531 }
00532 
00533 void KOEditorGeneralTodo::dateChanged()
00534 {
00535   KLocale *l = KGlobal::locale();
00536   QString dateTimeStr = "";
00537 
00538   if ( mStartCheck->isChecked() ) {
00539     dateTimeStr += i18n("Start: %1").arg(
00540                                      l->formatDate( mStartDateEdit->date() ) );
00541     if ( mTimeButton->isChecked() )
00542       dateTimeStr += QString(" %1").arg(
00543                                    l->formatTime( mStartTimeEdit->getTime() ) );
00544   }
00545 
00546   if ( mDueCheck->isChecked() ) {
00547     dateTimeStr += i18n("   Due: %1").arg(
00548                                       l->formatDate( mDueDateEdit->date() ) );
00549     if ( mTimeButton->isChecked() )
00550       dateTimeStr += QString(" %1").arg(
00551                                     l->formatTime( mDueTimeEdit->getTime() ) );
00552   }
00553 
00554   emit dateTimeStrChanged( dateTimeStr );
00555   QDateTime endDt( mDueDateEdit->date(), mDueTimeEdit->getTime() );
00556   emit signalDateTimeChanged( endDt, endDt );
00557 }
00558 
00559 void KOEditorGeneralTodo::startDateModified()
00560 {
00561   mStartDateModified = true;
00562   dateChanged();
00563 }
00564 
00565 void KOEditorGeneralTodo::setCompletedDate()
00566 {
00567   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00568     mCompletedLabel->setText(i18n("co&mpleted on"));
00569 //        .arg(KGlobal::locale()->formatDateTime(mCompleted)));
00570     mCompletionDateEdit->show();
00571     mCompletionTimeEdit->show();
00572     mCompletionDateEdit->setDate( mCompleted.date() );
00573     mCompletionTimeEdit->setTime( mCompleted.time() );
00574   } else {
00575     mCompletedLabel->setText(i18n("co&mpleted"));
00576     mCompletionDateEdit->hide();
00577     mCompletionTimeEdit->hide();
00578   }
00579 }
00580 
00581 void KOEditorGeneralTodo::modified (Todo* todo, KOGlobals::HowChanged modification)
00582 {
00583   switch (modification) {
00584   case KOGlobals::PRIORITY_MODIFIED:
00585     mPriorityCombo->setCurrentItem( todo->priority() );
00586     break;
00587   case KOGlobals::COMPLETION_MODIFIED:
00588     mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00589     if (todo->isCompleted() && todo->hasCompletedDate()) {
00590       mCompleted = todo->completed();
00591     }
00592     setCompletedDate();
00593     break;
00594   case KOGlobals::CATEGORY_MODIFIED:
00595     setCategories( todo->categories() );
00596     break;
00597   case KOGlobals::UNKNOWN_MODIFIED: // fall through
00598   default:
00599     readTodo( todo, 0, QDate() );
00600     break;
00601   }
00602 }
KDE Home | KDE Accessibility Home | Description of Access Keys