]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
Add support for wxSL_INVERSE flag. Also uses new inverse logic to make Mac vertical...
[wxWidgets.git] / src / common / datetime.cpp
index c8f8b2aea594b0d27ea827801f36b7f6596b510d..9a2476991c072d40727e976dcd95a2609a76356c 100644 (file)
@@ -233,6 +233,9 @@ static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] =
 // global data
 // ----------------------------------------------------------------------------
 
+const wxChar * wxDefaultDateTimeFormat = wxT("%c");
+const wxChar * wxDefaultTimeSpanFormat = wxT("%H:%M:%S");
+
 // in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to
 // indicate an invalid wxDateTime object
 const wxDateTime wxDefaultDateTime;
@@ -500,7 +503,7 @@ static bool GetNumericToken(size_t len, const wxChar*& p, unsigned long *number)
             break;
     }
 
-    return !s.IsEmpty() && s.ToULong(number);
+    return !s.empty() && s.ToULong(number);
 }
 
 // scans all alphabetic characters and returns the resulting string
@@ -536,14 +539,14 @@ wxDateTime::Tm::Tm(const struct tm& tm, const TimeZone& tz)
               : m_tz(tz)
 {
     msec = 0;
-    sec = tm.tm_sec;
-    min = tm.tm_min;
-    hour = tm.tm_hour;
-    mday = tm.tm_mday;
+    sec = (wxDateTime::wxDateTime_t)tm.tm_sec;
+    min = (wxDateTime::wxDateTime_t)tm.tm_min;
+    hour = (wxDateTime::wxDateTime_t)tm.tm_hour;
+    mday = (wxDateTime::wxDateTime_t)tm.tm_mday;
     mon = (wxDateTime::Month)tm.tm_mon;
     year = 1900 + tm.tm_year;
-    wday = tm.tm_wday;
-    yday = tm.tm_yday;
+    wday = (wxDateTime::wxDateTime_t)tm.tm_wday;
+    yday = (wxDateTime::wxDateTime_t)tm.tm_yday;
 }
 
 bool wxDateTime::Tm::IsValid() const
@@ -559,7 +562,7 @@ void wxDateTime::Tm::ComputeWeekDay()
     // compute the week day from day/month/year: we use the dumbest algorithm
     // possible: just compute our JDN and then use the (simple to derive)
     // formula: weekday = (JDN + 1.5) % 7
-    wday = (wxDateTime::WeekDay)(GetTruncatedJDN(mday, mon, year) + 2) % 7;
+    wday = (wxDateTime::wxDateTime_t)((wxDateTime::WeekDay)(GetTruncatedJDN(mday, mon, year) + 2) % 7);
 }
 
 void wxDateTime::Tm::AddMonths(int monDiff)
@@ -597,7 +600,7 @@ void wxDateTime::Tm::AddDays(int dayDiff)
         dayDiff += GetNumOfDaysInMonth(year, mon);
     }
 
-    mday += dayDiff;
+    mday = (wxDateTime::wxDateTime_t)( mday + dayDiff );
     while ( mday > GetNumOfDaysInMonth(year, mon) )
     {
         mday -= GetNumOfDaysInMonth(year, mon);
@@ -1168,16 +1171,11 @@ wxDateTime& wxDateTime::Set(const struct tm& tm)
         // less than timezone - try to make it work for this case
         if ( tm2.tm_year == 70 && tm2.tm_mon == 0 && tm2.tm_mday == 1 )
         {
-            // add timezone to make sure that date is in range
-            tm2.tm_sec -= GetTimeZone();
-
-            timet = mktime(&tm2);
-            if ( timet != (time_t)-1 )
-            {
-                timet += GetTimeZone();
-
-                return Set(timet);
-            }
+            return Set((time_t)(
+                       GetTimeZone() +
+                       tm2.tm_hour * MIN_PER_HOUR * SEC_PER_MIN +
+                       tm2.tm_min * SEC_PER_MIN +
+                       tm2.tm_sec));
         }
 
         wxFAIL_MSG( _T("mktime() failed") );
@@ -1262,7 +1260,10 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
         (void)Set(tm);
 
         // and finally adjust milliseconds
-        return SetMillisecond(millisec);
+        if (IsValid())
+            SetMillisecond(millisec);
+
+        return *this;
     }
     else
     {
@@ -1873,7 +1874,7 @@ bool wxDateTime::SetToWeekDay(WeekDay weekday,
 static inline
 wxDateTime::wxDateTime_t GetDayOfYearFromTm(const wxDateTime::Tm& tm)
 {
-    return gs_cumulatedDays[wxDateTime::IsLeapYear(tm.year)][tm.mon] + tm.mday;
+    return (wxDateTime::wxDateTime_t)(gs_cumulatedDays[wxDateTime::IsLeapYear(tm.year)][tm.mon] + tm.mday);
 }
 
 wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const
@@ -1941,7 +1942,7 @@ wxDateTime::GetWeekOfYear(wxDateTime::WeekFlags flags, const TimeZone& tz) const
         }
     }
 
-    return week;
+    return (wxDateTime::wxDateTime_t)week;
 }
 
 wxDateTime::wxDateTime_t wxDateTime::GetWeekOfMonth(wxDateTime::WeekFlags flags,
@@ -1974,7 +1975,7 @@ wxDateTime& wxDateTime::SetToYearDay(wxDateTime::wxDateTime_t yday)
         // yday lies in December then
         if ( (mon == Dec) || (yday <= gs_cumulatedDays[isLeap][mon + 1]) )
         {
-            Set(yday - gs_cumulatedDays[isLeap][mon], mon, year);
+            Set((wxDateTime::wxDateTime_t)(yday - gs_cumulatedDays[isLeap][mon]), mon, year);
 
             break;
         }
@@ -2394,7 +2395,7 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
                         fmt += *p;
                     }
 
-                    if ( !fmt.IsEmpty() )
+                    if ( !fmt.empty() )
                     {
                         // we've only got the flags and width so far in fmt
                         fmt.Prepend(_T('%'));
@@ -2467,11 +2468,11 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         return (wxChar *)NULL;
     }
 
-    wxDateTime_t day = *p++ - _T('0');
+    wxDateTime_t day = (wxDateTime_t)(*p++ - _T('0'));
     if ( wxIsdigit(*p) )
     {
         day *= 10;
-        day += *p++ - _T('0');
+        day = (wxDateTime_t)(day + (*p++ - _T('0')));
     }
 
     if ( *p++ != _T(' ') )
@@ -2565,7 +2566,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         return (wxChar *)NULL;
     }
 
-    wxDateTime_t hour = *p++ - _T('0');
+    wxDateTime_t hour = (wxDateTime_t)(*p++ - _T('0'));
 
     if ( !wxIsdigit(*p) )
     {
@@ -2573,7 +2574,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
     }
 
     hour *= 10;
-    hour += *p++ - _T('0');
+    hour = (wxDateTime_t)(hour + (*p++ - _T('0')));
 
     if ( *p++ != _T(':') )
     {
@@ -2585,7 +2586,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         return (wxChar *)NULL;
     }
 
-    wxDateTime_t min = *p++ - _T('0');
+    wxDateTime_t min = (wxDateTime_t)(*p++ - _T('0'));
 
     if ( !wxIsdigit(*p) )
     {
@@ -2593,7 +2594,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
     }
 
     min *= 10;
-    min += *p++ - _T('0');
+    min = (wxDateTime_t)(min + *p++ - _T('0'));
 
     wxDateTime_t sec = 0;
     if ( *p++ == _T(':') )
@@ -2603,7 +2604,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
             return (wxChar *)NULL;
         }
 
-        sec = *p++ - _T('0');
+        sec = (wxDateTime_t)(*p++ - _T('0'));
 
         if ( !wxIsdigit(*p) )
         {
@@ -2611,7 +2612,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         }
 
         sec *= 10;
-        sec += *p++ - _T('0');
+        sec = (wxDateTime_t)(sec + *p++ - _T('0'));
     }
 
     if ( *p++ != _T(' ') )
@@ -2966,7 +2967,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
                     wxString am, pm, token = GetAlphaToken(input);
 
                     GetAmPmStrings(&am, &pm);
-                    if (am.IsEmpty() && pm.IsEmpty())
+                    if (am.empty() && pm.empty())
                         return (wxChar *)NULL;  // no am/pm strings defined
                     if ( token.CmpNoCase(pm) == 0 )
                     {
@@ -3392,19 +3393,23 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
     {
         wxString date = wxGetTranslation(literalDates[n].str);
         size_t len = date.length();
-        if ( wxStrlen(p) >= len && (wxString(p, len).CmpNoCase(date) == 0) )
+        if ( wxStrlen(p) >= len )
         {
-            // nothing can follow this, so stop here
-            p += len;
-
-            int dayDiffFromToday = literalDates[n].dayDiffFromToday;
-            *this = Today();
-            if ( dayDiffFromToday )
+            wxString str(p, len);
+            if ( str.CmpNoCase(date) == 0 )
             {
-                *this += wxDateSpan::Days(dayDiffFromToday);
-            }
+                // nothing can follow this, so stop here
+                p += len;
+
+                int dayDiffFromToday = literalDates[n].dayDiffFromToday;
+                *this = Today();
+                if ( dayDiffFromToday )
+                {
+                    *this += wxDateSpan::Days(dayDiffFromToday);
+                }
 
-            return p;
+                return p;
+            }
         }
     }
 
@@ -3459,9 +3464,11 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                 }
                 else // may be either day or year
                 {
-                    wxDateTime_t maxDays = haveMon
+                    wxDateTime_t maxDays = (wxDateTime_t)(
+                        haveMon
                         ? GetNumOfDaysInMonth(haveYear ? year : Inv_Year, mon)
-                        : 31;
+                        : 31
+                    );
 
                     // can it be day?
                     if ( (val == 0) || (val > (unsigned long)maxDays) )
@@ -3515,7 +3522,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                     {
                         // no need to check in month range as always < 12, but
                         // the days are counted from 1 unlike the months
-                        day = (wxDateTime_t)mon + 1;
+                        day = (wxDateTime_t)(mon + 1);
                         haveDay = true;
                     }
                     else
@@ -3637,7 +3644,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                 // we're in the current year then
                 if ( (year > 0) && (year <= (int)GetNumOfDaysInMonth(Inv_Year, mon)) )
                 {
-                    day = year;
+                    day = (wxDateTime_t)year;
 
                     haveMon = true;
                     haveYear = false;
@@ -4026,7 +4033,7 @@ void wxDateTimeHolidayAuthority::AddAuthority(wxDateTimeHolidayAuthority *auth)
 
 wxDateTimeHolidayAuthority::~wxDateTimeHolidayAuthority()
 {
-    // nothing to do here
+    // required here for Darwin
 }
 
 // ----------------------------------------------------------------------------