diff options
Diffstat (limited to 'korganizer/koeditorgeneraltodo.cpp')
-rw-r--r-- | korganizer/koeditorgeneraltodo.cpp | 240 |
1 files changed, 152 insertions, 88 deletions
diff --git a/korganizer/koeditorgeneraltodo.cpp b/korganizer/koeditorgeneraltodo.cpp index dd2a77b5c..d659e8e95 100644 --- a/korganizer/koeditorgeneraltodo.cpp +++ b/korganizer/koeditorgeneraltodo.cpp @@ -38,13 +38,13 @@ #include <kglobal.h> #include <klocale.h> -#include <kiconloader.h> #include <kmessagebox.h> #include <kdebug.h> #include <kstandarddirs.h> #include <kfiledialog.h> #include <ktextedit.h> +#include <libkcal/incidenceformatter.h> #include <libkcal/todo.h> #include <libkdepim/kdateedit.h> @@ -56,10 +56,10 @@ #include "koeditorgeneraltodo.h" #include "koeditorgeneraltodo.moc" -KOEditorGeneralTodo::KOEditorGeneralTodo(TQObject* parent, - const char* name) - : KOEditorGeneral( parent, name) +KOEditorGeneralTodo::KOEditorGeneralTodo( TQObject *parent, const char *name ) + : KOEditorGeneral( parent, name ) { + setType( "Todo" ); } KOEditorGeneralTodo::~KOEditorGeneralTodo() @@ -76,19 +76,17 @@ void KOEditorGeneralTodo::finishSetup() TQWidget::setTabOrder( mDueCheck, mDueDateEdit ); TQWidget::setTabOrder( mDueDateEdit, mDueTimeEdit ); TQWidget::setTabOrder( mDueTimeEdit, mTimeButton ); - TQWidget::setTabOrder( mTimeButton, mCompletedCombo ); + TQWidget::setTabOrder( mTimeButton, mRecEditButton ); + TQWidget::setTabOrder( mRecEditButton, mCompletedToggle ); + TQWidget::setTabOrder( mCompletedToggle, mCompletedCombo ); TQWidget::setTabOrder( mCompletedCombo, mPriorityCombo ); TQWidget::setTabOrder( mPriorityCombo, mAlarmButton ); TQWidget::setTabOrder( mAlarmButton, mAlarmTimeEdit ); TQWidget::setTabOrder( mAlarmTimeEdit, mAlarmIncrCombo ); -// TQWidget::setTabOrder( mAlarmIncrCombo, mAlarmSoundButton ); - TQWidget::setTabOrder( mAlarmIncrCombo, mAlarmEditButton ); -// TQWidget::setTabOrder( mAlarmSoundButton, mAlarmProgramButton ); -// TQWidget::setTabOrder( mAlarmProgramButton, mDescriptionEdit ); - TQWidget::setTabOrder( mAlarmEditButton, mDescriptionEdit ); + TQWidget::setTabOrder( mAlarmIncrCombo, mAlarmAdvancedButton ); + TQWidget::setTabOrder( mAlarmAdvancedButton, mDescriptionEdit ); TQWidget::setTabOrder( mDescriptionEdit, mCategoriesButton ); TQWidget::setTabOrder( mCategoriesButton, mSecrecyCombo ); -// TQWidget::setTabOrder( mSecrecyCombo, mDescriptionEdit ); mSummaryEdit->setFocus(); } @@ -134,7 +132,6 @@ void KOEditorGeneralTodo::initTime(TQWidget *parent,TQBoxLayout *topLayout) TQWhatsThis::add( mDueCheck, whatsThis ); layoutTimeBox->addWidget(mDueCheck,1,0); connect(mDueCheck,TQT_SIGNAL(toggled(bool)),TQT_SLOT(enableDueEdit(bool))); - connect(mDueCheck,TQT_SIGNAL(toggled(bool)),TQT_SLOT(showAlarm())); connect(mDueCheck,TQT_SIGNAL(toggled(bool)),TQT_SIGNAL(dueDateEditToggle(bool))); connect(mDueCheck,TQT_SIGNAL(toggled(bool)),TQT_SLOT(dateChanged())); @@ -153,13 +150,31 @@ void KOEditorGeneralTodo::initTime(TQWidget *parent,TQBoxLayout *topLayout) TQWhatsThis::add( mTimeButton, i18n("Sets whether or not this to-do's start and due dates " "have times associated with them.") ); - layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,2); - + layoutTimeBox->addWidget( mTimeButton, 0, 3 ); connect(mTimeButton,TQT_SIGNAL(toggled(bool)),TQT_SLOT(enableTimeEdits(bool))); connect(mTimeButton,TQT_SIGNAL(toggled(bool)),TQT_SLOT(dateChanged())); + TQLabel *label = new TQLabel( i18n( "Recurrence:" ), timeBoxFrame ); + layoutTimeBox->addWidget( label, 3, 0 ); + TQBoxLayout *recLayout = new TQHBoxLayout(); + layoutTimeBox->addMultiCellLayout( recLayout, 3, 3, 1, 4 ); + mRecEditButton = new TQPushButton( timeBoxFrame ); + mRecEditButton->setIconSet( KOGlobals::self()->smallIconSet( "recur", 16 ) ); + recLayout->addWidget( mRecEditButton ); + connect( mRecEditButton, TQT_SIGNAL(clicked()), TQT_SIGNAL(editRecurrence()) ); + mRecEditLabel = new TQLabel( TQString(), timeBoxFrame ); + recLayout->addWidget( mRecEditLabel ); + recLayout->addStretch( 1 ); + + label = new TQLabel( i18n("Reminder:"), timeBoxFrame ); + layoutTimeBox->addWidget( label, 4, 0 ); + TQBoxLayout *alarmLineLayout = new TQHBoxLayout(); + layoutTimeBox->addMultiCellLayout( alarmLineLayout, 4, 4, 1, 4 ); + initAlarm( timeBoxFrame, alarmLineLayout ); + alarmLineLayout->addStretch( 1 ); + // some more layouting - layoutTimeBox->setColStretch(3,1); + layoutTimeBox->setColStretch( 3, 1 ); TQBoxLayout *secLayout = new TQHBoxLayout(); layoutTimeBox->addLayout( secLayout, 0, 4 ); @@ -167,54 +182,73 @@ void KOEditorGeneralTodo::initTime(TQWidget *parent,TQBoxLayout *topLayout) } -void KOEditorGeneralTodo::initCompletion(TQWidget *parent, TQBoxLayout *topLayout) +void KOEditorGeneralTodo::initCompletion( TQWidget *parent, TQBoxLayout *topLayout ) { - TQString whatsThis = i18n("Sets the current completion status of this to-do " - "as a percentage."); - mCompletedCombo = new TQComboBox(parent); - TQWhatsThis::add( mCompletedCombo, whatsThis ); - for (int i = 0; i <= 100; i+=10) { + TQHBoxLayout *completionLayout = new TQHBoxLayout( topLayout ); + + TQLabel *label = new TQLabel( i18n( "&Completed:" ), parent ); + completionLayout->addWidget( label ); + + mCompletedToggle = new TQCheckBox( parent ); + TQToolTip::add( mCompletedToggle, + i18n( "Toggle between 0% and 100% complete" ) ); + TQWhatsThis::add( mCompletedToggle, + i18n( "Click this checkbox to toggle the completed percentage of the to-do " + "between 0% or 100%" ) ); + connect( mCompletedToggle, TQT_SIGNAL(clicked()), TQT_SLOT(completedChanged()) ); + completionLayout->addWidget( mCompletedToggle ); + label->setBuddy( mCompletedToggle ); + + mCompletedCombo = new TQComboBox( parent ); + TQToolTip::add( mCompletedCombo, + i18n( "Select the completed percentage" ) ); + TQWhatsThis::add( mCompletedCombo, + i18n( "Use this combobox to set the completion percentage of the to-do." ) ); + for ( int i = 0; i <= 100; i+=10 ) { // xgettext:no-c-format - TQString label = i18n("Percent complete", "%1 %").arg (i); - mCompletedCombo->insertItem(label); + TQString label = i18n( "Percent complete", "%1 %" ).arg( i ); + mCompletedCombo->insertItem( label ); } - connect(mCompletedCombo,TQT_SIGNAL(activated(int)),TQT_SLOT(completedChanged(int))); - topLayout->addWidget(mCompletedCombo); + connect( mCompletedCombo, TQT_SIGNAL(activated(int)), TQT_SLOT(completedChanged(int)) ); + completionLayout->addWidget( mCompletedCombo ); + + mCompletedLabel = new TQLabel( i18n( "completed on", "on" ), parent ); + mCompletedLabel->hide(); + completionLayout->addWidget( mCompletedLabel ); - mCompletedLabel = new TQLabel(i18n("co&mpleted"),parent); - topLayout->addWidget(mCompletedLabel); - mCompletedLabel->setBuddy( mCompletedCombo ); mCompletionDateEdit = new KDateEdit( parent ); mCompletionDateEdit->hide(); - topLayout->addWidget( mCompletionDateEdit ); + completionLayout->addWidget( mCompletionDateEdit ); + mCompletionTimeEdit = new KTimeEdit( parent, TQTime() ); mCompletionTimeEdit->hide(); - topLayout->addWidget( mCompletionTimeEdit ); + completionLayout->addWidget( mCompletionTimeEdit ); } void KOEditorGeneralTodo::initPriority(TQWidget *parent, TQBoxLayout *topLayout) { - TQString whatsThis = i18n("Sets the priority of this to-do on a scale " - "from one to nine, with one being the highest " - "priority, five being a medium priority, and " - "nine being the lowest. In programs that have a " - "different scale, the numbers will be adjusted " - "to match the appropriate scale."); - TQLabel *priorityLabel = new TQLabel(i18n("&Priority:"),parent); - topLayout->addWidget(priorityLabel); - - mPriorityCombo = new TQComboBox(parent); - mPriorityCombo->insertItem(i18n("unspecified")); - mPriorityCombo->insertItem(i18n("1 (highest)")); - mPriorityCombo->insertItem(i18n("2")); - mPriorityCombo->insertItem(i18n("3")); - mPriorityCombo->insertItem(i18n("4")); - mPriorityCombo->insertItem(i18n("5 (medium)")); - mPriorityCombo->insertItem(i18n("6")); - mPriorityCombo->insertItem(i18n("7")); - mPriorityCombo->insertItem(i18n("8")); - mPriorityCombo->insertItem(i18n("9 (lowest)")); - topLayout->addWidget(mPriorityCombo); + TQLabel *priorityLabel = new TQLabel( i18n( "&Priority:" ), parent ); + topLayout->addWidget( priorityLabel ); + + mPriorityCombo = new TQComboBox( parent ); + TQToolTip::add( mPriorityCombo, + i18n( "Set the priority of the to-do" ) ); + TQWhatsThis::add( mPriorityCombo, + i18n( "Sets the priority of this to-do on a scale from one to nine, " + "with one being the highest priority, five being a medium priority, " + "and nine being the lowest. In programs that have a different scale, " + "the numbers will be adjusted to match the appropriate scale." ) ); + mPriorityCombo->insertItem( i18n( "unspecified" ) ); + mPriorityCombo->insertItem( i18n( "1 (highest)" ) ); + mPriorityCombo->insertItem( i18n( "2" ) ); + mPriorityCombo->insertItem( i18n( "3" ) ); + mPriorityCombo->insertItem( i18n( "4" ) ); + mPriorityCombo->insertItem( i18n( "5 (medium)" ) ); + mPriorityCombo->insertItem( i18n( "6" ) ); + mPriorityCombo->insertItem( i18n( "7" ) ); + mPriorityCombo->insertItem( i18n( "8" ) ); + mPriorityCombo->insertItem( i18n( "9 (lowest)" ) ); + topLayout->addWidget( mPriorityCombo ); priorityLabel->setBuddy( mPriorityCombo ); } @@ -263,25 +297,29 @@ void KOEditorGeneralTodo::setDefaults( const TQDateTime &due, bool allDay ) } mStartDateModified = false; - mPriorityCombo->setCurrentItem(5); + mPriorityCombo->setCurrentItem( 5 ); - mCompletedCombo->setCurrentItem(0); + mCompletedToggle->setChecked( false ); + mCompletedCombo->setCurrentItem( 0 ); } -void KOEditorGeneralTodo::readTodo(Todo *todo, Calendar *calendar) +void KOEditorGeneralTodo::readTodo(Todo *todo, Calendar *calendar, const TQDate &date ) { KOEditorGeneral::readIncidence(todo, calendar); TQDateTime dueDT; if (todo->hasDueDate()) { - enableAlarm( true ); dueDT = todo->dtDue(); - mDueDateEdit->setDate(todo->dtDue().date()); - mDueTimeEdit->setTime(todo->dtDue().time()); + if ( todo->doesRecur() && date.isValid() ) { + TQDateTime dt( date, TQTime( 0, 0, 0 ) ); + dt = dt.addSecs( -1 ); + dueDT.setDate( todo->recurrence()->getNextDateTime( dt ).date() ); + } + mDueDateEdit->setDate(dueDT.date()); + mDueTimeEdit->setTime(dueDT.time()); mDueCheck->setChecked(true); } else { - enableAlarm( false ); mDueDateEdit->setEnabled(false); mDueTimeEdit->setEnabled(false); mDueDateEdit->setDate(TQDate::currentDate()); @@ -290,8 +328,13 @@ void KOEditorGeneralTodo::readTodo(Todo *todo, Calendar *calendar) } if (todo->hasStartDate()) { - mStartDateEdit->setDate(todo->dtStart().date()); - mStartTimeEdit->setTime(todo->dtStart().time()); + TQDateTime startDT = todo->dtStart(); + if ( todo->doesRecur() && date.isValid() && todo->hasDueDate() ) { + int days = todo->dtStart( true ).daysTo( todo->dtDue( true ) ); + startDT.setDate( date.addDays( -days ) ); + } + mStartDateEdit->setDate(startDT.date()); + mStartTimeEdit->setTime(startDT.time()); mStartCheck->setChecked(true); } else { mStartDateEdit->setEnabled(false); @@ -303,10 +346,13 @@ void KOEditorGeneralTodo::readTodo(Todo *todo, Calendar *calendar) mTimeButton->setChecked( !todo->doesFloat() ); + updateRecurrenceSummary( todo ); + mAlreadyComplete = false; - mCompletedCombo->setCurrentItem(todo->percentComplete() / 10); - if (todo->isCompleted() && todo->hasCompletedDate()) { - mCompleted = todo->completed(); + mCompletedCombo->setCurrentItem( todo->percentComplete() / 10 ); + if ( todo->isCompleted() && todo->hasCompletedDate() ) { + mCompletedDateTime = todo->completed(); + mCompletedToggle->setChecked( true ); mAlreadyComplete = true; } setCompletedDate(); @@ -369,25 +415,25 @@ void KOEditorGeneralTodo::writeTodo(Todo *todo) if ( todo->doesRecur() && !mStartDateModified ) { todo->setDtDue( tmpDueDT ); } else { - todo->setDtDue( tmpDueDT, true ); - todo->setDtStart( tmpStartDT ); - todo->setDtRecurrence( tmpDueDT ); + todo->setDtDue( tmpDueDT, true ); + todo->setDtStart( tmpStartDT ); + todo->setDtRecurrence( tmpDueDT ); } todo->setPriority( mPriorityCombo->currentItem() ); // set completion state - todo->setPercentComplete(mCompletedCombo->currentItem() * 10); + todo->setPercentComplete( mCompletedCombo->currentItem() * 10 ); - if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) { + if (mCompletedCombo->currentItem() == 10 && mCompletedDateTime.isValid()) { TQDateTime completed( mCompletionDateEdit->date(), mCompletionTimeEdit->getTime() ); - int difference = mCompleted.secsTo( completed ); + int difference = mCompletedDateTime.secsTo( completed ); if ( (difference < 60) && (difference > -60) && - (completed.time().minute() == mCompleted.time().minute() ) ) { + (completed.time().minute() == mCompletedDateTime.time().minute() ) ) { // completion time wasn't changed substantially (only the seconds // truncated, but that's an effect done by KTimeEdit automatically). - completed = mCompleted; + completed = mCompletedDateTime; } todo->setCompleted( completed ); } @@ -439,11 +485,6 @@ void KOEditorGeneralTodo::enableTimeEdits(bool enable) } } -void KOEditorGeneralTodo::showAlarm() -{ - enableAlarm( mDueCheck->isChecked() ); -} - bool KOEditorGeneralTodo::validateInput() { if (mDueCheck->isChecked()) { @@ -491,10 +532,33 @@ bool KOEditorGeneralTodo::validateInput() return KOEditorGeneral::validateInput(); } -void KOEditorGeneralTodo::completedChanged(int index) +void KOEditorGeneralTodo::updateRecurrenceSummary( Todo *todo ) +{ + if ( todo->doesRecur() ) { + mRecEditLabel->setText( IncidenceFormatter::recurrenceString( todo ) ); + } else { + mRecEditLabel->setText( TQString() ); + } +} + +void KOEditorGeneralTodo::completedChanged( int index ) { - if (index == 10) { - mCompleted = TQDateTime::currentDateTime(); + if ( index == 10 ) { + mCompletedToggle->setChecked( true ); + mCompletedDateTime = TQDateTime::currentDateTime(); + } else { + mCompletedToggle->setChecked( false ); + } + setCompletedDate(); +} + +void KOEditorGeneralTodo::completedChanged() +{ + if ( mCompletedToggle->isChecked() ) { + mCompletedCombo->setCurrentItem( 10 ); + mCompletedDateTime = TQDateTime::currentDateTime(); + } else { + mCompletedCombo->setCurrentItem( 0 ); } setCompletedDate(); } @@ -533,21 +597,20 @@ void KOEditorGeneralTodo::startDateModified() void KOEditorGeneralTodo::setCompletedDate() { - if (mCompletedCombo->currentItem() == 10 && mCompleted.isValid()) { - mCompletedLabel->setText(i18n("co&mpleted on")); -// .arg(KGlobal::locale()->formatDateTime(mCompleted))); + if ( mCompletedCombo->currentItem() == 10 && mCompletedDateTime.isValid() ) { + mCompletedLabel->show(); mCompletionDateEdit->show(); mCompletionTimeEdit->show(); - mCompletionDateEdit->setDate( mCompleted.date() ); - mCompletionTimeEdit->setTime( mCompleted.time() ); + mCompletionDateEdit->setDate( mCompletedDateTime.date() ); + mCompletionTimeEdit->setTime( mCompletedDateTime.time() ); } else { - mCompletedLabel->setText(i18n("co&mpleted")); + mCompletedLabel->hide(); mCompletionDateEdit->hide(); mCompletionTimeEdit->hide(); } } -void KOEditorGeneralTodo::modified (Todo* todo, int modification) +void KOEditorGeneralTodo::modified (Todo* todo, KOGlobals::HowChanged modification) { switch (modification) { case KOGlobals::PRIORITY_MODIFIED: @@ -556,7 +619,8 @@ void KOEditorGeneralTodo::modified (Todo* todo, int modification) case KOGlobals::COMPLETION_MODIFIED: mCompletedCombo->setCurrentItem(todo->percentComplete() / 10); if (todo->isCompleted() && todo->hasCompletedDate()) { - mCompleted = todo->completed(); + mCompletedDateTime = todo->completed(); + mCompletedToggle->setChecked( true ); } setCompletedDate(); break; @@ -565,7 +629,7 @@ void KOEditorGeneralTodo::modified (Todo* todo, int modification) break; case KOGlobals::UNKNOWN_MODIFIED: // fall through default: - readTodo( todo, 0 ); + readTodo( todo, 0, TQDate() ); break; } } |