author | zautrix <zautrix> | 2004-07-10 17:03:16 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-07-10 17:03:16 (UTC) |
commit | cf2f3f98a4811668f9e9d0d5f44ea5b51d268cef (patch) (side-by-side diff) | |
tree | 963322cd4c539c084feb43dfde5eabe52ae4385f | |
parent | 8cc6d456812b5a9a386e81c9e46baccd56029537 (diff) | |
download | kdepimpi-cf2f3f98a4811668f9e9d0d5f44ea5b51d268cef.zip kdepimpi-cf2f3f98a4811668f9e9d0d5f44ea5b51d268cef.tar.gz kdepimpi-cf2f3f98a4811668f9e9d0d5f44ea5b51d268cef.tar.bz2 |
Fixed some problems with the recurrence
-rw-r--r-- | korganizer/koeditorrecurrence.cpp | 125 | ||||
-rw-r--r-- | korganizer/koeditorrecurrence.h | 9 | ||||
-rw-r--r-- | libkcal/icalformatimpl.cpp | 20 | ||||
-rw-r--r-- | libkcal/recurrence.cpp | 17 | ||||
-rw-r--r-- | libkcal/recurrence.h | 6 |
5 files changed, 110 insertions, 67 deletions
diff --git a/korganizer/koeditorrecurrence.cpp b/korganizer/koeditorrecurrence.cpp index 98356fe..ffc0fac 100644 --- a/korganizer/koeditorrecurrence.cpp +++ b/korganizer/koeditorrecurrence.cpp @@ -295,89 +295,88 @@ RecurYearly::RecurYearly( QWidget *parent, const char *name ) : freqLayout->addWidget( preLabel ); freqLayout->addWidget( frequencyEdit() ); QLabel *postLabel = new QLabel( i18n("year(s)"), this ); freqLayout->addWidget( postLabel ); QButtonGroup *buttonGroup = new QButtonGroup( this ); buttonGroup->setFrameStyle( QFrame::NoFrame ); topLayout->addWidget( buttonGroup, 1, AlignVCenter ); - QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 3, 2 ); - - QString recurInMonthText; - if ( !KOPrefs::instance()->mCompactDialogs ) { - recurInMonthText = i18n("Recur in the month of"); - } - - mByMonthRadio = new QRadioButton( recurInMonthText, buttonGroup); - buttonLayout->addWidget( mByMonthRadio, 0, 0 ); + QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 2, 3 ); + mByMonthRadio = new QRadioButton( i18n("On day "), buttonGroup); + buttonLayout->addWidget( mByMonthRadio, 0, 0 , Qt::AlignRight); + mByDayLabel = new QLabel( i18n(" 1 of "), buttonGroup ); + + buttonLayout->addWidget( mByDayLabel, 0, 1 ); mByMonthCombo = new QComboBox( buttonGroup ); mByMonthCombo->insertItem( i18n("January") ); mByMonthCombo->insertItem( i18n("February") ); mByMonthCombo->insertItem( i18n("March") ); mByMonthCombo->insertItem( i18n("April") ); mByMonthCombo->insertItem( i18n("May") ); mByMonthCombo->insertItem( i18n("June") ); mByMonthCombo->insertItem( i18n("July") ); mByMonthCombo->insertItem( i18n("August") ); mByMonthCombo->insertItem( i18n("September") ); mByMonthCombo->insertItem( i18n("October") ); mByMonthCombo->insertItem( i18n("November") ); mByMonthCombo->insertItem( i18n("December") ); - buttonLayout->addWidget( mByMonthCombo, 0, 1 ); - - mByMonthCombo->setSizeLimit( 6 ); - - buttonLayout->setRowStretch( 1, 1 ); - - QString recurOnDayText; - if ( KOPrefs::instance()->mCompactDialogs ) { - recurOnDayText = i18n("This day"); - } else { - recurOnDayText = i18n("Recur on this day"); - } - - mByDayRadio = new QRadioButton( recurOnDayText, buttonGroup); - buttonLayout->addMultiCellWidget( mByDayRadio, 2, 2, 0, 1 ); + buttonLayout->addWidget( mByMonthCombo, 0, 2,Qt::AlignLeft ); + if ( QApplication::desktop()->width() <= 640 ) { + mByMonthCombo->setSizeLimit( 6 ); + } + + mByDayRadio = new QRadioButton( i18n("On day "), buttonGroup); + buttonLayout->addWidget( mByDayRadio, 1, 0 , Qt::AlignRight); + mDayOfLabel = new QLabel( i18n("1 of the year"), buttonGroup ); + buttonLayout->addMultiCellWidget( mDayOfLabel, 1, 1, 1,3 ); + } -void RecurYearly::setByDay() +void RecurYearly::setByDay( int doy ) { mByDayRadio->setChecked( true ); + mDayOfLabel->setText(i18n("%1 of the year").arg( doy ) ); } -void RecurYearly::setByMonth( int month ) +void RecurYearly::setByMonth( int month, int day ) { mByMonthRadio->setChecked( true ); mByMonthCombo->setCurrentItem( month - 1 ); + mByDayLabel->setText(i18n("%1 of ").arg( day ) ); + mDay = day; } bool RecurYearly::byMonth() { return mByMonthRadio->isChecked(); } bool RecurYearly::byDay() { return mByDayRadio->isChecked(); } int RecurYearly::month() { return mByMonthCombo->currentItem() + 1; } +int RecurYearly::day() +{ + return mDay;//mByDayCombo->currentItem() + 1; +} //////////////////////////// ExceptionsWidget ////////////////////////// ExceptionsWidget::ExceptionsWidget( QWidget *parent, const char *name ) : QWidget( parent, name ) { QBoxLayout *topLayout = new QVBoxLayout( this ); QGroupBox *groupBox = new QGroupBox( 1, Horizontal, i18n("Exceptions"), this ); topLayout->addWidget( groupBox ); @@ -835,24 +834,25 @@ KOEditorRecurrence::~KOEditorRecurrence() { } void KOEditorRecurrence::setEnabled( bool enabled ) { // kdDebug() << "KOEditorRecurrence::setEnabled(): " << (enabled ? "on" : "off") << endl; mTimeGroupBox->setEnabled( enabled ); if ( mRecurrenceRangeWidget ) mRecurrenceRangeWidget->setEnabled( enabled ); if ( mRecurrenceRangeButton ) mRecurrenceRangeButton->setEnabled( enabled ); if ( mExceptionsWidget ) mExceptionsWidget->setEnabled( enabled ); if ( mExceptionsButton ) mExceptionsButton->setEnabled( enabled ); + mRuleBox->setEnabled( enabled ); } void KOEditorRecurrence::showCurrentRule( int current ) { switch ( current ) { case Daily: mRuleStack->raiseWidget( mDaily ); break; case Weekly: mRuleStack->raiseWidget( mWeekly ); break; case Monthly: @@ -886,35 +886,37 @@ void KOEditorRecurrence::setDefaults( QDateTime from, QDateTime to, bool ) mExceptions->setDefaults( to ); mRecurrenceRange->setDefaults( to ); mRecurrenceChooser->setType( RecurrenceChooser::Weekly ); showCurrentRule( mRecurrenceChooser->type() ); mDaily->setFrequency( 1 ); mWeekly->setFrequency( 1 ); QBitArray days( 7 ); days.fill( 0 ); + days.setBit( from.date().dayOfWeek()- 1); mWeekly->setDays( days ); - mMonthly->setFrequency( 1 ); + mMonthly->setByPos((from.date().day()/7), from.date().dayOfWeek()-1 ); mMonthly->setByDay( from.date().day()-1 ); - mYearly->setFrequency( 1 ); - mYearly->setByDay(); + mYearly->setByDay( from.date().dayOfYear() ); + mYearly->setByMonth( from.date().month(), from.date().day() ); } void KOEditorRecurrence::readEvent(Event *event) { + setDefaults( event->dtStart(), event->dtEnd(), true ); QBitArray rDays( 7 ); QPtrList<Recurrence::rMonthPos> rmp; QPtrList<int> rmd; int day = 0; int count = 0; int month = 0; setDateTimes( event->dtStart(), event->dtEnd() ); Recurrence *r = event->recurrence(); int f = r->frequency(); int recurs = r->doesRecur(); @@ -957,37 +959,55 @@ void KOEditorRecurrence::readEvent(Event *event) break; case Recurrence::rMonthlyDay: recurrenceType = RecurrenceChooser::Monthly; rmd = r->monthDays(); day = *rmd.first() - 1; mMonthly->setByDay( day ); mMonthly->setFrequency( f ); break; case Recurrence::rYearlyMonth: - case Recurrence::rYearlyDay: - recurrenceType = RecurrenceChooser::Yearly; - - rmd = r->yearNums(); - month = *rmd.first(); - if ( month == event->dtStart().date().month() ) { - mYearly->setByDay(); - } else { - mYearly->setByMonth( month ); - } + { + recurrenceType = RecurrenceChooser::Yearly; + qDebug("Recurrence::rYearlyMonth: "); + day = event->dtStart().date().day(); + rmd = r->yearNums(); + if ( rmd.count() > 0 ) + month = *rmd.first(); + else + month = event->dtStart().date().month() ; + mYearly->setByMonth( month, day ); +#if 0 + qDebug("2day = %d ",day ); + QPtrList<Recurrence::rMonthPos> monthlist = r->yearMonthPositions(); + int month; + if ( !monthlist.isEmpty() ) { + month = monthlist.first()->rPos ; + } else { + month = event->dtStart().date().month() ; + } + mYearly->setByMonth( day, month ); +#endif + mYearly->setFrequency( f ); + } - mYearly->setFrequency( f ); break; + case Recurrence::rYearlyDay: + qDebug("Recurrence::rYearlyDay: "); + recurrenceType = RecurrenceChooser::Yearly; + mYearly->setByDay( event->dtStart().date().dayOfYear() ); + mYearly->setFrequency( f ); + break; default: setDefaults( event->dtStart(), event->dtEnd(), true ); break; } mRecurrenceChooser->setType( recurrenceType ); showCurrentRule( recurrenceType ); mRecurrenceRange->setDateTimes( event->dtStart() ); if ( r->doesRecur() ) { mRecurrenceRange->setDuration( r->duration() ); @@ -1053,39 +1073,42 @@ void KOEditorRecurrence::writeEvent( Event *event ) } else { // it's by day int day = mMonthly->day(); if ( duration != 0 ) { r->setMonthly( Recurrence::rMonthlyDay, freq, duration ); } else { r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); } r->addMonthlyDay( day ); } } else if ( recurrenceType == RecurrenceChooser::Yearly ) { + qDebug("RecurrenceChooser::Yearly "); int freq = mYearly->frequency(); - - int month; - if ( mYearly->byMonth() ) { - month = mYearly->month(); - } else { - month = event->dtStart().date().month(); - } - if ( duration != 0 ) { - r->setYearly( Recurrence::rYearlyMonth, freq, duration ); + if ( mYearly->byDay() ) { + if ( duration != 0 ) { + r->setYearly( Recurrence::rYearlyDay, freq, duration ); + } else { + r->setYearly( Recurrence::rYearlyDay, freq, endDate ); + } + r->addYearlyNum( event->dtStart().date().dayOfYear() ); } else { - r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); + if ( duration != 0 ) { + r->setYearly( Recurrence::rYearlyMonth, freq, duration ); + } else { + r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); + } + r->addYearlyNum( mYearly->month() ); } - r->addYearlyNum( month ); } event->setExDates( mExceptions->dates() ); } } void KOEditorRecurrence::setDateTimeStr( const QString &str ) { mDateTimeLabel->setText( str ); } bool KOEditorRecurrence::validateInput() diff --git a/korganizer/koeditorrecurrence.h b/korganizer/koeditorrecurrence.h index 4f0f0b2..2b59085 100644 --- a/korganizer/koeditorrecurrence.h +++ b/korganizer/koeditorrecurrence.h @@ -100,36 +100,39 @@ class RecurMonthly : public RecurBase QComboBox *mByDayCombo; QRadioButton *mByPosRadio; QComboBox *mByPosCountCombo; QComboBox *mByPosWeekdayCombo; }; class RecurYearly : public RecurBase { public: RecurYearly( QWidget *parent = 0, const char *name = 0 ); - void setByDay(); - void setByMonth( int month ); + void setByDay( int doy ); + void setByMonth( int month, int day ); bool byMonth(); bool byDay(); int month(); + int day(); private: + int mDay; QRadioButton *mByMonthRadio; QComboBox *mByMonthCombo; - + QLabel* mByDayLabel; + QLabel* mDayOfLabel; QRadioButton *mByDayRadio; }; class RecurrenceChooser : public QWidget { Q_OBJECT public: RecurrenceChooser( QWidget *parent = 0, const char *name = 0 ); enum { Daily, Weekly, Monthly, Yearly }; void setType( int ); diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp index 32a1337..964ffe3 100644 --- a/libkcal/icalformatimpl.cpp +++ b/libkcal/icalformatimpl.cpp @@ -1383,25 +1383,25 @@ void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurre int frequ = r.freq; int interv = r.interval; // preprocessing for odd recurrence definitions if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { interv = 12; } } if ( r.freq == ICAL_YEARLY_RECURRENCE ) { if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { frequ = ICAL_MONTHLY_RECURRENCE; - interv = 12; + interv = 12* r.interval; } } switch (frequ) { case ICAL_MINUTELY_RECURRENCE: if (!icaltime_is_null_time(r.until)) { recur->setMinutely(interv,readICalDateTime(r.until)); } else { if (r.count == 0) recur->setMinutely(interv,-1); else recur->setMinutely(interv,r.count); @@ -1490,38 +1490,40 @@ void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurre recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); else recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); } while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { // kdDebug(5800) << "----b " << day << endl; recur->addMonthlyDay(day); } } break; case ICAL_YEARLY_RECURRENCE: if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { + qDebug(" YEARLY DAY OF YEAR"); if (!icaltime_is_null_time(r.until)) { recur->setYearly(Recurrence::rYearlyDay,interv, readICalDate(r.until)); } else { if (r.count == 0) recur->setYearly(Recurrence::rYearlyDay,interv,-1); else recur->setYearly(Recurrence::rYearlyDay,interv,r.count); } while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { recur->addYearlyNum(day); } } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { + qDebug("YEARLY POS NOT SUPPORTED BY GUI"); if (!icaltime_is_null_time(r.until)) { recur->setYearly(Recurrence::rYearlyPos,interv, readICalDate(r.until)); } else { if (r.count == 0) recur->setYearly(Recurrence::rYearlyPos,interv,-1); else recur->setYearly(Recurrence::rYearlyPos,interv,r.count); } bool useSetPos = false; short pos = 0; while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { @@ -1534,42 +1536,44 @@ void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurre recur->addYearlyMonthPos(pos,ba); } else { qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 useSetPos = true; } } if (useSetPos) { if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { recur->addYearlyMonthPos(r.by_set_pos[0],qba); } } } else { + qDebug("YEARLY MONTH "); if (!icaltime_is_null_time(r.until)) { recur->setYearly(Recurrence::rYearlyMonth,interv, readICalDate(r.until)); } else { if (r.count == 0) recur->setYearly(Recurrence::rYearlyMonth,interv,-1); else recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); } - } - if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { - index = 0; - while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { - recur->addYearlyNum(day); + if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { + index = 0; + while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { + recur->addYearlyNum(day); + } + } else { + recur->addYearlyNum(incidence->dtStart().date().month()); } - } else { - recur->addYearlyNum(incidence->dtStart().date().month()); } + } break; default: ; break; } } void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) { //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp index 5fc5d1f..dd74e10 100644 --- a/libkcal/recurrence.cpp +++ b/libkcal/recurrence.cpp @@ -645,25 +645,25 @@ void Recurrence::addMonthlyPos_(short _rPos, const QBitArray &_rDays) int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; int month = mRecurStart.date().month() - 1 + monthsAhead; QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); rDuration = INT_MAX; // ensure that recurCalc() does its job correctly rDuration = recurCalc(COUNT_TO_DATE, end); } if (mParent) mParent->updated(); } void Recurrence::addMonthlyDay(short _rDay) { - if (mRecurReadOnly || recurs != rMonthlyDay + if (mRecurReadOnly || (recurs != rMonthlyDay && recurs != rYearlyMonth) || _rDay == 0 || _rDay > 31 || _rDay < -31) // invalid day number return; for (int* it = rMonthDays.first(); it; it = rMonthDays.next()) { if (_rDay == *it) return; // this day is already in the list - avoid duplication } int *tmpDay = new int; *tmpDay = _rDay; rMonthDays.append(tmpDay); if (mCompatVersion < 310 && mCompatDuration > 0) { // Backwards compatibility for KDE < 3.1. @@ -716,25 +716,38 @@ void Recurrence::setYearlyByDate(Feb29Type type, int _rFreq, const QDate &_rEndD } void Recurrence::addYearlyMonthPos(short _rPos, const QBitArray &_rDays) { if (recurs == rYearlyPos) addMonthlyPos_(_rPos, _rDays); } const QPtrList<int> &Recurrence::yearNums() const { return rYearNums; } - +void Recurrence::addYearlyMonth(short _rPos ) +{ + if (mRecurReadOnly || recurs != rYearlyMonth) // invalid day/month number + return; + rMonthPos *tmpPos = new rMonthPos; + if ( _rPos > 0) { + tmpPos->rPos = _rPos; + tmpPos->negative = false; + } else { + tmpPos->rPos = -_rPos; // take abs() + tmpPos->negative = true; + } + rMonthPositions.append(tmpPos); +} void Recurrence::addYearlyNum(short _rNum) { if (mRecurReadOnly || (recurs != rYearlyMonth && recurs != rYearlyDay && recurs != rYearlyPos) || _rNum <= 0) // invalid day/month number return; if (mCompatVersion < 310 && mCompatRecurs == rYearlyDay) { // Backwards compatibility for KDE < 3.1. // Dates were stored as day numbers, with a fiddle to take account of leap years. // Convert the day number to a month. if (_rNum <= 0 || _rNum > 366 || (_rNum == 366 && mRecurStart.date().daysInYear() < 366)) diff --git a/libkcal/recurrence.h b/libkcal/recurrence.h index a0f6d84..b13d14f 100644 --- a/libkcal/recurrence.h +++ b/libkcal/recurrence.h @@ -279,30 +279,32 @@ class Recurrence */ void addYearlyMonthPos(short _rPos, const QBitArray &_rDays); /** Returns positions of days or months in year. */ const QPtrList<int> &yearNums() const; /** Returns list of day positions in months, for a recursYearlyPos recurrence rule. */ const QPtrList<rMonthPos> &yearMonthPositions() const; /** Returns how yearly recurrences of February 29th are handled. */ Feb29Type feb29YearlyType() const { return mFeb29YearlyType; } /** Sets the default method for handling yearly recurrences of February 29th. */ static void setFeb29YearlyTypeDefault(Feb29Type t) { mFeb29YearlyDefaultType = t; } /** Returns the default method for handling yearly recurrences of February 29th. */ static Feb29Type setFeb29YearlyTypeDefault() { return mFeb29YearlyDefaultType; } - + void addYearlyMonth(short _rPos ); // added LR /** Debug output. */ void dump() const; QString recurrenceText() const; + bool getYearlyMonthMonths(int day, QValueList<int>&, + QValueList<int> &leaplist) const; protected: enum PeriodFunc { END_DATE_AND_COUNT, COUNT_TO_DATE, NEXT_AFTER_DATE }; struct MonthlyData; friend struct MonthlyData; struct YearlyMonthData; friend struct YearlyMonthData; struct YearlyPosData; friend struct YearlyPosData; struct YearlyDayData; friend struct YearlyDayData; bool recursSecondly(const QDate &, int secondFreq) const; bool recursMinutelyAt(const QDateTime &dt, int minuteFreq) const; bool recursDaily(const QDate &) const; bool recursWeekly(const QDate &) const; @@ -337,26 +339,24 @@ class Recurrence int yearlyPosCalcEndDate(QDate& enddate, YearlyPosData&) const; int yearlyPosCalcToDate(const QDate& enddate, YearlyPosData&) const; int yearlyPosCalcNextAfter(QDate& enddate, YearlyPosData&) const; int yearlyDayCalc(PeriodFunc, QDate &enddate) const; int yearlyDayCalcEndDate(QDate& enddate, YearlyDayData&) const; int yearlyDayCalcToDate(const QDate& enddate, YearlyDayData&) const; int yearlyDayCalcNextAfter(QDate& enddate, YearlyDayData&) const; int countMonthlyPosDays() const; void getMonthlyPosDays(QValueList<int>&, int daysInMonth, int startDayOfWeek) const; bool getMonthlyDayDays(QValueList<int>&, int daysInMonth) const; - bool getYearlyMonthMonths(int day, QValueList<int>&, - QValueList<int> &leaplist) const; int getFirstDayInWeek(int startDay, bool useWeekStart = true) const; int getLastDayInWeek(int endDay, bool useWeekStart = true) const; QDate getFirstDateInMonth(const QDate& earliestDate) const; QDate getLastDateInMonth(const QDate& latestDate) const; QDate getFirstDateInYear(const QDate& earliestDate) const; QDate getLastDateInYear(const QDate& latestDate) const; private: // Prohibit copying Recurrence(const Recurrence&); Recurrence &operator=(const Recurrence&); |