calendarsystem Library API Documentation

kcalendarsystemhijri.cpp

00001 // Derived hijri kde calendar class
00002 // Just a schema. It must be a plugin
00003 // It depends on hdate routines
00004 // Carlos Moro  <cfmoro@correo.uniovi.es>
00005 // GNU-GPL v.2
00006 
00007 #include <qdatetime.h>
00008 #include <qstring.h>
00009 #include <qstringlist.h>
00010 
00011 #include <kglobal.h>
00012 #include <klocale.h>
00013 #include <kdebug.h>
00014 
00015 #include "hconv.h"
00016 
00017 #include "kcalendarsystemhijri.h"
00018 
00019 KCalendarSystemHijri::KCalendarSystemHijri()
00020 {
00021   kdDebug(5400) << "\nCreated hijri calendar" << endl;
00022 }
00023 
00024 KCalendarSystemHijri::~KCalendarSystemHijri()
00025 {
00026 }
00027 
00028 QString KCalendarSystemHijri::monthName(const QDate& date, bool shortName)
00029 {
00030   kdDebug(5400) << "Arabic month..." <<  endl;
00031   // firstly, get hijri date from gregorian one
00032   SDATE  *sd;
00033   sd = hdate(date.year(), date.month(), date.day());
00034   if ( shortName )
00035         return QString(hmnameshort[sd->mon-1]);
00036   else 
00037         return QString(hmname[sd->mon-1]);
00038 }
00039 
00040 int KCalendarSystemHijri::year(const QDate& date)
00041 {
00042   kdDebug(5400) << "Arabic year..." <<  endl;
00043   // firstly, get hijri date from gregorian one
00044   SDATE  *sd;
00045   sd = hdate(date.year(), date.month(), date.day());
00046   if (sd->year>0)
00047     return (sd->year);
00048   else
00049     return (-sd->year);
00050 }
00051 
00052 QString KCalendarSystemHijri::formatDate(const QDate& date)
00053 {
00054   kdDebug(5400) << "Arabic format date..." << endl;
00055   // firstly, get hijri date from gregorian one
00056   SDATE  *sd;
00057   sd = hdate(date.year(), date.month(), date.day());
00058   return QString::number(sd->day) + QString("/") +
00059     QString::number(sd->mon) + QString("/")+
00060     QString::number(sd->year);
00061 }
00062 
00063 void KCalendarSystemHijri::nextMonthDate(QDate& date)
00064 {
00065   // firstly, get hijri date from gregorian one
00066   SDATE  *sd, *gd;
00067   sd = hdate(date.year(), date.month(), date.day());
00068   // hijri + 1 month
00069   int day = sd->day;
00070   if(sd->mon==12) {
00071     //setYMD(temp.year()+1, 1, 1);
00072     sd->year+=1;
00073     sd->mon=1;
00074     sd->day=1;
00075   } else {
00076     //temp.setYMD(temp.year(), temp.month()+1, 1);
00077     sd->mon+=1;
00078   }
00079   if(hndays(sd->mon, sd->year) < day) {
00080     //temp.setYMD(temp.year(), temp.month(), temp.daysInMonth());
00081     sd->day = hndays(sd->mon, sd->year);
00082   } else {
00083     //temp.setYMD(temp.year(), temp.month(), day);
00084     sd->day = day;
00085   }
00086   // get back gregorian date from new hijri
00087   gd = gdate( sd -> year, sd -> mon, sd -> day);
00088   date.setYMD(gd->year, gd->mon, gd->day);
00089   kdDebug(5400) << "Arabic next month date..." << endl;
00090 }
00091 
00092 void KCalendarSystemHijri::previousMonthDate(QDate& date)
00093 {
00094   kdDebug(5400) << "Arabic previous month date..." << endl;
00095   // firstly, get hijri date from gregorian one
00096   SDATE  *sd, *gd;
00097   sd = hdate(date.year(), date.month(), date.day());
00098   // hijri - 1 month
00099   int day = sd->day;
00100   if(sd->mon==1) {
00101     //temp.setYMD(temp.year()-1, 1, 1);
00102     sd->year-=1;
00103     sd->mon = 12;
00104     sd->day = 1;
00105   } else {
00106     //temp.setYMD(temp.year(), temp.month()-1, 1);
00107     sd->mon-=1;
00108     //sd->day = 1;
00109   }
00110   if(hndays(sd->mon, sd->year)<day) {
00111     //temp.setYMD(temp.year(), temp.month(), temp.daysInMonth());
00112     sd->day = hndays(sd->mon, sd->year);
00113   } else {
00114     //temp.setYMD(temp.year(), temp.month(), day);
00115     sd->day = day;
00116   }
00117   // get back gregorian date from new hijri
00118   gd = gdate( sd -> year, sd -> mon, sd -> day);
00119   date.setYMD(gd->year, gd->mon, gd->day);
00120 }
00121 
00122 void KCalendarSystemHijri::nextYearDate(QDate& date)
00123 {
00124   kdDebug(5400) << "Arabic next year date..." << endl;
00125   // firstly, get hijri date from gregorian one
00126   SDATE  *sd, *gd;
00127   sd = hdate(date.year(), date.month(), date.day());
00128   // hijri + 1 year
00129   int day = sd->day;
00130   //temp.setYMD(temp.year()+1, temp.month(), 1);
00131   sd->year+=1;
00132   sd->day=1;
00133   if(hndays(sd->mon, sd->year)<day) {
00134     //temp.setYMD(temp.year(), temp.month(), temp.daysInMonth());
00135   } else {
00136     //temp.setYMD(temp.year(), temp.month(), day);
00137     sd->day = day;
00138   }
00139   // get back gregorian date from new hijri
00140   gd = gdate( sd -> year, sd -> mon, sd -> day);
00141   date.setYMD(gd->year, gd->mon, gd->day);
00142 }
00143 
00144 void KCalendarSystemHijri::previousYearDate(QDate& date)
00145 {
00146   kdDebug(5400) << "Arabic previous year date..." << endl;
00147   // firstly, get hijri date from gregorian one
00148   SDATE  *sd, *gd;
00149   sd = hdate(date.year(), date.month(), date.day());
00150   // hijri - 1 year
00151   int day = sd->day;
00152   //temp.setYMD(temp.year()-1, temp.month(), 1);
00153   sd->year-=1;
00154   sd->day=1;
00155   if(hndays(sd->mon, sd->year)<day) {
00156     //temp.setYMD(temp.year(), temp.month(), temp.daysInMonth());
00157   } else {
00158     //temp.setYMD(temp.year(), temp.month(), day);
00159     sd->day = day;
00160   }
00161   // get back gregorian date from new hijri
00162   gd = gdate( sd -> year, sd -> mon, sd -> day);
00163   date.setYMD(gd->year, gd->mon, gd->day);
00164 }
00165 
00166 int KCalendarSystemHijri::monthsInYear( int )
00167 {
00168   kdDebug(5400) << "Arabic monthsInYear" << endl;
00169   return 12;
00170 }
00171 
00172 QString KCalendarSystemHijri::monthName(int month)
00173 {
00174   kdDebug(5400) << "Arabic getMonthName " << hmname[month-1] <<endl;
00175   //return KGlobal::locale()->monthName(month, false);
00176   return QString(hmname[month-1]);
00177 }
00178 
00179 void KCalendarSystemHijri::constructDateInMonth(QDate& date, int month)
00180 {
00181   kdDebug(5400) << "Arabic constructDateInMonth" << endl;
00182   // firstly, get hijri date from gregorian one
00183   SDATE  *sd, *gd;
00184   sd = hdate(date.year(), date.month(), date.day());
00185   // construct
00186   int day;
00187   day = sd->day;
00188 
00189   //date.setYMD(date.year(), month, 1);
00190   sd->mon = month;
00191   sd->day = 1;
00192   //date.setYMD(date.year(), month, QMIN(day, date.daysInMonth()));
00193   sd->mon = month;
00194   sd->day = QMIN(day, hndays(sd->mon, sd->year));
00195   // get back gregorian date from new hijri
00196   gd = gdate( sd -> year, sd -> mon, sd -> day);
00197   date.setYMD(gd->year, gd->mon, gd->day);
00198 }
00199 
00200 void KCalendarSystemHijri::constructDateInYear(QDate& date, int year)
00201 {
00202   kdDebug(5400) << "Hijri constructDateInYear" << endl;
00203   // firstly, get hijri date from gregorian one
00204   SDATE  *sd, *gd;
00205   sd = hdate(date.year(), date.month(), date.day());
00206   // construct
00207   int day;
00208   day = date.day();
00209 
00210   //date.setYMD(year, date.month(), 1);
00211   sd->year = year;
00212   sd->day =1;
00213   //date.setYMD(year, date.month(), QMIN(day, date.daysInMonth()));
00214   sd->year = year;
00215   sd->day = QMIN(day, hndays(sd->mon, sd->year));
00216   // get back gregorian date from new hijri
00217   gd = gdate( sd -> year, sd -> mon, sd -> day);
00218   date.setYMD(gd->year, gd->mon, gd->day);
00219 }
00220 
00221 QDate KCalendarSystemHijri::parseDate(QString text)
00222 {
00223   kdDebug(5400) << "Hijri parseDate" << endl;
00224   // entered values belong to hijri date...
00225   kdDebug(5400) << "parseDate text " << text << endl;
00226   int day, month, year;
00227   QStringList d = QStringList::split("/", text);
00228   QStringList::Iterator it;
00229   QString a;
00230 
00231   it = d.at(0);
00232   a = *it;
00233   day = a.toInt();
00234 
00235   it = d.at(1);
00236   a = *it;
00237   month = a.toInt();
00238 
00239   it = d.at(2);
00240   a = *it;
00241   year = a.toInt();
00242 
00243   // convert to gregorian...
00244   SDATE *gd;
00245   gd = gdate(year, month, day);
00246   QDate enteredDate;
00247   enteredDate.setYMD(gd->year, gd->mon, gd->day);
00248   kdDebug(5400) << "DEBUG year: " << enteredDate.year() << endl;
00249   return enteredDate;
00250 }
00251 
00252 QString KCalendarSystemHijri::weekDayName(int day, bool shortName)
00253 {
00254   if( shortName )
00255      return QString( sdow[day-1] );
00256   else
00257      return QString( dow[day-1] );
00258 }
00259 
00260 int KCalendarSystemHijri::dayOfTheWeek(const QDate& date)
00261 {
00262   //kdDebug(5400) << "Hijri dayOfTheWeek" << endl;
00263   SDATE  *sd;
00264   // firstly, we get hijri date from actual gregorian date
00265   sd = hdate(date.year(), date.month(), date.day());
00266   if( sd->dw == 0 ) 
00267         return 7;
00268   else 
00269         return (sd->dw);
00270 }
00271 
00272 int KCalendarSystemHijri::numberOfDaysInMonth(const QDate& date)
00273 {
00274   kdDebug(5400) << "Hijri daysInMonth" << endl;
00275   SDATE  *sd;
00276   // firstly, we get hijri date from actual gregorian date
00277   sd = hdate(date.year(), date.month(), date.day());
00278   return hndays(sd->mon, sd->year);
00279 }
00280 
00281 int KCalendarSystemHijri::hndays(int mon,int year)
00282 {
00283   SDATE fd, ld;
00284   int nd = 666;
00285   fd = *gdate(year, mon, 1);
00286   ld = *gdate(year, mon+1, 1);
00287   ld = *caldate(julianday(ld.year, ld.mon, ld.day, 0.0) -1.0);
00288   if (fd.mon == ld.mon)
00289     nd = ld.day - fd.day +1;
00290   else
00291     nd = ndays(fd.mon,fd.year) - fd.day + ld.day +1;
00292 
00293   return nd;
00294 }
00295 
00296 int KCalendarSystemHijri::numberOfDaysPrevMonth(const QDate& date)
00297 {
00298   kdDebug(5400) << "Hijri daysinprevmonth" << endl;
00299   SDATE  *sd, *gd, *sd1;
00300   // firstly, we get hijri date from actual gregorian date
00301   sd = hdate(date.year(), date.month(), date.day());
00302 
00303   if(sd->mon == 1) {
00304     //temp.setYMD(date.year()-1, 12, 1);
00305     gd = gdate((sd->year)-1, 12, 1);
00306   } else {
00307     //temp.setYMD(date.year(), date.month()-1, 1);
00308     gd = gdate(sd->year, (sd->mon)-1, 1);
00309   }
00310   sd1 = hdate(gd->year, gd->mon, gd->day);
00311   return hndays( sd1->mon, sd1->year);
00312 }
00313 
00314 // Max valid year that may be converted to QDate
00315 int KCalendarSystemHijri::maxValidYear()
00316 {
00317   QDate date(8000, 1, 1);
00318 
00319   SDATE  *sd;
00320   // firstly, we get hijri date from gregorian date
00321   sd = hdate(date.year(), date.month(), date.day());
00322 
00323   return sd->year;
00324 }
00325 
00326 int KCalendarSystemHijri::day(const QDate& date)
00327 {
00328   SDATE  *sd;
00329   // firstly, we get hijri date from actual gregorian date
00330   sd = hdate(date.year(), date.month(), date.day());
00331 
00332   return sd->day;
00333 }
00334 
00335 int KCalendarSystemHijri::month(const QDate& date)
00336 {
00337   SDATE  *sd;
00338   // firstly, we get hijri date from actual gregorian date
00339   sd = hdate(date.year(), date.month(), date.day());
00340 
00341   return sd->mon;
00342 }
00343 
00344 int KCalendarSystemHijri::numberOfDayInYear(const QDate& date)
00345 {
00346   SDATE *sd;
00347   // firstly, we get hijri date from actual gregorian date
00348   sd = hdate(date.year(), date.month(), date.day());
00349   
00350   int day = 0;
00351   
00352   for(int c = 1; c < sd->mon; c++)
00353     day+=hndays(c, sd->year);
00354   day+=sd->day;
00355   
00356   return day;
00357 }
00358 
00359 int KCalendarSystemHijri::weekDayOfPray() {
00360    return 5; // friday
00361 }
00362 void KCalendarSystemHijri::printType()
00363 {
00364   kdDebug(5400) << "It's hijri!" << endl;
00365 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 15 11:40:08 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001