Fixed KAlarm event date/time selection for recurrent events. This relates to bug 304.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/21/head
Michele Calgaro 9 years ago
parent 0aae3df09e
commit 74a91e1315

@ -1374,13 +1374,20 @@ void EditAlarmDlg::slotOk()
return;
}
}
if (!checkCommandData()
|| !checkEmailData())
if (!checkCommandData() || !checkEmailData())
return;
if (!mTemplate)
{
if (timedRecurrence)
{
// For daily, weekly, monthly and yearly recurrences, check that the
// specified date matches the allowed days of the week
if (!mRecurrenceEdit->validateDate(mAlarmDateTime))
{
KMessageBox::sorry(this, i18n("The date/time in the Alarm tab does not "
"match the recurrence settings specified in the Recurrence tab."));
return;
}
TQDateTime now = TQDateTime::currentDateTime();
if (mAlarmDateTime.date() < now.date()
|| mAlarmDateTime.date() == now.date()
@ -1415,7 +1422,7 @@ void EditAlarmDlg::slotOk()
KAEvent recurEvent;
int longestRecurInterval = -1;
int reminder = mReminder->minutes();
if (reminder && !mReminder->isOnceOnly())
if (reminder && !mReminder->isOnceOnly())
{
mRecurrenceEdit->updateEvent(recurEvent, false);
longestRecurInterval = recurEvent.longestRecurrenceInterval();
@ -1423,8 +1430,7 @@ void EditAlarmDlg::slotOk()
{
mTabs->setCurrentPage(mMainPageIndex);
mReminder->setFocusOnCount();
KMessageBox::sorry(this, i18n("Reminder period must be less than the recurrence interval, unless '%1' is checked."
).arg(Reminder::i18n_first_recurrence_only()));
KMessageBox::sorry(this, i18n("Reminder period must be less than the recurrence interval, unless '%1' is checked.").arg(Reminder::i18n_first_recurrence_only()));
return;
}
}

@ -530,6 +530,99 @@ void RecurrenceEdit::activateSubRepetition()
mSubRepetition->activate();
}
/******************************************************************************
* For weekly, monthly and yearly recurrence, checks that the specified date
* matches the days allowed. For the other recurrence simply return true.
*/
bool RecurrenceEdit::validateDate(const DateTime &date) const
{
if (mRuleButtonType == RecurrenceEdit::DAILY)
{
TQBitArray selectedDays = mDailyRule->days();
if (!selectedDays[date.date().dayOfWeek()-1])
return false;
}
else if (mRuleButtonType == RecurrenceEdit::WEEKLY)
{
TQBitArray selectedDays = mWeeklyRule->days();
if (!selectedDays[date.date().dayOfWeek()-1])
return false;
}
else if (mRuleButtonType == RecurrenceEdit::MONTHLY)
{
if (mMonthlyRule->type() == MonthYearRule::DATE)
{
// on the nth day of the month
int comboDate = mMonthlyRule->date();
if ((comboDate > 0 && date.date().day() != comboDate) ||
(comboDate <=0 && date.date().day() != date.date().daysInMonth()))
return false;
}
else
{
// on the nth weekday (i.e. Monday) of the month
if (date.date().dayOfWeek() != mMonthlyRule->dayOfWeek())
return false;
int monthDay = date.date().day();
int weekNum = mMonthlyRule->week();
int minDay = 0, maxDay = 0;
if (weekNum > 0 )
{
minDay = (weekNum-1) * 7;
maxDay = weekNum * 7;
}
else if (weekNum < 0)
{
int dim = date.date().daysInMonth();
minDay = dim + weekNum * 7;
maxDay = dim + (weekNum+1) * 7;
}
if (monthDay <= minDay || monthDay > maxDay)
return false;
}
}
else if (mRuleButtonType == RecurrenceEdit::ANNUAL)
{
TQValueList<int> months = mYearlyRule->months();
if (!months.contains(date.date().month()))
return false;
if (mYearlyRule->type() == MonthYearRule::DATE)
{
// on the nth day of the month
int comboDate = mYearlyRule->date();
if ((comboDate > 0 && date.date().day() != comboDate) ||
(comboDate <=0 && date.date().day() != date.date().daysInMonth()))
return false;
}
else
{
// on the nth weekday (i.e. Monday) of the month
if (date.date().dayOfWeek() != mYearlyRule->dayOfWeek())
return false;
int monthDay = date.date().day();
int weekNum = mYearlyRule->week();
int minDay = 0, maxDay = 0;
if (weekNum > 0 )
{
minDay = (weekNum-1) * 7;
maxDay = weekNum * 7;
}
else if (weekNum < 0)
{
int dim = date.date().daysInMonth();
minDay = dim + weekNum * 7;
maxDay = dim + (weekNum+1) * 7;
}
if (monthDay <= minDay || monthDay > maxDay)
return false;
}
}
return true;
}
/******************************************************************************
* Called when the value of the repeat count field changes, to reset the
* minimum value to 1 if the value was 0.

@ -81,6 +81,7 @@ class RecurrenceEdit : public TQFrame
DateTime endDateTime() const;
bool stateChanged() const;
void activateSubRepetition();
bool validateDate(const DateTime &date) const;
static TQString i18n_Norecur(); // text of 'No recurrence' selection, lower case
static TQString i18n_NoRecur(); // text of 'No Recurrence' selection, initial capitals

Loading…
Cancel
Save