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( true );
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     IncidenceBase *ib = static_cast<Todo *>( todo );
00395     ib->setDtStart( tmpStartDT );
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 void KOEditorGeneralTodo::showAlarm()
00468 {
00469   enableAlarm( mDueCheck->isChecked() );
00470 }
00471 
00472 bool KOEditorGeneralTodo::validateInput()
00473 {
00474   if (mDueCheck->isChecked()) {
00475     if (!mDueDateEdit->date().isValid()) {
00476       KMessageBox::sorry(0,i18n("Please specify a valid due date."));
00477       return false;
00478     }
00479     if (mTimeButton->isChecked()) {
00480       if (!mDueTimeEdit->inputIsValid()) {
00481         KMessageBox::sorry(0,i18n("Please specify a valid due time."));
00482         return false;
00483       }
00484     }
00485   }
00486 
00487   if (mStartCheck->isChecked()) {
00488     if (!mStartDateEdit->date().isValid()) {
00489       KMessageBox::sorry(0,i18n("Please specify a valid start date."));
00490       return false;
00491     }
00492     if (mTimeButton->isChecked()) {
00493       if (!mStartTimeEdit->inputIsValid()) {
00494         KMessageBox::sorry(0,i18n("Please specify a valid start time."));
00495         return false;
00496       }
00497     }
00498   }
00499 
00500   if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
00501     QDateTime startDate;
00502     QDateTime dueDate;
00503     startDate.setDate(mStartDateEdit->date());
00504     dueDate.setDate(mDueDateEdit->date());
00505     if (mTimeButton->isChecked()) {
00506       startDate.setTime(mStartTimeEdit->getTime());
00507       dueDate.setTime(mDueTimeEdit->getTime());
00508     }
00509     if (startDate > dueDate) {
00510       KMessageBox::sorry(0,
00511                          i18n("The start date cannot be after the due date."));
00512       return false;
00513     }
00514   }
00515 
00516   return KOEditorGeneral::validateInput();
00517 }
00518 
00519 void KOEditorGeneralTodo::updateRecurrenceSummary( Todo *todo )
00520 {
00521   if ( todo->doesRecur() ) {
00522     mRecEditLabel->setText( IncidenceFormatter::recurrenceString( todo ) );
00523   } else {
00524     mRecEditLabel->setText( QString() );
00525   }
00526 }
00527 
00528 void KOEditorGeneralTodo::completedChanged(int index)
00529 {
00530   if (index == 10) {
00531     mCompleted = QDateTime::currentDateTime();
00532   }
00533   setCompletedDate();
00534 }
00535 
00536 void KOEditorGeneralTodo::dateChanged()
00537 {
00538   KLocale *l = KGlobal::locale();
00539   QString dateTimeStr = "";
00540 
00541   if ( mStartCheck->isChecked() ) {
00542     dateTimeStr += i18n("Start: %1").arg(
00543                                      l->formatDate( mStartDateEdit->date() ) );
00544     if ( mTimeButton->isChecked() )
00545       dateTimeStr += QString(" %1").arg(
00546                                    l->formatTime( mStartTimeEdit->getTime() ) );
00547   }
00548 
00549   if ( mDueCheck->isChecked() ) {
00550     dateTimeStr += i18n("   Due: %1").arg(
00551                                       l->formatDate( mDueDateEdit->date() ) );
00552     if ( mTimeButton->isChecked() )
00553       dateTimeStr += QString(" %1").arg(
00554                                     l->formatTime( mDueTimeEdit->getTime() ) );
00555   }
00556 
00557   emit dateTimeStrChanged( dateTimeStr );
00558   QDateTime endDt( mDueDateEdit->date(), mDueTimeEdit->getTime() );
00559   emit signalDateTimeChanged( endDt, endDt );
00560 }
00561 
00562 void KOEditorGeneralTodo::startDateModified()
00563 {
00564   mStartDateModified = true;
00565   dateChanged();
00566 }
00567 
00568 void KOEditorGeneralTodo::setCompletedDate()
00569 {
00570   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00571     mCompletedLabel->setText(i18n("co&mpleted on"));
00572 //        .arg(KGlobal::locale()->formatDateTime(mCompleted)));
00573     mCompletionDateEdit->show();
00574     mCompletionTimeEdit->show();
00575     mCompletionDateEdit->setDate( mCompleted.date() );
00576     mCompletionTimeEdit->setTime( mCompleted.time() );
00577   } else {
00578     mCompletedLabel->setText(i18n("co&mpleted"));
00579     mCompletionDateEdit->hide();
00580     mCompletionTimeEdit->hide();
00581   }
00582 }
00583 
00584 void KOEditorGeneralTodo::modified (Todo* todo, KOGlobals::HowChanged modification)
00585 {
00586   switch (modification) {
00587   case KOGlobals::PRIORITY_MODIFIED:
00588     mPriorityCombo->setCurrentItem( todo->priority() );
00589     break;
00590   case KOGlobals::COMPLETION_MODIFIED:
00591     mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00592     if (todo->isCompleted() && todo->hasCompletedDate()) {
00593       mCompleted = todo->completed();
00594     }
00595     setCompletedDate();
00596     break;
00597   case KOGlobals::CATEGORY_MODIFIED:
00598     setCategories( todo->categories() );
00599     break;
00600   case KOGlobals::UNKNOWN_MODIFIED: // fall through
00601   default:
00602     readTodo( todo, 0, QDate() );
00603     break;
00604   }
00605 }
KDE Home | KDE Accessibility Home | Description of Access Keys