1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     SWIG definitions of various utility classes
 
   7 // Created:     25-Nov-1998
 
   9 // Copyright:   (c) 1998 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  18 #include <wx/config.h>
 
  19 #include <wx/fileconf.h>
 
  20 #include <wx/datetime.h>
 
  23 //---------------------------------------------------------------------------
 
  25     // Put some wx default wxChar* values into wxStrings.
 
  26     DECLARE_DEF_STRING2(DateFormatStr, wxT("%c"));
 
  27     static const wxString wxPyEmptyString(wxT(""));
 
  30 //---------------------------------------------------------------------------
 
  33 %include my_typemaps.i
 
  35 // Import some definitions of other classes, etc.
 
  38 %pragma(python) code = "import string"
 
  41 //---------------------------------------------------------------------------
 
  44     static PyObject* __EnumerationHelper(bool flag, wxString& str, long index) {
 
  45         PyObject* ret = PyTuple_New(3);
 
  47             PyTuple_SET_ITEM(ret, 0, PyInt_FromLong(flag));
 
  49             PyTuple_SET_ITEM(ret, 1, PyUnicode_FromUnicode(str.c_str(), str.Len()));
 
  51             PyTuple_SET_ITEM(ret, 1, PyString_FromStringAndSize(str.c_str(), str.Len()));
 
  53             PyTuple_SET_ITEM(ret, 2, PyInt_FromLong(index));
 
  59 //---------------------------------------------------------------------------
 
  63     wxCONFIG_USE_LOCAL_FILE,
 
  64     wxCONFIG_USE_GLOBAL_FILE,
 
  65     wxCONFIG_USE_RELATIVE_PATH,
 
  66     wxCONFIG_USE_NO_ESCAPE_CHARACTERS
 
  69 //---------------------------------------------------------------------------
 
  73 //      wxConfigBase(const wxString& appName = wxPyEmptyString,       **** An ABC
 
  74 //                   const wxString& vendorName = wxPyEmptyString,
 
  75 //                   const wxString& localFilename = wxPyEmptyString,
 
  76 //                   const wxString& globalFilename = wxPyEmptyString,
 
  85         Type_Integer,    // use Read(long *)
 
  86         Type_Float       // use Read(double *)
 
  90     // sets the config object, returns the previous pointer
 
  91     static wxConfigBase *Set(wxConfigBase *pConfig);
 
  92     // get the config object, creates it on demand unless DontCreateOnDemand
 
  94     static wxConfigBase *Get(bool createOnDemand = TRUE);
 
  95     // create a new config object: this function will create the "best"
 
  96     // implementation of wxConfig available for the current platform, see
 
  97     // comments near definition wxUSE_CONFIG_NATIVE for details. It returns
 
  98     // the created object and also sets it as ms_pConfig.
 
  99     static wxConfigBase *Create();
 
 100     // should Get() try to create a new log object if the current one is NULL?
 
 101     static void DontCreateOnDemand();
 
 105     bool DeleteAll();  // This is supposed to have been fixed...
 
 106     bool DeleteEntry(const wxString& key, bool bDeleteGroupIfEmpty = TRUE);
 
 107     bool DeleteGroup(const wxString& key);
 
 108     bool Exists(wxString& strName);
 
 109     bool Flush(bool bCurrentOnly = FALSE);
 
 110     wxString GetAppName();
 
 113     // Each of these enumeration methods return a 3-tuple consisting of
 
 114     // the continue flag, the value string, and the index for the next call.
 
 116         PyObject* GetFirstGroup() {
 
 121             cont = self->GetFirstGroup(value, index);
 
 122             return __EnumerationHelper(cont, value, index);
 
 125         PyObject* GetFirstEntry() {
 
 130             cont = self->GetFirstEntry(value, index);
 
 131             return __EnumerationHelper(cont, value, index);
 
 134         PyObject* GetNextGroup(long index) {
 
 138             cont = self->GetNextGroup(value, index);
 
 139             return __EnumerationHelper(cont, value, index);
 
 142         PyObject* GetNextEntry(long index) {
 
 146             cont = self->GetNextEntry(value, index);
 
 147             return __EnumerationHelper(cont, value, index);
 
 152     int GetNumberOfEntries(bool bRecursive = FALSE);
 
 153     int GetNumberOfGroups(bool bRecursive = FALSE);
 
 155     wxString GetVendorName();
 
 156     bool HasEntry(wxString& strName);
 
 157     bool HasGroup(const wxString& strName);
 
 158     bool IsExpandingEnvVars();
 
 159     bool IsRecordingDefaults();
 
 161     wxString Read(const wxString& key, const wxString& defaultVal = wxPyEmptyString);
 
 164         long ReadInt(const wxString& key, long defaultVal = 0) {
 
 166             self->Read(key, &rv, defaultVal);
 
 169         double ReadFloat(const wxString& key, double defaultVal = 0.0) {
 
 171             self->Read(key, &rv, defaultVal);
 
 174         bool ReadBool(const wxString& key, bool defaultVal = FALSE) {
 
 176             self->Read(key, &rv, defaultVal);
 
 181     void SetExpandEnvVars (bool bDoIt = TRUE);
 
 182     void SetPath(const wxString& strPath);
 
 183     void SetRecordDefaults(bool bDoIt = TRUE);
 
 184     void SetAppName(const wxString& appName);
 
 185     void SetVendorName(const wxString& vendorName);
 
 187     void SetStyle(long style);
 
 190     bool Write(const wxString& key, const wxString& value);
 
 191     %name(WriteInt)bool Write(const wxString& key, long value);
 
 192     %name(WriteFloat)bool Write(const wxString& key, double value);
 
 193     %name(WriteBool)bool Write(const wxString& key, bool value);
 
 195     EntryType GetEntryType(const wxString& name);
 
 196     bool RenameEntry(const wxString& oldName,
 
 197                      const wxString& newName);
 
 198     bool RenameGroup(const wxString& oldName,
 
 199                      const wxString& newName);
 
 200     wxString ExpandEnvVars(const wxString& str);
 
 206 //---------------------------------------------------------------------------
 
 208 // This will be a wxRegConfig on Win32 and wxFileConfig otherwise.
 
 209 class wxConfig : public wxConfigBase {
 
 211     wxConfig(const wxString& appName = wxPyEmptyString,
 
 212              const wxString& vendorName = wxPyEmptyString,
 
 213              const wxString& localFilename = wxPyEmptyString,
 
 214              const wxString& globalFilename = wxPyEmptyString,
 
 220 // Sometimes it's nice to explicitly have a wxFileConfig too.
 
 221 class wxFileConfig : public wxConfigBase {
 
 223     wxFileConfig(const wxString& appName = wxPyEmptyString,
 
 224                  const wxString& vendorName = wxPyEmptyString,
 
 225                  const wxString& localFilename = wxPyEmptyString,
 
 226                  const wxString& globalFilename = wxPyEmptyString,
 
 232 //---------------------------------------------------------------------------
 
 233 //---------------------------------------------------------------------------
 
 240 %typemap(python,in) wxDateTime::TimeZone& {
 
 241     $target = new wxDateTime::TimeZone((wxDateTime::TZ)PyInt_AsLong($source));
 
 243 %typemap(python,freearg) wxDateTime::TimeZone& {
 
 244     if ($source) delete $source;
 
 248 #define LOCAL *(new wxDateTime::TimeZone(wxDateTime::Local))
 
 252 %typemap(python, out) wxLongLong {
 
 253     PyObject *hi, *lo, *shifter, *shifted;
 
 254     hi = PyLong_FromLong($source->GetHi());
 
 255     lo = PyLong_FromLong($source->GetLo());
 
 256     shifter = PyLong_FromLong(32);
 
 257     shifted = PyNumber_Lshift(hi, shifter);
 
 258     $target = PyNumber_Or(shifted, lo);
 
 270     typedef unsigned short wxDateTime_t;
 
 276         GMT_12, GMT_11, GMT_10, GMT_9, GMT_8, GMT_7,
 
 277         GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1,
 
 279         GMT1, GMT2, GMT3, GMT4, GMT5, GMT6,
 
 280         GMT7, GMT8, GMT9, GMT10, GMT11, GMT12,
 
 283         WET = GMT0,                         // Western Europe Time
 
 284         WEST = GMT1,                        // Western Europe Summer Time
 
 285         CET = GMT1,                         // Central Europe Time
 
 286         CEST = GMT2,                        // Central Europe Summer Time
 
 287         EET = GMT2,                         // Eastern Europe Time
 
 288         EEST = GMT3,                        // Eastern Europe Summer Time
 
 289         MSK = GMT3,                         // Moscow Time
 
 290         MSD = GMT4,                         // Moscow Summer Time
 
 293         AST = GMT_4,                        // Atlantic Standard Time
 
 294         ADT = GMT_3,                        // Atlantic Daylight Time
 
 295         EST = GMT_5,                        // Eastern Standard Time
 
 296         EDT = GMT_4,                        // Eastern Daylight Saving Time
 
 297         CST = GMT_6,                        // Central Standard Time
 
 298         CDT = GMT_5,                        // Central Daylight Saving Time
 
 299         MST = GMT_7,                        // Mountain Standard Time
 
 300         MDT = GMT_6,                        // Mountain Daylight Saving Time
 
 301         PST = GMT_8,                        // Pacific Standard Time
 
 302         PDT = GMT_7,                        // Pacific Daylight Saving Time
 
 303         HST = GMT_10,                       // Hawaiian Standard Time
 
 304         AKST = GMT_9,                       // Alaska Standard Time
 
 305         AKDT = GMT_8,                       // Alaska Daylight Saving Time
 
 309         A_WST = GMT8,                       // Western Standard Time
 
 310         A_CST = GMT12 + 1,                  // Central Standard Time (+9.5)
 
 311         A_EST = GMT10,                      // Eastern Standard Time
 
 312         A_ESST = GMT11,                     // Eastern Summer Time
 
 314         // Universal Coordinated Time = the new and politically correct name
 
 321         Gregorian,  // current calendar
 
 322         Julian      // calendar in use since -45 until the 1582 (or later)
 
 327         Country_Unknown, // no special information for this country
 
 328         Country_Default, // set the default country with SetCountry() method
 
 329                          // or use the default country with any other
 
 331         // Western European countries: we assume that they all follow the same
 
 332         // DST rules (true or false?)
 
 333         Country_WesternEurope_Start,
 
 334         Country_EEC = Country_WesternEurope_Start,
 
 338         Country_WesternEurope_End = UK,
 
 345         // symbolic names for the months
 
 348         Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, Inv_Month
 
 351         // symbolic names for the weekdays
 
 354         Sun, Mon, Tue, Wed, Thu, Fri, Sat, Inv_WeekDay
 
 357         // invalid value for the year
 
 360         Inv_Year = SHRT_MIN    // should hold in wxDateTime_t
 
 363         // flags for GetWeekDayName and GetMonthName
 
 366         Name_Full = 0x01,       // return full name
 
 367         Name_Abbr = 0x02        // return abbreviated name
 
 370         // flags for GetWeekOfYear and GetWeekOfMonth
 
 373         Default_First,   // Sunday_First for US, Monday_First for the rest
 
 374         Monday_First,    // week starts with a Monday
 
 375         Sunday_First     // week starts with a Sunday
 
 380     // ------------------------------------------------------------------------
 
 382         // set the current country
 
 383     static void SetCountry(Country country);
 
 384         // get the current country
 
 385     static Country GetCountry();
 
 387         // return TRUE if the country is a West European one (in practice,
 
 388         // this means that the same DST rules as for EEC apply)
 
 389     static bool IsWestEuropeanCountry(Country country = Country_Default);
 
 391         // return the current year
 
 392     static int GetCurrentYear(Calendar cal = Gregorian);
 
 394         // convert the year as returned by wxDateTime::GetYear() to a year
 
 395         // suitable for BC/AD notation. The difference is that BC year 1
 
 396         // corresponds to the year 0 (while BC year 0 didn't exist) and AD
 
 397         // year N is just year N.
 
 398     static int ConvertYearToBC(int year);
 
 400         // return the current month
 
 401     static Month GetCurrentMonth(Calendar cal = Gregorian);
 
 403         // returns TRUE if the given year is a leap year in the given calendar
 
 404     static bool IsLeapYear(int year = Inv_Year, Calendar cal = Gregorian);
 
 406         // get the century (19 for 1999, 20 for 2000 and -5 for 492 BC)
 
 407     static int GetCentury(int year = Inv_Year);
 
 409         // returns the number of days in this year (356 or 355 for Gregorian
 
 410         // calendar usually :-)
 
 411     %name(GetNumberOfDaysinYear)
 
 412         static wxDateTime_t GetNumberOfDays(int year, Calendar cal = Gregorian);
 
 414         // get the number of the days in the given month (default value for
 
 415         // the year means the current one)
 
 416     %name(GetNumberOfDaysInMonth)
 
 417     static wxDateTime_t GetNumberOfDays(Month month,
 
 419                                         Calendar cal = Gregorian);
 
 421         // get the full (default) or abbreviated month name in the current
 
 422         // locale, returns empty string on error
 
 423     static wxString GetMonthName(Month month,
 
 424                                  NameFlags flags = Name_Full);
 
 426         // get the full (default) or abbreviated weekday name in the current
 
 427         // locale, returns empty string on error
 
 428     static wxString GetWeekDayName(WeekDay weekday,
 
 429                                    NameFlags flags = Name_Full);
 
 431         // get the AM and PM strings in the current locale (may be empty)
 
 432     static void GetAmPmStrings(wxString *OUTPUT, wxString *OUTPUT);
 
 434         // return TRUE if the given country uses DST for this year
 
 435     static bool IsDSTApplicable(int year = Inv_Year,
 
 436                                 Country country = Country_Default);
 
 438         // get the beginning of DST for this year, will return invalid object
 
 439         // if no DST applicable in this year. The default value of the
 
 440         // parameter means to take the current year.
 
 441     static wxDateTime GetBeginDST(int year = Inv_Year,
 
 442                                   Country country = Country_Default);
 
 443         // get the end of DST for this year, will return invalid object
 
 444         // if no DST applicable in this year. The default value of the
 
 445         // parameter means to take the current year.
 
 446     static wxDateTime GetEndDST(int year = Inv_Year,
 
 447                                 Country country = Country_Default);
 
 449         // return the wxDateTime object for the current time
 
 450     static inline wxDateTime Now();
 
 452         // return the wxDateTime object for today midnight: i.e. as Now() but
 
 453         // with time set to 0
 
 454     static inline wxDateTime Today();
 
 458     // ------------------------------------------------------------------------
 
 462     %name(wxDateTimeFromTimeT)wxDateTime(time_t timet);
 
 463     %name(wxDateTimeFromJDN)wxDateTime(double jdn);
 
 464     %name(wxDateTimeFromHMS)wxDateTime(wxDateTime_t hour,
 
 465                                        wxDateTime_t minute = 0,
 
 466                                        wxDateTime_t second = 0,
 
 467                                        wxDateTime_t millisec = 0);
 
 468     %name(wxDateTimeFromDMY)wxDateTime(wxDateTime_t day,
 
 469                                        Month        month = Inv_Month,
 
 471                                        wxDateTime_t hour = 0,
 
 472                                        wxDateTime_t minute = 0,
 
 473                                        wxDateTime_t second = 0,
 
 474                                        wxDateTime_t millisec = 0);
 
 478     // ------------------------------------------------------------------------
 
 481     wxDateTime& SetToCurrent();
 
 483         // set to given time_t value
 
 484     %name(SetTimeT)wxDateTime& Set(time_t timet);
 
 486         // set to given JDN (beware of rounding errors)
 
 487     %name(SetJDN)wxDateTime& Set(double jdn);
 
 489         // set to given time, date = today
 
 490     %name(SetHMS)wxDateTime& Set(wxDateTime_t hour,
 
 491                     wxDateTime_t minute = 0,
 
 492                     wxDateTime_t second = 0,
 
 493                     wxDateTime_t millisec = 0);
 
 495         // from separate values for each component with explicit date
 
 496         // (defaults for month and year are the current values)
 
 497     wxDateTime& Set(wxDateTime_t day,
 
 498                     Month        month = Inv_Month,
 
 499                     int          year = Inv_Year, // 1999, not 99 please!
 
 500                     wxDateTime_t hour = 0,
 
 501                     wxDateTime_t minute = 0,
 
 502                     wxDateTime_t second = 0,
 
 503                     wxDateTime_t millisec = 0);
 
 505         // resets time to 00:00:00, doesn't change the date
 
 506     wxDateTime& ResetTime();
 
 508         // the following functions don't change the values of the other
 
 509         // fields, i.e. SetMinute() won't change either hour or seconds value
 
 512     wxDateTime& SetYear(int year);
 
 514     wxDateTime& SetMonth(Month month);
 
 515         // set the day of the month
 
 516     wxDateTime& SetDay(wxDateTime_t day);
 
 518     wxDateTime& SetHour(wxDateTime_t hour);
 
 520     wxDateTime& SetMinute(wxDateTime_t minute);
 
 522     wxDateTime& SetSecond(wxDateTime_t second);
 
 524     wxDateTime& SetMillisecond(wxDateTime_t millisecond);
 
 527     // ------------------------------------------------------------------------
 
 528     // calendar calculations
 
 530         // set to the given week day in the same week as this one
 
 531     wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday);
 
 532     wxDateTime GetWeekDayInSameWeek(WeekDay weekday);
 
 534         // set to the next week day following this one
 
 535     wxDateTime& SetToNextWeekDay(WeekDay weekday);
 
 536     wxDateTime GetNextWeekDay(WeekDay weekday);
 
 538         // set to the previous week day before this one
 
 539     wxDateTime& SetToPrevWeekDay(WeekDay weekday);
 
 540     wxDateTime GetPrevWeekDay(WeekDay weekday);
 
 542         // set to Nth occurence of given weekday in the given month of the
 
 543         // given year (time is set to 0), return TRUE on success and FALSE on
 
 544         // failure. n may be positive (1..5) or negative to count from the end
 
 545         // of the month (see helper function SetToLastWeekDay())
 
 546     bool SetToWeekDay(WeekDay weekday,
 
 548                       Month month = Inv_Month,
 
 549                       int year = Inv_Year);
 
 550 //      wxDateTime GetWeekDay(WeekDay weekday,
 
 552 //                            Month month = Inv_Month,
 
 553 //                            int year = Inv_Year);
 
 555         // sets to the last weekday in the given month, year
 
 556     bool SetToLastWeekDay(WeekDay weekday,
 
 557                           Month month = Inv_Month,
 
 558                           int year = Inv_Year);
 
 559     wxDateTime GetLastWeekDay(WeekDay weekday,
 
 560                               Month month = Inv_Month,
 
 561                               int year = Inv_Year);
 
 563         // sets the date to the given day of the given week in the year,
 
 564         // returns TRUE on success and FALSE if given date doesn't exist (e.g.
 
 566     bool SetToTheWeek(wxDateTime_t numWeek, WeekDay weekday = Mon);
 
 567     wxDateTime GetWeek(wxDateTime_t numWeek, WeekDay weekday = Mon);
 
 569         // sets the date to the last day of the given (or current) month or the
 
 570         // given (or current) year
 
 571     wxDateTime& SetToLastMonthDay(Month month = Inv_Month,
 
 572                                   int year = Inv_Year);
 
 573     wxDateTime GetLastMonthDay(Month month = Inv_Month,
 
 574                                int year = Inv_Year);
 
 576         // sets to the given year day (1..365 or 366)
 
 577     wxDateTime& SetToYearDay(wxDateTime_t yday);
 
 578     wxDateTime GetYearDay(wxDateTime_t yday);
 
 580         // The definitions below were taken verbatim from
 
 582         //      http://www.capecod.net/~pbaum/date/date0.htm
 
 584         // (Peter Baum's home page)
 
 586         // definition: The Julian Day Number, Julian Day, or JD of a
 
 587         // particular instant of time is the number of days and fractions of a
 
 588         // day since 12 hours Universal Time (Greenwich mean noon) on January
 
 589         // 1 of the year -4712, where the year is given in the Julian
 
 590         // proleptic calendar. The idea of using this reference date was
 
 591         // originally proposed by Joseph Scalizer in 1582 to count years but
 
 592         // it was modified by 19th century astronomers to count days. One
 
 593         // could have equivalently defined the reference time to be noon of
 
 594         // November 24, -4713 if were understood that Gregorian calendar rules
 
 595         // were applied. Julian days are Julian Day Numbers and are not to be
 
 596         // confused with Julian dates.
 
 598         // definition: The Rata Die number is a date specified as the number
 
 599         // of days relative to a base date of December 31 of the year 0. Thus
 
 600         // January 1 of the year 1 is Rata Die day 1.
 
 602         // get the Julian Day number (the fractional part specifies the time of
 
 603         // the day, related to noon - beware of rounding errors!)
 
 604     double GetJulianDayNumber();
 
 607         // get the Modified Julian Day number: it is equal to JDN - 2400000.5
 
 608         // and so integral MJDs correspond to the midnights (and not noons).
 
 609         // MJD 0 is Nov 17, 1858
 
 610     double GetModifiedJulianDayNumber() const { return GetJDN() - 2400000.5; }
 
 613         // get the Rata Die number
 
 617     // ------------------------------------------------------------------------
 
 620         // transform to any given timezone
 
 621     wxDateTime ToTimezone(const wxDateTime::TimeZone& tz, bool noDST = FALSE);
 
 622     wxDateTime& MakeTimezone(const wxDateTime::TimeZone& tz, bool noDST = FALSE);
 
 624         // transform to GMT/UTC
 
 625     wxDateTime ToGMT(bool noDST = FALSE);
 
 626     wxDateTime& MakeGMT(bool noDST = FALSE);
 
 628         // is daylight savings time in effect at this moment according to the
 
 629         // rules of the specified country?
 
 631         // Return value is > 0 if DST is in effect, 0 if it is not and -1 if
 
 632         // the information is not available (this is compatible with ANSI C)
 
 633     int IsDST(Country country = Country_Default);
 
 637     // ------------------------------------------------------------------------
 
 640         // is the date valid (TRUE even for non initialized objects)?
 
 641     inline bool IsValid() const;
 
 643         // get the number of seconds since the Unix epoch - returns (time_t)-1
 
 644         // if the value is out of range
 
 645     inline time_t GetTicks() const;
 
 647         // get the year (returns Inv_Year if date is invalid)
 
 648     int GetYear(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 650         // get the month (Inv_Month if date is invalid)
 
 651     Month GetMonth(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 653         // get the month day (in 1..31 range, 0 if date is invalid)
 
 654     wxDateTime_t GetDay(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 656         // get the day of the week (Inv_WeekDay if date is invalid)
 
 657     WeekDay GetWeekDay(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 659         // get the hour of the day
 
 660     wxDateTime_t GetHour(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 663     wxDateTime_t GetMinute(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 666     wxDateTime_t GetSecond(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 669     wxDateTime_t GetMillisecond(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 672         // get the day since the year start (1..366, 0 if date is invalid)
 
 673     wxDateTime_t GetDayOfYear(const wxDateTime::TimeZone& tz = LOCAL) const;
 
 674         // get the week number since the year start (1..52 or 53, 0 if date is
 
 676     wxDateTime_t GetWeekOfYear(WeekFlags flags = Monday_First,
 
 677                                const wxDateTime::TimeZone& tz = LOCAL) const;
 
 678         // get the week number since the month start (1..5, 0 if date is
 
 680     wxDateTime_t GetWeekOfMonth(WeekFlags flags = Monday_First,
 
 681                                 const wxDateTime::TimeZone& tz = LOCAL) const;
 
 683         // is this date a work day? This depends on a country, of course,
 
 684         // because the holidays are different in different countries
 
 685     bool IsWorkDay(Country country = Country_Default) const;
 
 687         // is this date later than Gregorian calendar introduction for the
 
 688         // given country (see enum GregorianAdoption)?
 
 690         // NB: this function shouldn't be considered as absolute authority in
 
 691         //     the matter. Besides, for some countries the exact date of
 
 692         //     adoption of the Gregorian calendar is simply unknown.
 
 693     //bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const;
 
 696     // ------------------------------------------------------------------------
 
 697     // comparison (see also functions below for operator versions)
 
 699         // returns TRUE if the two moments are strictly identical
 
 700     inline bool IsEqualTo(const wxDateTime& datetime) const;
 
 702         // returns TRUE if the date is strictly earlier than the given one
 
 703     inline bool IsEarlierThan(const wxDateTime& datetime) const;
 
 705         // returns TRUE if the date is strictly later than the given one
 
 706     inline bool IsLaterThan(const wxDateTime& datetime) const;
 
 708         // returns TRUE if the date is strictly in the given range
 
 709     inline bool IsStrictlyBetween(const wxDateTime& t1,
 
 710                                   const wxDateTime& t2) const;
 
 712         // returns TRUE if the date is in the given range
 
 713     inline bool IsBetween(const wxDateTime& t1, const wxDateTime& t2) const;
 
 715         // do these two objects refer to the same date?
 
 716     inline bool IsSameDate(const wxDateTime& dt) const;
 
 718         // do these two objects have the same time?
 
 719     inline bool IsSameTime(const wxDateTime& dt) const;
 
 721         // are these two objects equal up to given timespan?
 
 722     inline bool IsEqualUpTo(const wxDateTime& dt, const wxTimeSpan& ts) const;
 
 725     // ------------------------------------------------------------------------
 
 726     // arithmetics with dates (see also below for more operators)
 
 728         // add a time span (positive or negative)
 
 729     %name(AddTS) wxDateTime& Add(const wxTimeSpan& diff);
 
 730         // add a date span (positive or negative)
 
 731     %name(AddDS) wxDateTime& Add(const wxDateSpan& diff);
 
 733         // subtract a time span (positive or negative)
 
 734     %name(SubtractTS) wxDateTime& Subtract(const wxTimeSpan& diff);
 
 736         // subtract a date span (positive or negative)
 
 737     %name(SubtractDS) wxDateTime& Subtract(const wxDateSpan& diff);
 
 739         // return the difference between two dates
 
 740     wxTimeSpan Subtract(const wxDateTime& dt) const;
 
 744         wxDateTime __add__TS(const wxTimeSpan& other) { return *self + other; }
 
 745         wxDateTime __add__DS(const wxDateSpan& other) { return *self + other; }
 
 747         wxTimeSpan __sub__DT(const wxDateTime& other) { return *self - other; }
 
 748         wxDateTime __sub__TS(const wxTimeSpan& other) { return *self - other; }
 
 749         wxDateTime __sub__DS(const wxDateSpan& other) { return *self - other; }
 
 751         int __cmp__(const wxDateTime* other) {
 
 752             if (! other) return -1;
 
 753             if (*self <  *other) return -1;
 
 754             if (*self == *other) return 0;
 
 759     %pragma(python) addtoclass = "
 
 760     def __add__(self, other):
 
 761         if string.find(other.this, 'wxTimeSpan') != -1:
 
 762             return self.__add__TS(other)
 
 763         if string.find(other.this, 'wxDateSpan') != -1:
 
 764             return self.__add__DS(other)
 
 765         raise TypeError, 'Invalid r.h.s. type for __add__'
 
 766     def __sub__(self, other):
 
 767         if string.find(other.this, 'wxDateTime') != -1:
 
 768             return self.__sub__DT(other)
 
 769         if string.find(other.this, 'wxTimeSpan') != -1:
 
 770             return self.__sub__TS(other)
 
 771         if string.find(other.this, 'wxDateSpan') != -1:
 
 772             return self.__sub__DS(other)
 
 773         raise TypeError, 'Invalid r.h.s. type for __sub__'
 
 776     // ------------------------------------------------------------------------
 
 777     // conversion from text: all conversions from text return -1 on failure,
 
 778     // or the index in the string where the next character following the date
 
 779     // specification (i.e. the one where the scan had to stop) is located.
 
 783         // parse a string in RFC 822 format (found e.g. in mail headers and
 
 784         // having the form "Wed, 10 Feb 1999 19:07:07 +0100")
 
 785         int ParseRfc822Date(const wxString& date) {
 
 787             const wxChar* _date = date;
 
 788             rv = self->ParseRfc822Date(_date);
 
 789             if (rv == NULL) return -1;
 
 794         // parse a date/time in the given format (see strptime(3)), fill in
 
 795         // the missing (in the string) fields with the values of dateDef (by
 
 796         // default, they will not change if they had valid values or will
 
 797         // default to Today() otherwise)
 
 798         int ParseFormat(const wxString& date,
 
 799                         const wxString& format = wxPyDateFormatStr,
 
 800                         const wxDateTime& dateDef = wxDefaultDateTime) {
 
 802             const wxChar* _date = date;
 
 803             rv = self->ParseFormat(_date, format, dateDef);
 
 804             if (rv == NULL) return -1;
 
 808         // parse a string containing the date/time in "free" format, this
 
 809         // function will try to make an educated guess at the string contents
 
 810         int ParseDateTime(const wxString& datetime) {
 
 812             const wxChar* _datetime = datetime;
 
 813             rv = self->ParseDateTime(_datetime);
 
 814             if (rv == NULL) return -1;
 
 815             return rv - _datetime;
 
 819         // parse a string containing the date only in "free" format (less
 
 820         // flexible than ParseDateTime)
 
 821         int ParseDate(const wxString& date) {
 
 823             const wxChar* _date = date;
 
 824             rv = self->ParseDate(_date);
 
 825             if (rv == NULL) return -1;
 
 829         // parse a string containing the time only in "free" format
 
 830         int ParseTime(const wxString& time) {
 
 832             const wxChar* _time = time;
 
 833             rv = self->ParseTime(_time);
 
 834             if (rv == NULL) return -1;
 
 840         // this function accepts strftime()-like format string (default
 
 841         // argument corresponds to the preferred date and time representation
 
 842         // for the current locale) and returns the string containing the
 
 843         // resulting text representation
 
 844     wxString Format(const wxString& format = wxPyDateFormatStr,
 
 845                     const wxDateTime::TimeZone& tz = LOCAL) const;
 
 847         // preferred date representation for the current locale
 
 848     wxString FormatDate() const;
 
 850         // preferred time representation for the current locale
 
 851     wxString FormatTime() const;
 
 853         // returns the string representing the date in ISO 8601 format
 
 855     wxString FormatISODate() const;
 
 857         // returns the string representing the time in ISO 8601 format
 
 859     wxString FormatISOTime() const;
 
 861     %pragma(python) addtoclass = "
 
 863         return '<wxDateTime: \"%s\" at %s>' % ( self.Format(), self.this)
 
 870 //---------------------------------------------------------------------------
 
 871 //---------------------------------------------------------------------------
 
 877         // return the timespan for the given number of seconds
 
 878     static wxTimeSpan Seconds(long sec);
 
 879     static wxTimeSpan Second();
 
 881         // return the timespan for the given number of minutes
 
 882     static wxTimeSpan Minutes(long min);
 
 883     static wxTimeSpan Minute();
 
 885         // return the timespan for the given number of hours
 
 886     static wxTimeSpan Hours(long hours);
 
 887     static wxTimeSpan Hour();
 
 889         // return the timespan for the given number of days
 
 890     static wxTimeSpan Days(long days);
 
 891     static wxTimeSpan Day();
 
 893         // return the timespan for the given number of weeks
 
 894     static wxTimeSpan Weeks(long days);
 
 895     static wxTimeSpan Week();
 
 897     // ------------------------------------------------------------------------
 
 900         // from separate values for each component, date set to 0 (hours are
 
 901         // not restricted to 0..24 range, neither are minutes, seconds or
 
 903     wxTimeSpan(long hours = 0,
 
 906                long milliseconds = 0);
 
 910     // ------------------------------------------------------------------------
 
 911     // arithmetics with time spans
 
 913         // add two timespans together
 
 914     inline wxTimeSpan& Add(const wxTimeSpan& diff);
 
 916         // subtract another timespan
 
 917     inline wxTimeSpan& Subtract(const wxTimeSpan& diff);
 
 919         // multiply timespan by a scalar
 
 920     inline wxTimeSpan& Multiply(int n);
 
 922         // negate the value of the timespan
 
 925         // return the absolute value of the timespan: does _not_ modify the
 
 927     inline wxTimeSpan Abs() const;
 
 930         wxTimeSpan __add__(const wxTimeSpan& other) { return *self + other; }
 
 931         wxTimeSpan __sub__(const wxTimeSpan& other) { return *self - other; }
 
 932         wxTimeSpan __mul__(int n)                   { return *self * n; }
 
 933         wxTimeSpan __rmul__(int n)                  { return n * *self; }
 
 934         wxTimeSpan __neg__()                        { return self->Negate(); }
 
 935         int __cmp__(const wxTimeSpan* other) {
 
 936             if (! other) return -1;
 
 937             if (*self <  *other) return -1;
 
 938             if (*self == *other) return 0;
 
 943     // comparaison (see also operator versions below)
 
 944     // ------------------------------------------------------------------------
 
 946         // is the timespan null?
 
 949         // is the timespan positive?
 
 950     bool IsPositive() const;
 
 952         // is the timespan negative?
 
 953     bool IsNegative() const;
 
 955         // are two timespans equal?
 
 956     inline bool IsEqualTo(const wxTimeSpan& ts) const;
 
 958         // compare two timestamps: works with the absolute values, i.e. -2
 
 959         // hours is longer than 1 hour. Also, it will return FALSE if the
 
 960         // timespans are equal in absolute value.
 
 961     inline bool IsLongerThan(const wxTimeSpan& ts) const;
 
 963         // compare two timestamps: works with the absolute values, i.e. 1
 
 964         // hour is shorter than -2 hours. Also, it will return FALSE if the
 
 965         // timespans are equal in absolute value.
 
 966     bool IsShorterThan(const wxTimeSpan& t) const;
 
 968     // ------------------------------------------------------------------------
 
 969     // breaking into days, hours, minutes and seconds
 
 971         // get the max number of weeks in this timespan
 
 972     inline int GetWeeks() const;
 
 973         // get the max number of days in this timespan
 
 974     inline int GetDays() const;
 
 975         // get the max number of hours in this timespan
 
 976     inline int GetHours() const;
 
 977         // get the max number of minutes in this timespan
 
 978     inline int GetMinutes() const;
 
 981          // get the max number of seconds in this timespan
 
 982     inline wxLongLong GetSeconds() const;
 
 983          // get the number of milliseconds in this timespan
 
 984     wxLongLong GetMilliseconds() const;
 
 986     // ------------------------------------------------------------------------
 
 987     // conversion to text
 
 989         // this function accepts strftime()-like format string (default
 
 990         // argument corresponds to the preferred date and time representation
 
 991         // for the current locale) and returns the string containing the
 
 992         // resulting text representation. Notice that only some of format
 
 993         // specifiers valid for wxDateTime are valid for wxTimeSpan: hours,
 
 994         // minutes and seconds make sense, but not "PM/AM" string for example.
 
 995     wxString Format(const wxString& format = wxPyDateFormatStr) const;
 
 997 //          // preferred date representation for the current locale
 
 998 //      wxString FormatDate() const;
 
1000 //          // preferred time representation for the current locale
 
1001 //      wxString FormatTime() const;
 
1003 //      %pragma(python) addtoclass = "
 
1004 //      def __repr__(self):
 
1005 //          return '<wxTimeSpan: \"%s\" at %s>' % ( self.Format(), self.this)
 
1006 //      def __str__(self):
 
1007 //          return self.Format()
 
1012 //---------------------------------------------------------------------------
 
1013 //---------------------------------------------------------------------------
 
1018         // this many years/months/weeks/days
 
1019     wxDateSpan(int years = 0, int months = 0, int weeks = 0, int days = 0)
 
1029         // get an object for the given number of days
 
1030     static wxDateSpan Days(int days);
 
1031     static wxDateSpan Day();
 
1033         // get an object for the given number of weeks
 
1034     static wxDateSpan Weeks(int weeks);
 
1035     static wxDateSpan Week();
 
1037         // get an object for the given number of months
 
1038     static wxDateSpan Months(int mon);
 
1039     static wxDateSpan Month();
 
1041         // get an object for the given number of years
 
1042     static wxDateSpan Years(int years);
 
1043     static wxDateSpan Year();
 
1046     // ------------------------------------------------------------------------
 
1048         // set number of years
 
1049     wxDateSpan& SetYears(int n);
 
1050         // set number of months
 
1051     wxDateSpan& SetMonths(int n);
 
1052         // set number of weeks
 
1053     wxDateSpan& SetWeeks(int n);
 
1054         // set number of days
 
1055     wxDateSpan& SetDays(int n);
 
1057         // get number of years
 
1058     int GetYears() const;
 
1059         // get number of months
 
1060     int GetMonths() const;
 
1061         // get number of weeks
 
1062     int GetWeeks() const;
 
1063         // get number of days
 
1064     int GetDays() const;
 
1065         // returns 7*GetWeeks() + GetDays()
 
1066     int GetTotalDays() const;
 
1069     // ------------------------------------------------------------------------
 
1071         // add another wxDateSpan to us
 
1072     inline wxDateSpan& Add(const wxDateSpan& other);
 
1074         // subtract another wxDateSpan from us
 
1075     inline wxDateSpan& Subtract(const wxDateSpan& other);
 
1077         // inverse the sign of this timespan
 
1078     inline wxDateSpan& Neg();
 
1080         // multiply all components by a (signed) number
 
1081     inline wxDateSpan& Multiply(int factor);
 
1084         wxDateSpan __add__(const wxDateSpan& other) { return *self + other; }
 
1085         wxDateSpan __sub__(const wxDateSpan& other) { return *self - other; }
 
1086         wxDateSpan __mul__(int n)                   { return *self * n; }
 
1087         wxDateSpan __rmul__(int n)                  { return n * *self; }
 
1088         wxDateSpan __neg__()                        { return self->Negate(); }
 
1093 //---------------------------------------------------------------------------
 
1095 long wxGetLocalTime();
 
1096 long wxGetUTCTime();
 
1097 long wxGetCurrentTime();
 
1098 wxLongLong wxGetLocalTimeMillis();
 
1100 //---------------------------------------------------------------------------
 
1101 //---------------------------------------------------------------------------
 
1104     // These are no longer needed since utils is back in the core
 
1105 //      wxClassInfo::CleanUpClasses();
 
1106 //      wxClassInfo::InitializeClasses();
 
1109 //---------------------------------------------------------------------------