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