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
#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
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
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
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
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
00285 tmpDDate = mDueDateEdit->date();
00286 tmpDTime = mDueTimeEdit->getTime();
00287 tmpDueDT.setDate(tmpDDate);
00288 tmpDueDT.setTime(tmpDTime);
00289
00290
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
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
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:
00509
default:
00510 readTodo( todo );
00511
break;
00512 }
00513 }