00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
00131 layoutTimeBox->setColStretch(3,1);
00132 }
00133
00134
00135 void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
00136 {
00137 mCompletedCombo = new QComboBox(parent);
00138
00139 mCompletedCombo->insertItem(i18n("0 %"));
00140
00141 mCompletedCombo->insertItem(i18n("20 %"));
00142
00143 mCompletedCombo->insertItem(i18n("40 %"));
00144
00145 mCompletedCombo->insertItem(i18n("60 %"));
00146
00147 mCompletedCombo->insertItem(i18n("80 %"));
00148
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
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
00278 tmpDate = mDueDateEdit->date();
00279 tmpTime = mDueTimeEdit->getTime();
00280 tmpDT.setDate(tmpDate);
00281 tmpDT.setTime(tmpTime);
00282 todo->setDtDue(tmpDT);
00283
00284
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
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
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:
00457 default:
00458 readTodo( todo );
00459 break;
00460 }
00461 }