00001 #include "chrisholiday.h"
00002
00003 #include <qobject.h>
00004 #include <qpe/event.h>
00005
00006 QString ChrisHoliday::description()
00007 {
00008 return QObject::tr("Christian holidays","holidays");
00009 }
00010
00011 QStringList ChrisHoliday::entries(const QDate&aDate)
00012 {
00013 QStringList ret;
00014 ret+=_internallist.entries(aDate);
00015 calcit(aDate.year());
00016 tDayMap::Iterator it = _days.find(aDate);
00017 if (it!=_days.end()) {
00018 ret+=*it;
00019 }
00020
00021 return ret;
00022 }
00023
00024 QStringList ChrisHoliday::entries(unsigned year, unsigned month, unsigned day)
00025 {
00026 return entries(QDate(year,month,day));
00027 }
00028
00029 void ChrisHoliday::calcit(int year)
00030 {
00031 if (year==_lastyear) return;
00032 _lastyear = year;
00033 _days.clear();
00034 calc_easter();
00035 calc_christmas();
00036 }
00037
00038 void ChrisHoliday::calc_christmas()
00039 {
00040 QDate cday(_lastyear,12,24);
00041 int diff;
00042 if ( (diff=cday.dayOfWeek())!=7) {
00043 cday=cday.addDays(-diff);
00044 _days[cday].append(QObject::tr("4. Advent","holidays"));
00045 }
00046 _days[cday.addDays(-7)].append(QObject::tr("3. Advent","holidays"));
00047 _days[cday.addDays(-14)].append(QObject::tr("2. Advent","holidays"));
00048 _days[cday.addDays(-21)].append(QObject::tr("1. Advent","holidays"));
00049 }
00050
00051 void ChrisHoliday::calc_easter()
00052 {
00053 unsigned long n = 0;
00054 unsigned long p = 0;
00055
00056 if ( _lastyear > 1582 ) {
00057 unsigned long a = _lastyear%19;
00058 unsigned long b = _lastyear/100;
00059 unsigned long c = _lastyear%100;
00060 unsigned long d = b/4;
00061 unsigned long e = b%4;
00062 unsigned long f = (b+8)/25;
00063 unsigned long g = (b+f+1)/3;
00064 unsigned long h = (19*a+b-d-g+15)%30;
00065 unsigned long i = c/4;
00066 unsigned long j = c%4;
00067 unsigned long k = j%100;
00068 unsigned long l = (32+2*e+2*i-h-k)%7;
00069 unsigned long m = (a+11*h+22*l)/451;
00070 n = (h+l-7*m+114)/31;
00071 p = (h+l-7*m+114)%31;
00072 } else {
00073 unsigned long a = _lastyear%4;
00074 unsigned long b = _lastyear%7;
00075 unsigned long c = _lastyear%19;
00076 unsigned long d = (19*c+15)%30;
00077 unsigned long e = (2*a+4*b-d+34)%7;
00078 n = (d+e+114)/31;
00079 p = (d+e+114)%31;
00080 }
00081 p++;
00082 QDate d(_lastyear,n,p);
00083 _days[d].append(QObject::tr("Easter Sunday","holidays"));
00084 _days[d.addDays(-2)].append(QObject::tr("Good Friday","holidays"));
00085 _days[d.addDays(49)].append(QObject::tr("Whitsunday","holidays"));
00086 _days[d.addDays(50)].append(QObject::tr("Whitmonday","holidays"));
00087 _days[d.addDays(39)].append(QObject::tr("Ascension Day","holidays"));
00088 _days[d.addDays(-46)].append(QObject::tr("Ash Wednesday","holidays"));
00089 _days[d.addDays(60)].append(QObject::tr("Corpus Christi","holidays"));
00090 }
00091
00092 QMap<QDate,QStringList> ChrisHoliday::entries(const QDate&start,const QDate&end)
00093 {
00094 QMap<QDate,QStringList> ret;
00095 if (start==end) {
00096 ret[start]=entries(start);
00097 return ret;
00098 }
00099 QDate d;
00100 int daysto;
00101 if (end < start) {
00102 d = end;
00103 daysto = end.daysTo(start);
00104 } else {
00105 d = start;
00106 daysto = start.daysTo(end);
00107 }
00108 QStringList temp;
00109 for (int i=0;i<=daysto;++i) {
00110 temp = entries(d.addDays(i));
00111 if (temp.count()==0) continue;
00112 ret[d.addDays(i)]+=temp;
00113 temp.clear();
00114 }
00115 return ret;
00116 }
00117
00118 QValueList<EffectiveEvent> ChrisHoliday::events(const QDate&start,const QDate&end)
00119 {
00120 QValueList<EffectiveEvent> ret;
00121 QDate d = (start<end?start:end);
00122 int daysto = start.daysTo(end);
00123 if (daysto < 0) {
00124 daysto = end.daysTo(start);
00125 }
00126
00127 QStringList temp;
00128 for (int i =0; i<= daysto;++i) {
00129 temp = entries(d.addDays(i));
00130 if (temp.count()==0) {
00131 continue;
00132 }
00133 for (unsigned j=0;j<temp.count();++j) {
00134 Event ev;
00135 ev.setDescription(temp[j]);
00136 ev.setStart(d.addDays(i));
00137 ev.setAllDay(true);
00138 ret.append(EffectiveEvent(ev,d.addDays(i)));
00139 }
00140 }
00141
00142 return ret;
00143 }
00144
00145 EXPORT_HOLIDAY_PLUGIN(ChrisHoliday);