X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2dc104421c340091342156d6b01f61f1ccff438..f6342fb5e6524edffa219d5843536ea279bba4df:/wxPython/src/_datetime.i diff --git a/wxPython/src/_datetime.i b/wxPython/src/_datetime.i index 13b2b50eac..4a278dcd96 100644 --- a/wxPython/src/_datetime.i +++ b/wxPython/src/_datetime.i @@ -18,19 +18,19 @@ %{ #include - %} -MAKE_CONST_WXSTRING2(DateFormatStr, wxT("%c")); -MAKE_CONST_WXSTRING2(TimeSpanFormatStr, wxT("%H:%M:%S")); + +MAKE_CONST_WXSTRING(DefaultDateTimeFormat); +MAKE_CONST_WXSTRING(DefaultTimeSpanFormat); //--------------------------------------------------------------------------- -%typemap(in) wxDateTime::TimeZone& (bool temp=False) { +%typemap(in) wxDateTime::TimeZone& (bool temp=false) { $1 = new wxDateTime::TimeZone((wxDateTime::TZ)PyInt_AsLong($input)); - temp = True; + temp = true; } -%typemap(python,freearg) wxDateTime::TimeZone& { +%typemap(freearg) wxDateTime::TimeZone& { if (temp$argnum) delete $1; } @@ -42,7 +42,7 @@ MAKE_CONST_WXSTRING2(TimeSpanFormatStr, wxT("%H:%M:%S")); // Convert a wxLongLong to a Python Long by getting the hi/lo dwords, then // shifting and oring them together -%typemap(python, out) wxLongLong { +%typemap(out) wxLongLong { PyObject *hi, *lo, *shifter, *shifted; hi = PyLong_FromLong( $1.GetHi() ); lo = PyLong_FromLong( $1.GetLo() ); @@ -78,7 +78,7 @@ public: GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1, GMT0, GMT1, GMT2, GMT3, GMT4, GMT5, GMT6, - GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, + GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, GMT13, // Europe WET = GMT0, // Western Europe Time @@ -108,10 +108,14 @@ public: // Australia A_WST = GMT8, // Western Standard Time - A_CST = GMT12 + 1, // Central Standard Time (+9.5) + A_CST = GMT13 + 1, // Central Standard Time (+9.5) A_EST = GMT10, // Eastern Standard Time A_ESST = GMT11, // Eastern Summer Time + // New Zealand + NZST = GMT12, // Standard Time + NZDT = GMT13, // Daylight Saving Time + // Universal Coordinated Time = the new and politically correct name // for GMT UTC = GMT0 @@ -343,15 +347,15 @@ public: // returns the number of days in this year (356 or 355 for Gregorian // calendar usually :-) - %name(GetNumberOfDaysinYear) - static wxDateTime_t GetNumberOfDays(int year, Calendar cal = Gregorian); + %Rename(GetNumberOfDaysinYear, + static wxDateTime_t, GetNumberOfDays(int year, Calendar cal = Gregorian)); // get the number of the days in the given month (default value for // the year means the current one) - %name(GetNumberOfDaysInMonth) - static wxDateTime_t GetNumberOfDays(Month month, + %Rename(GetNumberOfDaysInMonth, + static wxDateTime_t, GetNumberOfDays(Month month, int year = Inv_Year, - Calendar cal = Gregorian); + Calendar cal = Gregorian)); // get the full (default) or abbreviated month name in the current // locale, returns empty string on error @@ -363,11 +367,24 @@ public: static wxString GetWeekDayName(WeekDay weekday, NameFlags flags = Name_Full); - DocDeclAStr( - static void, GetAmPmStrings(wxString *OUTPUT, wxString *OUTPUT), - "GetAmPmStrings() -> (am, pm)", - "Get the AM and PM strings in the current locale (may be empty)"); - + %extend { + DocAStr( + GetAmPmStrings, + "GetAmPmStrings() -> (am, pm)", + "Get the AM and PM strings in the current locale (may be empty)", ""); + static PyObject* GetAmPmStrings() { + wxString am; + wxString pm; + wxDateTime::GetAmPmStrings(&am, &pm); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyObject* tup = PyTuple_New(2); + PyTuple_SET_ITEM(tup, 0, wx2PyString(am)); + PyTuple_SET_ITEM(tup, 1, wx2PyString(pm)); + wxPyEndBlockThreads(blocked); + return tup; + } + } + // return True if the given country uses DST for this year static bool IsDSTApplicable(int year = Inv_Year, Country country = Country_Default); @@ -400,19 +417,20 @@ public: // constructors wxDateTime(); - %name(DateTimeFromTimeT)wxDateTime(time_t timet); - %name(DateTimeFromJDN)wxDateTime(double jdn); - %name(DateTimeFromHMS)wxDateTime(wxDateTime_t hour, + %RenameCtor(DateTimeFromTimeT, wxDateTime(time_t timet)); + %RenameCtor(DateTimeFromJDN, wxDateTime(double jdn)); + %RenameCtor(DateTimeFromHMS, wxDateTime(wxDateTime_t hour, wxDateTime_t minute = 0, wxDateTime_t second = 0, - wxDateTime_t millisec = 0); - %name(DateTimeFromDMY)wxDateTime(wxDateTime_t day, + wxDateTime_t millisec = 0)); + %RenameCtor(DateTimeFromDMY, wxDateTime(wxDateTime_t day, Month month = Inv_Month, int year = Inv_Year, wxDateTime_t hour = 0, wxDateTime_t minute = 0, wxDateTime_t second = 0, - wxDateTime_t millisec = 0); + wxDateTime_t millisec = 0)); + %RenameCtor(DateTimeFromDateTime, wxDateTime(const wxDateTime& date)); ~wxDateTime(); @@ -422,16 +440,16 @@ public: wxDateTime& SetToCurrent(); // set to given time_t value - %name(SetTimeT)wxDateTime& Set(time_t timet); + %Rename(SetTimeT, wxDateTime&, Set(time_t timet)); // set to given JDN (beware of rounding errors) - %name(SetJDN)wxDateTime& Set(double jdn); + %Rename(SetJDN, wxDateTime&, Set(double jdn)); // set to given time, date = today - %name(SetHMS)wxDateTime& Set(wxDateTime_t hour, + %Rename(SetHMS, wxDateTime&, Set(wxDateTime_t hour, wxDateTime_t minute = 0, wxDateTime_t second = 0, - wxDateTime_t millisec = 0); + wxDateTime_t millisec = 0)); // from separate values for each component with explicit date // (defaults for month and year are the current values) @@ -446,6 +464,10 @@ public: // resets time to 00:00:00, doesn't change the date wxDateTime& ResetTime(); + // get the date part of this object only, i.e. the object which has the + // same date as this one but time of 00:00:00 + wxDateTime GetDateOnly() const; + // the following functions don't change the values of the other // fields, i.e. SetMinute() won't change either hour or seconds value @@ -488,10 +510,6 @@ public: int n = 1, Month month = Inv_Month, int year = Inv_Year); -// wxDateTime GetWeekDay(WeekDay weekday, -// int n = 1, -// Month month = Inv_Month, -// int year = Inv_Year); // sets to the last weekday in the given month, year bool SetToLastWeekDay(WeekDay weekday, @@ -501,12 +519,12 @@ public: Month month = Inv_Month, int year = Inv_Year); - // sets the date to the given day of the given week in the year, - // returns True on success and False if given date doesn't exist (e.g. - // numWeek is > 53) - bool SetToTheWeek(wxDateTime_t numWeek, WeekDay weekday = Mon, WeekFlags flags = Monday_First); - wxDateTime GetWeek(wxDateTime_t numWeek, WeekDay weekday = Mon, WeekFlags flags = Monday_First); - + // returns the date corresponding to the given week day of the given + // week (in ISO notation) of the specified year + static wxDateTime SetToWeekOfYear(int year, + wxDateTime_t numWeek, + WeekDay weekday = Mon); + // sets the date to the last day of the given (or current) month or the // given (or current) year wxDateTime& SetToLastMonthDay(Month month = Inv_Month, @@ -559,13 +577,25 @@ public: // timezone stuff // transform to any given timezone - wxDateTime ToTimezone(const wxDateTime::TimeZone& tz, bool noDST = False); - wxDateTime& MakeTimezone(const wxDateTime::TimeZone& tz, bool noDST = False); + wxDateTime ToTimezone(const wxDateTime::TimeZone& tz, bool noDST = false); + wxDateTime& MakeTimezone(const wxDateTime::TimeZone& tz, bool noDST = false); + + // interpret current value as being in another timezone and transform + // it to local one + wxDateTime FromTimezone(const wxDateTime::TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeFromTimezone(const wxDateTime::TimeZone& tz, bool noDST = false); + + // transform to/from GMT/UTC + wxDateTime ToUTC(bool noDST = false) const; + wxDateTime& MakeUTC(bool noDST = false); - // transform to GMT/UTC - wxDateTime ToGMT(bool noDST = False); - wxDateTime& MakeGMT(bool noDST = False); + wxDateTime ToGMT(bool noDST = false) const; + wxDateTime& MakeGMT(bool noDST = false); + wxDateTime FromUTC(bool noDST = false) const; + wxDateTime& MakeFromUTC(bool noDST = false); + + // is daylight savings time in effect at this moment according to the // rules of the specified country? // @@ -580,7 +610,12 @@ public: // is the date valid (True even for non initialized objects)? inline bool IsValid() const; + %pythoncode { IsOk = IsValid } + %pythoncode { Ok = IsOk } + + %pythoncode { def __nonzero__(self): return self.IsOk() }; + // get the number of seconds since the Unix epoch - returns (time_t)-1 // if the value is out of range inline time_t GetTicks() const; @@ -667,15 +702,15 @@ public: // arithmetics with dates (see also below for more operators) // add a time span (positive or negative) - %name(AddTS) wxDateTime& Add(const wxTimeSpan& diff); + %Rename(AddTS, wxDateTime&, Add(const wxTimeSpan& diff)); // add a date span (positive or negative) - %name(AddDS) wxDateTime& Add(const wxDateSpan& diff); + %Rename(AddDS, wxDateTime&, Add(const wxDateSpan& diff)); // subtract a time span (positive or negative) - %name(SubtractTS) wxDateTime& Subtract(const wxTimeSpan& diff); + %Rename(SubtractTS, wxDateTime&, Subtract(const wxTimeSpan& diff)); // subtract a date span (positive or negative) - %name(SubtractDS) wxDateTime& Subtract(const wxDateSpan& diff); + %Rename(SubtractDS, wxDateTime&, Subtract(const wxDateSpan& diff)); // return the difference between two dates wxTimeSpan Subtract(const wxDateTime& dt) const; @@ -694,14 +729,15 @@ public: inline wxDateTime& operator-=(const wxDateSpan& diff); +// inline bool operator<(const wxDateTime& dt) const; +// inline bool operator<=(const wxDateTime& dt) const; +// inline bool operator>(const wxDateTime& dt) const; +// inline bool operator>=(const wxDateTime& dt) const; +// inline bool operator==(const wxDateTime& dt) const; +// inline bool operator!=(const wxDateTime& dt) const; + %nokwargs __add__; %nokwargs __sub__; - %nokwargs __lt__; - %nokwargs __le__; - %nokwargs __gt__; - %nokwargs __ge__; - %nokwargs __eq__; - %nokwargs __ne__; %extend { wxDateTime __add__(const wxTimeSpan& other) { return *self + other; } wxDateTime __add__(const wxDateSpan& other) { return *self + other; } @@ -710,14 +746,39 @@ public: wxDateTime __sub__(const wxTimeSpan& other) { return *self - other; } wxDateTime __sub__(const wxDateSpan& other) { return *self - other; } - bool __lt__(const wxDateTime& other) { return *self < other; } - bool __le__(const wxDateTime& other) { return *self <= other; } - bool __gt__(const wxDateTime& other) { return *self > other; } - bool __ge__(const wxDateTime& other) { return *self >= other; } - bool __eq__(const wxDateTime& other) { return *self == other; } - bool __ne__(const wxDateTime& other) { return *self != other; } + // These fall back to just comparing pointers if other is NULL, or if + // either operand is invalid. This allows Python comparrisons to None + // to not assert and to return a sane value for the compare. + bool __lt__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self < other; + return (*self < *other); + } + bool __le__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self <= other; + return (*self <= *other); + } + bool __gt__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self > other; + return (*self > *other); + } + bool __ge__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self >= other; + return (*self >= *other); + } + + bool __eq__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self == other; + return (*self == *other); + } + bool __ne__(const wxDateTime* other) { + if (!other || !self->IsValid() || !other->IsValid()) return self != other; + return (*self != *other); + } } + + + // ------------------------------------------------------------------------ // conversion from text: all conversions from text return -1 on failure, @@ -742,7 +803,7 @@ public: // default, they will not change if they had valid values or will // default to Today() otherwise) int ParseFormat(const wxString& date, - const wxString& format = wxPyDateFormatStr, + const wxString& format = wxPyDefaultDateTimeFormat, const wxDateTime& dateDef = wxDefaultDateTime) { const wxChar* rv; const wxChar* _date = date; @@ -787,7 +848,7 @@ public: // argument corresponds to the preferred date and time representation // for the current locale) and returns the string containing the // resulting text representation - wxString Format(const wxString& format = wxPyDateFormatStr, + wxString Format(const wxString& format = wxPyDefaultDateTimeFormat, const wxDateTime::TimeZone& tz = LOCAL_TZ) const; // preferred date representation for the current locale @@ -806,10 +867,42 @@ public: %pythoncode { def __repr__(self): - return '' % ( self.Format(), self.this) + if self.IsValid(): + f = self.Format().encode(wx.GetDefaultPyEncoding()) + return '' % ( f, self.this) + else: + return '' % self.this def __str__(self): - return self.Format() + if self.IsValid(): + return self.Format().encode(wx.GetDefaultPyEncoding()) + else: + return "INVALID DateTime" } + + %property(Day, GetDay, SetDay, doc="See `GetDay` and `SetDay`"); + %property(DayOfYear, GetDayOfYear, doc="See `GetDayOfYear`"); + %property(Hour, GetHour, SetHour, doc="See `GetHour` and `SetHour`"); + %property(JDN, GetJDN, SetJDN, doc="See `GetJDN` and `SetJDN`"); + %property(JulianDayNumber, GetJulianDayNumber, doc="See `GetJulianDayNumber`"); + %property(LastMonthDay, GetLastMonthDay, doc="See `GetLastMonthDay`"); + %property(LastWeekDay, GetLastWeekDay, doc="See `GetLastWeekDay`"); + %property(MJD, GetMJD, doc="See `GetMJD`"); + %property(Millisecond, GetMillisecond, SetMillisecond, doc="See `GetMillisecond` and `SetMillisecond`"); + %property(Minute, GetMinute, SetMinute, doc="See `GetMinute` and `SetMinute`"); + %property(ModifiedJulianDayNumber, GetModifiedJulianDayNumber, doc="See `GetModifiedJulianDayNumber`"); + %property(Month, GetMonth, SetMonth, doc="See `GetMonth` and `SetMonth`"); + %property(NextWeekDay, GetNextWeekDay, doc="See `GetNextWeekDay`"); + %property(PrevWeekDay, GetPrevWeekDay, doc="See `GetPrevWeekDay`"); + %property(RataDie, GetRataDie, doc="See `GetRataDie`"); + %property(Second, GetSecond, SetSecond, doc="See `GetSecond` and `SetSecond`"); + %property(Ticks, GetTicks, doc="See `GetTicks`"); + %property(WeekDay, GetWeekDay, doc="See `GetWeekDay`"); + %property(WeekDayInSameWeek, GetWeekDayInSameWeek, doc="See `GetWeekDayInSameWeek`"); + %property(WeekOfMonth, GetWeekOfMonth, doc="See `GetWeekOfMonth`"); + %property(WeekOfYear, GetWeekOfYear, doc="See `GetWeekOfYear`"); + %property(Year, GetYear, SetYear, doc="See `GetYear` and `SetYear`"); + %property(YearDay, GetYearDay, doc="See `GetYearDay`"); + }; //--------------------------------------------------------------------------- @@ -822,9 +915,16 @@ public: class wxTimeSpan { public: + + // TODO: Need an input typemap for wxLongLong... + + + // return the timespan for the given number of milliseconds + static wxTimeSpan Milliseconds(/*wxLongLong*/ long ms); + static wxTimeSpan Millisecond(); // return the timespan for the given number of seconds - static wxTimeSpan Seconds(long sec); + static wxTimeSpan Seconds(/*wxLongLong*/ long sec); static wxTimeSpan Second(); // return the timespan for the given number of minutes @@ -851,8 +951,8 @@ public: // milliseconds) wxTimeSpan(long hours = 0, long minutes = 0, - long seconds = 0, - long milliseconds = 0); + /*wxLongLong*/ long seconds = 0, + /*wxLongLong*/ long milliseconds = 0); ~wxTimeSpan(); @@ -886,12 +986,13 @@ public: wxTimeSpan __sub__(const wxTimeSpan& other) { return *self - other; } wxTimeSpan __mul__(int n) { return *self * n; } wxTimeSpan __rmul__(int n) { return n * *self; } - bool __lt__(const wxTimeSpan& other) { return *self < other; } - bool __le__(const wxTimeSpan& other) { return *self <= other; } - bool __gt__(const wxTimeSpan& other) { return *self > other; } - bool __ge__(const wxTimeSpan& other) { return *self >= other; } - bool __eq__(const wxTimeSpan& other) { return *self == other; } - bool __ne__(const wxTimeSpan& other) { return *self != other; } + + bool __lt__(const wxTimeSpan* other) { return other ? (*self < *other) : false; } + bool __le__(const wxTimeSpan* other) { return other ? (*self <= *other) : false; } + bool __gt__(const wxTimeSpan* other) { return other ? (*self > *other) : true; } + bool __ge__(const wxTimeSpan* other) { return other ? (*self >= *other) : true; } + bool __eq__(const wxTimeSpan* other) { return other ? (*self == *other) : false; } + bool __ne__(const wxTimeSpan* other) { return other ? (*self != *other) : true; } } @@ -947,14 +1048,22 @@ public: // resulting text representation. Notice that only some of format // specifiers valid for wxDateTime are valid for wxTimeSpan: hours, // minutes and seconds make sense, but not "PM/AM" string for example. - wxString Format(const wxString& format = wxPyTimeSpanFormatStr) const; + wxString Format(const wxString& format = wxPyDefaultTimeSpanFormat) const; %pythoncode { def __repr__(self): - return '' % ( self.Format(), self.this) + f = self.Format().encode(wx.GetDefaultPyEncoding()) + return '' % ( f, self.this) def __str__(self): - return self.Format() + return self.Format().encode(wx.GetDefaultPyEncoding()) } + + %property(days, GetDays, doc="See `GetDays`"); + %property(hours, GetHours, doc="See `GetHours`"); + %property(milliseconds, GetMilliseconds, doc="See `GetMilliseconds`"); + %property(minutes, GetMinutes, doc="See `GetMinutes`"); + %property(seconds, GetSeconds, doc="See `GetSeconds`"); + %property(weeks, GetWeeks, doc="See `GetWeeks`"); }; @@ -1071,13 +1180,21 @@ public: wxDateSpan __sub__(const wxDateSpan& other) { return *self - other; } wxDateSpan __mul__(int n) { return *self * n; } wxDateSpan __rmul__(int n) { return n * *self; } -// bool __lt__(const wxDateSpan& other) { return *self < other; } -// bool __le__(const wxDateSpan& other) { return *self <= other; } -// bool __gt__(const wxDateSpan& other) { return *self > other; } -// bool __ge__(const wxDateSpan& other) { return *self >= other; } - bool __eq__(const wxDateSpan& other) { return *self == other; } - bool __ne__(const wxDateSpan& other) { return *self != other; } + +// bool __lt__(const wxDateSpan* other) { return other ? (*self < *other) : false; } +// bool __le__(const wxDateSpan* other) { return other ? (*self <= *other) : false; } +// bool __gt__(const wxDateSpan* other) { return other ? (*self > *other) : true; } +// bool __ge__(const wxDateSpan* other) { return other ? (*self >= *other) : true; } + + bool __eq__(const wxDateSpan* other) { return other ? (*self == *other) : false; } + bool __ne__(const wxDateSpan* other) { return other ? (*self != *other) : true; } } + + %property(days, GetDays, SetDays, doc="See `GetDays` and `SetDays`"); + %property(months, GetMonths, SetMonths, doc="See `GetMonths` and `SetMonths`"); + %property(totalDays, GetTotalDays, doc="See `GetTotalDays`"); + %property(weeks, GetWeeks, SetWeeks, doc="See `GetWeeks` and `SetWeeks`"); + %property(years, GetYears, SetYears, doc="See `GetYears` and `SetYears`"); }; @@ -1092,5 +1209,9 @@ long wxGetUTCTime(); long wxGetCurrentTime(); wxLongLong wxGetLocalTimeMillis(); +%immutable; +const wxDateTime wxDefaultDateTime; +%mutable; + //--------------------------------------------------------------------------- //---------------------------------------------------------------------------