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 
00033 #include <kglobal.h>
00034 #include <klocale.h>
00035 #include <kiconloader.h>
00036 #include <kmessagebox.h>
00037 #include <kdebug.h>
00038 #include <krestrictedline.h>
00039 #include <kstandarddirs.h>
00040 #include <kfiledialog.h>
00041 
00042 #include <libkcal/todo.h>
00043 
00044 #include <libkdepim/kdateedit.h>
00045 
00046 #include "koprefs.h"
00047 #include "ktimeedit.h"
00048 
00049 #include "koeditorgeneraltodo.h"
00050 #include "koeditorgeneraltodo.moc"
00051 
00052 KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
00053                                          const char* name)
00054   : KOEditorGeneral( parent, name)
00055 {
00056 }
00057 
00058 KOEditorGeneralTodo::~KOEditorGeneralTodo()
00059 {
00060 }
00061 
00062 void KOEditorGeneralTodo::finishSetup()
00063 {
00064   QWidget::setTabOrder( mSummaryEdit, mLocationEdit );
00065   QWidget::setTabOrder( mLocationEdit, mDueCheck );
00066   QWidget::setTabOrder( mDueCheck, mDueDateEdit );
00067   QWidget::setTabOrder( mDueDateEdit, mDueTimeEdit );
00068   QWidget::setTabOrder( mDueTimeEdit, mStartCheck );
00069   QWidget::setTabOrder( mStartCheck, mStartDateEdit );
00070   QWidget::setTabOrder( mStartDateEdit, mStartTimeEdit );
00071   QWidget::setTabOrder( mStartTimeEdit, mTimeButton );
00072   QWidget::setTabOrder( mTimeButton, mCompletedCombo );
00073   QWidget::setTabOrder( mCompletedCombo, mPriorityCombo );
00074   QWidget::setTabOrder( mPriorityCombo, mAlarmButton );
00075   QWidget::setTabOrder( mAlarmButton, mAlarmTimeEdit );
00076   QWidget::setTabOrder( mAlarmTimeEdit, mAlarmIncrCombo );
00077   QWidget::setTabOrder( mAlarmIncrCombo, mAlarmSoundButton );
00078   QWidget::setTabOrder( mAlarmSoundButton, mAlarmProgramButton );
00079   QWidget::setTabOrder( mAlarmProgramButton, mDescriptionEdit );
00080   QWidget::setTabOrder( mDescriptionEdit, mCategoriesButton );
00081   QWidget::setTabOrder( mCategoriesButton, mSecrecyCombo );
00082 //  QWidget::setTabOrder( mSecrecyCombo, mDescriptionEdit );
00083 
00084   mSummaryEdit->setFocus();
00085 }
00086 
00087 void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
00088 {
00089   QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
00090 
00091   QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
00092                                           i18n("Date && Time"),parent);
00093   timeLayout->addWidget(timeGroupBox);
00094 
00095   QFrame *timeBoxFrame = new QFrame(timeGroupBox);
00096 
00097   QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,1,1);
00098   layoutTimeBox->setSpacing(topLayout->spacing());
00099 
00100 
00101   mDueCheck = new QCheckBox(i18n("&Due:"),timeBoxFrame);
00102   layoutTimeBox->addWidget(mDueCheck,0,0);
00103   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
00104   connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
00105 
00106 
00107   mDueDateEdit = new KDateEdit(timeBoxFrame);
00108   layoutTimeBox->addWidget(mDueDateEdit,0,1);
00109 
00110   mDueTimeEdit = new KOTimeEdit(timeBoxFrame);
00111   layoutTimeBox->addWidget(mDueTimeEdit,0,2);
00112 
00113 
00114   mStartCheck = new QCheckBox(i18n("Sta&rt:"),timeBoxFrame);
00115   layoutTimeBox->addWidget(mStartCheck,1,0);
00116   connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
00117 
00118   mStartDateEdit = new KDateEdit(timeBoxFrame);
00119   layoutTimeBox->addWidget(mStartDateEdit,1,1);
00120 
00121   mStartTimeEdit = new KOTimeEdit(timeBoxFrame);
00122   layoutTimeBox->addWidget(mStartTimeEdit,1,2);
00123 
00124 
00125   mTimeButton = new QCheckBox(i18n("Ti&me associated"),timeBoxFrame);
00126   layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,2);
00127 
00128   connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
00129 
00130   // some more layouting
00131   layoutTimeBox->setColStretch(3,1);
00132 }
00133 
00134 
00135 void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
00136 {
00137   mCompletedCombo = new QComboBox(parent);
00138   // xgettext:no-c-format
00139   mCompletedCombo->insertItem(i18n("0 %"));
00140   // xgettext:no-c-format
00141   mCompletedCombo->insertItem(i18n("20 %"));
00142   // xgettext:no-c-format
00143   mCompletedCombo->insertItem(i18n("40 %"));
00144   // xgettext:no-c-format
00145   mCompletedCombo->insertItem(i18n("60 %"));
00146   // xgettext:no-c-format
00147   mCompletedCombo->insertItem(i18n("80 %"));
00148   // xgettext:no-c-format
00149   mCompletedCombo->insertItem(i18n("100 %"));
00150   connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
00151   topLayout->addWidget(mCompletedCombo);
00152 
00153   mCompletedLabel = new QLabel(i18n("co&mpleted"),parent);
00154   topLayout->addWidget(mCompletedLabel);
00155   mCompletedLabel->setBuddy( mCompletedCombo );
00156 }
00157 
00158 void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
00159 {
00160   QLabel *priorityLabel = new QLabel(i18n("&Priority:"),parent);
00161   topLayout->addWidget(priorityLabel);
00162 
00163   mPriorityCombo = new QComboBox(parent);
00164   mPriorityCombo->insertItem(i18n("1 (Highest)"));
00165   mPriorityCombo->insertItem(i18n("2"));
00166   mPriorityCombo->insertItem(i18n("3"));
00167   mPriorityCombo->insertItem(i18n("4"));
00168   mPriorityCombo->insertItem(i18n("5 (lowest)"));
00169   topLayout->addWidget(mPriorityCombo);
00170   priorityLabel->setBuddy( mPriorityCombo );
00171 }
00172 
00173 void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
00174 {
00175   QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
00176 
00177   initCompletion( parent, statusLayout );
00178 
00179   statusLayout->addStretch( 1 );
00180 
00181   initPriority( parent, statusLayout );
00182 }
00183 
00184 void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay)
00185 {
00186   KOEditorGeneral::setDefaults(allDay);
00187 
00188   mTimeButton->setChecked( !allDay );
00189   if(mTimeButton->isChecked()) {
00190     mTimeButton->setEnabled(true);
00191   }
00192   else {
00193     mTimeButton->setEnabled(false);
00194   }
00195 
00196   enableTimeEdits( !allDay );
00197 
00198   mDueCheck->setChecked(false);
00199   enableDueEdit(false);
00200 
00201   alarmDisable(true);
00202 
00203   mStartCheck->setChecked(false);
00204   enableStartEdit(false);
00205 
00206   mDueDateEdit->setDate(due.date());
00207   mDueTimeEdit->setTime(due.time());
00208 
00209   mStartDateEdit->setDate(QDate::currentDate());
00210   mStartTimeEdit->setTime(QTime::currentTime());
00211 
00212   mPriorityCombo->setCurrentItem(2);
00213 
00214   mCompletedCombo->setCurrentItem(0);
00215 }
00216 
00217 void KOEditorGeneralTodo::readTodo(Todo *todo)
00218 {
00219   KOEditorGeneral::readIncidence(todo);
00220 
00221   QDateTime dueDT;
00222 
00223   if (todo->hasDueDate()) {
00224     enableAlarmEdit(true);
00225     dueDT = todo->dtDue();
00226     mDueDateEdit->setDate(todo->dtDue().date());
00227     mDueTimeEdit->setTime(todo->dtDue().time());
00228     mDueCheck->setChecked(true);
00229   } else {
00230     alarmDisable(true);
00231     mDueDateEdit->setEnabled(false);
00232     mDueTimeEdit->setEnabled(false);
00233     mDueDateEdit->setDate(QDate::currentDate());
00234     mDueTimeEdit->setTime(QTime::currentTime());
00235     mDueCheck->setChecked(false);
00236   }
00237 
00238   if (todo->hasStartDate()) {
00239     mStartDateEdit->setDate(todo->dtStart().date());
00240     mStartTimeEdit->setTime(todo->dtStart().time());
00241     mStartCheck->setChecked(true);
00242   } else {
00243     mStartDateEdit->setEnabled(false);
00244     mStartTimeEdit->setEnabled(false);
00245     mStartDateEdit->setDate(QDate::currentDate());
00246     mStartTimeEdit->setTime(QTime::currentTime());
00247     mStartCheck->setChecked(false);
00248   }
00249 
00250   mTimeButton->setChecked( !todo->doesFloat() );
00251 
00252   mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
00253   if (todo->isCompleted() && todo->hasCompletedDate()) {
00254     mCompleted = todo->completed();
00255   }
00256   setCompletedDate();
00257 
00258   mPriorityCombo->setCurrentItem(todo->priority()-1);
00259 }
00260 
00261 void KOEditorGeneralTodo::writeTodo(Todo *todo)
00262 {
00263   KOEditorGeneral::writeIncidence(todo);
00264 
00265   // temp. until something better happens.
00266   QString tmpStr;
00267 
00268   todo->setHasDueDate(mDueCheck->isChecked());
00269   todo->setHasStartDate(mStartCheck->isChecked());
00270 
00271   QDate tmpDate;
00272   QTime tmpTime;
00273   QDateTime tmpDT;
00274   if ( mTimeButton->isChecked() ) {
00275     todo->setFloats(false);
00276 
00277     // set due date/time
00278     tmpDate = mDueDateEdit->date();
00279     tmpTime = mDueTimeEdit->getTime();
00280     tmpDT.setDate(tmpDate);
00281     tmpDT.setTime(tmpTime);
00282     todo->setDtDue(tmpDT);
00283 
00284     // set start date/time
00285     tmpDate = mStartDateEdit->date();
00286     tmpTime = mStartTimeEdit->getTime();
00287     tmpDT.setDate(tmpDate);
00288     tmpDT.setTime(tmpTime);
00289     todo->setDtStart(tmpDT);
00290   } else {
00291     todo->setFloats(true);
00292 
00293     // need to change this.
00294     tmpDate = mDueDateEdit->date();
00295     tmpTime.setHMS(0,0,0);
00296     tmpDT.setDate(tmpDate);
00297     tmpDT.setTime(tmpTime);
00298     todo->setDtDue(tmpDT);
00299 
00300     tmpDate = mStartDateEdit->date();
00301     tmpTime.setHMS(0,0,0);
00302     tmpDT.setDate(tmpDate);
00303     tmpDT.setTime(tmpTime);
00304     todo->setDtStart(tmpDT);
00305   }
00306 
00307   todo->setPriority(mPriorityCombo->currentItem()+1);
00308 
00309   // set completion state
00310   todo->setPercentComplete(mCompletedCombo->currentItem() * 20);
00311 
00312   if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
00313     todo->setCompleted(mCompleted);
00314   }
00315 }
00316 
00317 void KOEditorGeneralTodo::enableDueEdit(bool enable)
00318 {
00319   mDueDateEdit->setEnabled( enable );
00320 
00321   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00322     mTimeButton->setEnabled(true);
00323   }
00324   else {
00325     mTimeButton->setEnabled(false);
00326     mTimeButton->setChecked(false);
00327   }
00328 
00329   if (enable) {
00330     mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
00331   } else {
00332     mDueTimeEdit->setEnabled( false );
00333   }
00334 }
00335 
00336 void KOEditorGeneralTodo::enableStartEdit( bool enable )
00337 {
00338   mStartDateEdit->setEnabled( enable );
00339 
00340   if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
00341     mTimeButton->setEnabled(true);
00342   }
00343   else {
00344     mTimeButton->setEnabled(false);
00345     mTimeButton->setChecked(false);
00346   }
00347 
00348   if (enable) {
00349     mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
00350   } else {
00351     mStartTimeEdit->setEnabled( false );
00352   }
00353 }
00354 
00355 void KOEditorGeneralTodo::enableTimeEdits(bool enable)
00356 {
00357   if(mStartCheck->isChecked()) {
00358     mStartTimeEdit->setEnabled( enable );
00359   }
00360   if(mDueCheck->isChecked()) {
00361     mDueTimeEdit->setEnabled( enable );
00362   }
00363 }
00364 
00365 void KOEditorGeneralTodo::showAlarm()
00366 {
00367   if ( mDueCheck->isChecked() ) {
00368     alarmDisable(false);
00369   }
00370   else {
00371     alarmDisable(true);
00372   }
00373 }
00374 
00375 bool KOEditorGeneralTodo::validateInput()
00376 {
00377   if (mDueCheck->isChecked()) {
00378     if (!mDueDateEdit->inputIsValid()) {
00379       KMessageBox::sorry(0,i18n("Please specify a valid due date."));
00380       return false;
00381     }
00382     if (mTimeButton->isChecked()) {
00383       if (!mDueTimeEdit->inputIsValid()) {
00384         KMessageBox::sorry(0,i18n("Please specify a valid due time."));
00385         return false;
00386       }
00387     }
00388   }
00389 
00390   if (mStartCheck->isChecked()) {
00391     if (!mStartDateEdit->inputIsValid()) {
00392       KMessageBox::sorry(0,i18n("Please specify a valid start date."));
00393       return false;
00394     }
00395     if (mTimeButton->isChecked()) {
00396       if (!mStartTimeEdit->inputIsValid()) {
00397         KMessageBox::sorry(0,i18n("Please specify a valid start time."));
00398         return false;
00399       }
00400     }
00401   }
00402 
00403   if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
00404     QDateTime startDate;
00405     QDateTime dueDate;
00406     startDate.setDate(mStartDateEdit->date());
00407     dueDate.setDate(mDueDateEdit->date());
00408     if (mTimeButton->isChecked()) {
00409       startDate.setTime(mStartTimeEdit->getTime());
00410       dueDate.setTime(mDueTimeEdit->getTime());
00411     }
00412     if (startDate > dueDate) {
00413       KMessageBox::sorry(0,
00414                          i18n("The start date cannot be after the due date."));
00415       return false;
00416     }
00417   }
00418 
00419   return KOEditorGeneral::validateInput();
00420 }
00421 
00422 void KOEditorGeneralTodo::completedChanged(int index)
00423 {
00424   if (index == 5) {
00425     mCompleted = QDateTime::currentDateTime();
00426   }
00427   setCompletedDate();
00428 }
00429 
00430 void KOEditorGeneralTodo::setCompletedDate()
00431 {
00432   if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
00433     mCompletedLabel->setText(i18n("co&mpleted on %1")
00434         .arg(KGlobal::locale()->formatDateTime(mCompleted)));
00435   } else {
00436     mCompletedLabel->setText(i18n("co&mpleted"));
00437   }
00438 }
00439 
00440 void KOEditorGeneralTodo::modified (Todo* todo, int modification)
00441 {
00442   switch (modification) {
00443   case KOGlobals::PRIORITY_MODIFIED:
00444     mPriorityCombo->setCurrentItem(todo->priority()-1);
00445     break;
00446   case KOGlobals::COMPLETION_MODIFIED:
00447     mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
00448     if (todo->isCompleted() && todo->hasCompletedDate()) {
00449       mCompleted = todo->completed();
00450     }
00451     setCompletedDate();
00452     break;
00453   case KOGlobals::CATEGORY_MODIFIED:
00454     setCategories (todo->categoriesStr ());
00455     break;
00456   case KOGlobals::UNKNOWN_MODIFIED: // fall through
00457   default:
00458     readTodo( todo );
00459     break;
00460   }
00461 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:38:29 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003