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.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:31 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003