korganizer Library API Documentation

koeditorgeneraltodo.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018 
00019     As a special exception, permission is given to link this program
00020     with any edition of Qt, and distribute the resulting executable,
00021     without including the source code for Qt in the source distribution.
00022 */
00023 
00024 #include <qtooltip.h>
00025 #include <qfiledialog.h>
00026 #include <qlayout.h>
00027 #include <qvbox.h>
00028 #include <qbuttongroup.h>
00029 #include <qvgroupbox.h>
00030 #include <qwidgetstack.h>
00031 #include <qdatetime.h>
00032 #include <qcheckbox.h>
00033 #include <qpushbutton.h>
00034 #include <qlabel.h>
00035 
00036 #include <kglobal.h>
00037 #include <klocale.h>
00038 #include <kiconloader.h>
00039 #include <kmessagebox.h>
00040 #include <kdebug.h>
00041 #include <krestrictedline.h>
00042 #include <kstandarddirs.h>
00043 #include <kfiledialog.h>
00044 #include <ktextedit.h>
00045 
00046 #include <libkcal/todo.h>
00047 
00048 #include <libkdepim/kdateedit.h>
00049 
00050 #include "koprefs.h"
00051 #include "koglobals.h"
00052 #include "ktimeedit.h"
00053 
00054 #include "koeditorgeneraltodo.h"
00055 #include "koeditorgeneraltodo.moc"
00056 
00057 KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
00058                                          const char* name)
00059   : KOEditorGeneral( parent, name)
00060 {
00061 }
00062 
00063 KOEditorGeneralTodo::~KOEditorGeneralTodo()
00064 {
00065 }
00066 
00067 void KOEditorGeneralTodo::finishSetup()
00068 {
00069   QWidget::setTabOrder( mSummaryEdit, mLocationEdit );
00070   QWidget::setTabOrder( mLocationEdit, mDueCheck );
00071   QWidget::setTabOrder( mDueCheck, mDueDateEdit );
00072   QWidget::setTabOrder( mDueDateEdit, mDueTimeEdit );
00073   QWidget::setTabOrder( mDueTimeEdit, mStartCheck );
00074   QWidget::setTabOrder( mStartCheck, mStartDateEdit );
00075   QWidget::setTabOrder( mStartDateEdit, mStartTimeEdit );
00076   QWidget::setTabOrder( mStartTimeEdit, mTimeButton );
00077   QWidget::setTabOrder( mTimeButton, mCompletedCombo );
00078   QWidget::setTabOrder( mCompletedCombo, mPriorityCombo );
00079   QWidget::setTabOrder( mPriorityCombo, mAlarmButton );
00080   QWidget::setTabOrder( mAlarmButton, mAlarmTimeEdit );
00081   QWidget::setTabOrder( mAlarmTimeEdit, mAlarmIncrCombo );
00082   QWidget::setTabOrder( mAlarmIncrCombo, mAlarmSoundButton );
00083   QWidget::setTabOrder( mAlarmSoundButton, mAlarmProgramButton );
00084   QWidget::setTabOrder( mAlarmProgramButton, mDescriptionEdit );
00085   QWidget::setTabOrder( mDescriptionEdit, mCategoriesButton );
00086   QWidget::setTabOrder( mCategoriesButton, mSecrecyCombo );
00087 //  QWidget::setTabOrder( mSecrecyCombo, mDescriptionEdit );
00088 
00089   mSummaryEdit->setFocus();
00090 }
00091 
00092 void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
00093 {
00094   QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
00095 
00096   QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
00097                                           i18n("Date && Time"),parent);
00098   timeLayout->addWidget(timeGroupBox);
00099 
00100   QFrame *timeBoxFrame = new QFrame(timeGroupBox);
00101 
00102   QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,1,1);
00103   layoutTimeBox->setSpacing(topLayout->spacing());
00104 
00105 
00106   mDueCheck = new QCheckBox(i18n("&Due:"),timeBoxFrame);
00107   layoutTimeBox->addWidget(mDueCheck,0,0);
00108   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
00109   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
00110   connect(mDueCheck,SIGNAL(toggled(bool)),SIGNAL(dueDateEditToggle(bool)));
00111   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(dateChanged()));
00112 
00113   mDueDateEdit = new KDateEdit(timeBoxFrame);
00114   layoutTimeBox->addWidget(mDueDateEdit,0,1);
00115   connect(mDueDateEdit,SIGNAL(dateChanged(QDate)),SLOT(dateChanged()));
00116 
00117   mDueTimeEdit = new KTimeEdit(timeBoxFrame);
00118   layoutTimeBox->addWidget(mDueTimeEdit,0,2);
00119   connect(mDueTimeEdit,SIGNAL(timeChanged( QTime )),SLOT(dateChanged()));
00120 
00121   mStartCheck = new QCheckBox(i18n("Sta&rt:"),timeBoxFrame);
00122   layoutTimeBox->addWidget(mStartCheck,1,0);
00123   connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
00124   connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(startDateModified()));
00125 
00126   mStartDateEdit = new KDateEdit(timeBoxFrame);
00127   layoutTimeBox->addWidget(mStartDateEdit,1,1);
00128   connect(mStartDateEdit,SIGNAL(dateChanged(QDate)),SLOT(startDateModified()));
00129 
00130   mStartTimeEdit = new KTimeEdit(timeBoxFrame);
00131   layoutTimeBox->addWidget(mStartTimeEdit,1,2);
00132   connect(mStartTimeEdit,SIGNAL(timeChanged(QTime)),SLOT(startDateModified()));
00133 
00134   mTimeButton = new QCheckBox(i18n("Ti&me associated"),timeBoxFrame);
00135   layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,2);
00136 
00137   connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
00138   connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(dateChanged()));
00139 
00140   // some more layouting
00141   layoutTimeBox->setColStretch(3,1);
00142 }
00143 
00144 
00145 void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
00146 {
00147   mCompletedCombo = new QComboBox(parent);
00148   for (int i = 0; i <= 100; i+=10) {
00149     // xgettext:no-c-format
00150     QString label = i18n("Percent complete", "%1 %").arg (i);
00151     mCompletedCombo->insertItem(label);
00152   }
00153   connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
00154   topLayout->addWidget(mCompletedCombo);
00155 
00156   mCompletedLabel = new QLabel(i18n("co&mpleted"),parent);
00157   topLayout->addWidget(mCompletedLabel);
00158   mCompletedLabel->setBuddy( mCompletedCombo );
00159 }
00160 
00161 void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
00162 {
00163   QLabel *priorityLabel = new QLabel(i18n("&Priority:"),parent);
00164   topLayout->addWidget(priorityLabel);
00165 
00166   mPriorityCombo = new QComboBox(parent);
00167   mPriorityCombo->insertItem(i18n("1 (highest)"));
00168   mPriorityCombo->insertItem(i18n("2"));
00169   mPriorityCombo->insertItem(i18n("3"));
00170   mPriorityCombo->insertItem(i18n("4"));
00171   mPriorityCombo->insertItem(i18n("5 (lowest)"));
00172   topLayout->addWidget(mPriorityCombo);
00173   priorityLabel->setBuddy( mPriorityCombo );
00174 }
00175 
00176 void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
00177 {
00178   QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
00179 
00180   initCompletion( parent, statusLayout );
00181 
00182   statusLayout->addStretch( 1 );
00183 
00184   initPriority( parent, statusLayout );
00185 }
00186 
00187 void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay)
00188 {
00189   KOEditorGeneral::setDefaults(allDay);
00190 
00191   mTimeButton->setChecked( !allDay );
00192   if(mTimeButton->isChecked()) {
00193     mTimeButton->setEnabled(true);
00194   }
00195   else {
00196     mTimeButton->setEnabled(false);
00197   }
00198 
00199   enableTimeEdits( !allDay );
00200 
00201   mDueCheck->setChecked(false);
00202   enableDueEdit(false);
00203 
00204   alarmDisable(true);
00205 
00206   mStartCheck->setChecked(false);
00207   enableStartEdit(false);
00208 
00209   mDueDateEdit->setDate(due.date());
00210   mDueTimeEdit->setTime(due.time());
00211 
00212   mStartDateEdit->setDate(QDate::currentDate());
00213   mStartTimeEdit->setTime(QTime::currentTime());
00214   mStartDateModified = false;
00215 
00216   mPriorityCombo->setCurrentItem(2);
00217 
00218   mCompletedCombo->setCurrentItem(0);
00219 }
00220 
00221 void KOEditorGeneralTodo::readTodo(Todo *todo)
00222 {
00223   KOEditorGeneral::readIncidence(todo);
00224 
00225   QDateTime dueDT;
00226 
00227   if (todo->hasDueDate()) {
00228     enableAlarmEdit(true);
00229     dueDT = todo->dtDue();
00230     mDueDateEdit->setDate(todo->dtDue().date());
00231     mDueTimeEdit->setTime(todo->dtDue().time());
00232     mDueCheck->setChecked(true);
00233   } else {
00234     alarmDisable(true);
00235     mDueDateEdit->setEnabled(false);
00236     mDueTimeEdit->setEnabled(false);
00237     mDueDateEdit->setDate(QDate::currentDate());
00238     mDueTimeEdit->setTime(QTime::currentTime());
00239     mDueCheck->setChecked(false);
00240   }
00241 
00242   if (todo->hasStartDate()) {
00243     mStartDateEdit->setDate(todo->dtStart().date());
00244     mStartTimeEdit->setTime(todo->dtStart().time());
00245     mStartCheck->setChecked(true);
00246   } else {
00247     mStartDateEdit->setEnabled(false);
00248     mStartTimeEdit->setEnabled(false);
00249     mStartDateEdit->setDate(QDate::currentDate());
00250     mStartTimeEdit->setTime(QTime::currentTime());
00251     mStartCheck->setChecked(false);
00252   }
00253 
00254   mTimeButton->setChecked( !todo->doesFloat() );
00255 
00256   mAlreadyComplete = false;
00257   mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00258   if (todo->isCompleted() && todo->hasCompletedDate()) {
00259     mCompleted = todo->completed();
00260     mAlreadyComplete = true;
00261   }
00262   setCompletedDate();
00263 
00264   mPriorityCombo->setCurrentItem(todo->priority()-1);
00265   mStartDateModified = false;
00266 }
00267 
00268 void KOEditorGeneralTodo::writeTodo(Todo *todo)
00269 {
00270   KOEditorGeneral::writeIncidence(todo);
00271 
00272   // temp. until something better happens.
00273   QString tmpStr;
00274 
00275   todo->setHasDueDate(mDueCheck->isChecked());
00276   todo->setHasStartDate(mStartCheck->isChecked());
00277 
00278   QDate tmpSDate, tmpDDate;
00279   QTime tmpSTime, tmpDTime;
00280   QDateTime tmpStartDT, tmpDueDT;
00281   if ( mTimeButton->isChecked() ) {
00282     todo->setFloats(false);
00283 
00284     // set due date/time
00285     tmpDDate = mDueDateEdit->date();
00286     tmpDTime = mDueTimeEdit->getTime();
00287     tmpDueDT.setDate(tmpDDate);
00288     tmpDueDT.setTime(tmpDTime);
00289 
00290     // set start date/time
00291     if ( mStartCheck->isChecked() ) {
00292       tmpSDate = mStartDateEdit->date();
00293       tmpSTime = mStartTimeEdit->getTime();
00294       tmpStartDT.setDate(tmpSDate);
00295       tmpStartDT.setTime(tmpSTime);
00296     } else {
00297       tmpStartDT = tmpDueDT;
00298     }
00299   } else {
00300     todo->setFloats(true);
00301 
00302     // need to change this.
00303     tmpDDate = mDueDateEdit->date();
00304     tmpDTime.setHMS(0,0,0);
00305     tmpDueDT.setDate(tmpDDate);
00306     tmpDueDT.setTime(tmpDTime);
00307 
00308     if ( mStartCheck->isChecked() ) {
00309       tmpSDate = mStartDateEdit->date();
00310       tmpSTime.setHMS(0,0,0);
00311       tmpStartDT.setDate(tmpSDate);
00312       tmpStartDT.setTime(tmpSTime);
00313     } else {
00314       tmpStartDT = tmpDueDT;
00315     }
00316   }
00317 
00318   if ( todo->doesRecur() && !mStartDateModified ) {
00319     todo->setDtDue( tmpDueDT );
00320   } else {
00321       todo->setDtDue( tmpDueDT, true );
00322       todo->setDtStart( tmpStartDT );
00323       todo->setDtRecurrence( tmpDueDT );
00324   }
00325 
00326   todo->setPriority(mPriorityCombo->currentItem()+1);
00327 
00328   // set completion state
00329   todo->setPercentComplete(mCompletedCombo->currentItem() * 10);
00330 
00331   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00332     if (! mAlreadyComplete) emit todoCompleted( todo );
00333     else todo->setCompleted(mCompleted);
00334   }
00335 }
00336 
00337 void KOEditorGeneralTodo::enableDueEdit(bool enable)
00338 {
00339   mDueDateEdit->setEnabled( enable );
00340 
00341   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00342     mTimeButton->setEnabled(true);
00343   }
00344   else {
00345     mTimeButton->setEnabled(false);
00346     mTimeButton->setChecked(false);
00347   }
00348 
00349   if (enable) {
00350     mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
00351   } else {
00352     mDueTimeEdit->setEnabled( false );
00353   }
00354 }
00355 
00356 void KOEditorGeneralTodo::enableStartEdit( bool enable )
00357 {
00358   mStartDateEdit->setEnabled( enable );
00359 
00360   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00361     mTimeButton->setEnabled(true);
00362   }
00363   else {
00364     mTimeButton->setEnabled(false);
00365     mTimeButton->setChecked(false);
00366   }
00367 
00368   if (enable) {
00369     mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
00370   } else {
00371     mStartTimeEdit->setEnabled( false );
00372   }
00373 }
00374 
00375 void KOEditorGeneralTodo::enableTimeEdits(bool enable)
00376 {
00377   if(mStartCheck->isChecked()) {
00378     mStartTimeEdit->setEnabled( enable );
00379   }
00380   if(mDueCheck->isChecked()) {
00381     mDueTimeEdit->setEnabled( enable );
00382   }
00383 }
00384 
00385 void KOEditorGeneralTodo::showAlarm()
00386 {
00387   if ( mDueCheck->isChecked() ) {
00388     alarmDisable(false);
00389   }
00390   else {
00391     alarmDisable(true);
00392   }
00393 }
00394 
00395 bool KOEditorGeneralTodo::validateInput()
00396 {
00397   if (mDueCheck->isChecked()) {
00398     if (!mDueDateEdit->inputIsValid()) {
00399       KMessageBox::sorry(0,i18n("Please specify a valid due date."));
00400       return false;
00401     }
00402     if (mTimeButton->isChecked()) {
00403       if (!mDueTimeEdit->inputIsValid()) {
00404         KMessageBox::sorry(0,i18n("Please specify a valid due time."));
00405         return false;
00406       }
00407     }
00408   }
00409 
00410   if (mStartCheck->isChecked()) {
00411     if (!mStartDateEdit->inputIsValid()) {
00412       KMessageBox::sorry(0,i18n("Please specify a valid start date."));
00413       return false;
00414     }
00415     if (mTimeButton->isChecked()) {
00416       if (!mStartTimeEdit->inputIsValid()) {
00417         KMessageBox::sorry(0,i18n("Please specify a valid start time."));
00418         return false;
00419       }
00420     }
00421   }
00422 
00423   if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
00424     QDateTime startDate;
00425     QDateTime dueDate;
00426     startDate.setDate(mStartDateEdit->date());
00427     dueDate.setDate(mDueDateEdit->date());
00428     if (mTimeButton->isChecked()) {
00429       startDate.setTime(mStartTimeEdit->getTime());
00430       dueDate.setTime(mDueTimeEdit->getTime());
00431     }
00432     if (startDate > dueDate) {
00433       KMessageBox::sorry(0,
00434                          i18n("The start date cannot be after the due date."));
00435       return false;
00436     }
00437   }
00438 
00439   return KOEditorGeneral::validateInput();
00440 }
00441 
00442 void KOEditorGeneralTodo::completedChanged(int index)
00443 {
00444   if (index == 10) {
00445     mCompleted = QDateTime::currentDateTime();
00446   }
00447   setCompletedDate();
00448 }
00449 
00450 void KOEditorGeneralTodo::dateChanged()
00451 {
00452   KLocale *l = KGlobal::locale();
00453   QString dateTimeStr = "";
00454 
00455   if ( mStartCheck->isChecked() ) {
00456     dateTimeStr += i18n("Start: %1").arg(
00457                                      l->formatDate( mStartDateEdit->date() ) );
00458     if ( mTimeButton->isChecked() )
00459       dateTimeStr += QString(" %1").arg(
00460                                    l->formatTime( mStartTimeEdit->getTime() ) );
00461   }
00462 
00463   if ( mDueCheck->isChecked() ) {
00464     dateTimeStr += i18n("   Due: %1").arg(
00465                                       l->formatDate( mDueDateEdit->date() ) );
00466     if ( mTimeButton->isChecked() )
00467       dateTimeStr += QString(" %1").arg(
00468                                     l->formatTime( mDueTimeEdit->getTime() ) );
00469   }
00470 
00471   emit dateTimeStrChanged( dateTimeStr );
00472   QDateTime endDt( mDueDateEdit->date(), mDueTimeEdit->getTime() );
00473   emit signalDateTimeChanged( endDt, endDt );
00474 }
00475 
00476 void KOEditorGeneralTodo::startDateModified()
00477 {
00478   mStartDateModified = true;
00479   dateChanged();
00480 }
00481 
00482 void KOEditorGeneralTodo::setCompletedDate()
00483 {
00484   if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) {
00485     mCompletedLabel->setText(i18n("co&mpleted on %1")
00486         .arg(KGlobal::locale()->formatDateTime(mCompleted)));
00487   } else {
00488     mCompletedLabel->setText(i18n("co&mpleted"));
00489   }
00490 }
00491 
00492 void KOEditorGeneralTodo::modified (Todo* todo, int modification)
00493 {
00494   switch (modification) {
00495   case KOGlobals::PRIORITY_MODIFIED:
00496     mPriorityCombo->setCurrentItem(todo->priority()-1);
00497     break;
00498   case KOGlobals::COMPLETION_MODIFIED:
00499     mCompletedCombo->setCurrentItem(todo->percentComplete() / 10);
00500     if (todo->isCompleted() && todo->hasCompletedDate()) {
00501       mCompleted = todo->completed();
00502     }
00503     setCompletedDate();
00504     break;
00505   case KOGlobals::CATEGORY_MODIFIED:
00506     setCategories (todo->categoriesStr ());
00507     break;
00508   case KOGlobals::UNKNOWN_MODIFIED: // fall through
00509   default:
00510     readTodo( todo );
00511     break;
00512   }
00513 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Apr 4 04:49:27 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003