]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
Lots of things to make menus and submenus work.
[wxWidgets.git] / src / common / datetime.cpp
index 2874bc6519f40a09146aff3cc5d1eb2f571ee97c..418a72f51c89faad35ac925dcfc6396774254732 100644 (file)
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#if !defined(wxUSE_DATETIME) || wxUSE_DATETIME
+
 #ifndef WX_PRECOMP
     #include "wx/string.h"
 #ifndef WX_PRECOMP
     #include "wx/string.h"
-    #include "wx/intl.h"
     #include "wx/log.h"
 #endif // WX_PRECOMP
 
     #include "wx/log.h"
 #endif // WX_PRECOMP
 
+#include "wx/intl.h"
 #include "wx/thread.h"
 #include "wx/tokenzr.h"
 #include "wx/module.h"
 #include "wx/thread.h"
 #include "wx/tokenzr.h"
 #include "wx/module.h"
         #define WX_TIMEZONE _timezone
     #elif defined(__MWERKS__)
         long wxmw_timezone = 28800;
         #define WX_TIMEZONE _timezone
     #elif defined(__MWERKS__)
         long wxmw_timezone = 28800;
-        #define WX_TIMEZONE wxmw_timezone;
+        #define WX_TIMEZONE wxmw_timezone
+    #elif defined(__DJGPP__)
+        #include <sys/timeb.h>
+        #include <values.h>
+        static long wxGetTimeZone()
+        {
+            static long timezone = MAXLONG; // invalid timezone
+            if (timezone == MAXLONG)
+            {
+                struct timeb tb;
+                ftime(&tb);
+                timezone = tb.timezone;
+            }
+            return timezone;
+        }
+        #define WX_TIMEZONE wxGetTimeZone()
     #else // unknown platform - try timezone
         #define WX_TIMEZONE timezone
     #endif
     #else // unknown platform - try timezone
         #define WX_TIMEZONE timezone
     #endif
@@ -194,13 +211,7 @@ static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] =
 
 // in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to
 // indicate an invalid wxDateTime object
 
 // in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to
 // indicate an invalid wxDateTime object
-#ifdef __WIN16__
-static const wxDateTime gs_dtDefault;
-#else
-static const wxDateTime gs_dtDefault = wxLongLong((long)ULONG_MAX, ULONG_MAX);
-#endif
-
-const wxDateTime& wxDefaultDateTime = gs_dtDefault;
+const wxDateTime wxDefaultDateTime;
 
 wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
 
 
 wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
 
@@ -1071,8 +1082,6 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
 // the values in the tm structure contain the local time
 wxDateTime& wxDateTime::Set(const struct tm& tm)
 {
 // the values in the tm structure contain the local time
 wxDateTime& wxDateTime::Set(const struct tm& tm)
 {
-    wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
-
     struct tm tm2(tm);
     time_t timet = mktime(&tm2);
 
     struct tm tm2(tm);
     time_t timet = mktime(&tm2);
 
@@ -1111,8 +1120,6 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour,
                             wxDateTime_t second,
                             wxDateTime_t millisec)
 {
                             wxDateTime_t second,
                             wxDateTime_t millisec)
 {
-    wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
-
     // we allow seconds to be 61 to account for the leap seconds, even if we
     // don't use them really
     wxDATETIME_CHECK( hour < 24 &&
     // we allow seconds to be 61 to account for the leap seconds, even if we
     // don't use them really
     wxDATETIME_CHECK( hour < 24 &&
@@ -1145,8 +1152,6 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
                             wxDateTime_t second,
                             wxDateTime_t millisec)
 {
                             wxDateTime_t second,
                             wxDateTime_t millisec)
 {
-    wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
-
     wxDATETIME_CHECK( hour < 24 &&
                       second < 62 &&
                       minute < 60 &&
     wxDATETIME_CHECK( hour < 24 &&
                       second < 62 &&
                       minute < 60 &&
@@ -1339,8 +1344,6 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
     // check that the algorithm gave us something reasonable
     wxASSERT_MSG( (0 < month) && (month <= 12), _T("invalid month") );
     wxASSERT_MSG( (1 <= day) && (day < 32), _T("invalid day") );
     // check that the algorithm gave us something reasonable
     wxASSERT_MSG( (0 < month) && (month <= 12), _T("invalid month") );
     wxASSERT_MSG( (1 <= day) && (day < 32), _T("invalid day") );
-    wxASSERT_MSG( (INT_MIN <= year) && (year <= INT_MAX),
-                  _T("year range overflow") );
 
     // construct Tm from these values
     Tm tm;
 
     // construct Tm from these values
     Tm tm;
@@ -2937,11 +2940,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
         // take this date as default
         tmDef = dateDef.GetTm();
     }
         // take this date as default
         tmDef = dateDef.GetTm();
     }
-#ifdef __WIN16__
-    else if ( m_time != 0 )
-#else
-    else if ( m_time != wxLongLong(0) )
-#endif
+    else if ( IsValid() )
     {
         // if this date is valid, don't change it
         tmDef = GetTm();
     {
         // if this date is valid, don't change it
         tmDef = GetTm();
@@ -3170,7 +3169,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                     // but we already have a month - maybe we guessed wrong?
                     if ( !haveDay )
                     {
                     // but we already have a month - maybe we guessed wrong?
                     if ( !haveDay )
                     {
-                       // no need to check in month range as always < 12, but
+                        // 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;
                         haveDay = TRUE;
                         // the days are counted from 1 unlike the months
                         day = (wxDateTime_t)mon + 1;
                         haveDay = TRUE;
@@ -3180,7 +3179,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                         // could possible be the year (doesn't the year come
                         // before the month in the japanese format?) (FIXME)
                         break;
                         // could possible be the year (doesn't the year come
                         // before the month in the japanese format?) (FIXME)
                         break;
-                       }
+                    }
                 }
 
                 mon = mon2;
                 }
 
                 mon = mon2;
@@ -3292,7 +3291,8 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                 mon = (wxDateTime::Month)(day - 1);
 
                 // we're in the current year then
                 mon = (wxDateTime::Month)(day - 1);
 
                 // we're in the current year then
-                if ( year <= GetNumOfDaysInMonth(Inv_Year, mon) )
+                if ( (year > 0) &&
+                        (unsigned)year <= GetNumOfDaysInMonth(Inv_Year, mon) )
                 {
                     day = year;
 
                 {
                     day = year;
 
@@ -3385,8 +3385,12 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time)
         }
     }
 
         }
     }
 
-    // try all time formats we may think about starting with the standard one
-    const wxChar *result = ParseFormat(time, _T("%X"));
+    // try all time formats we may think about in the order from longest to
+    // shortest
+
+    // 12hour with AM/PM?
+    const wxChar *result = ParseFormat(time, _T("%I:%M:%S %p"));
+
     if ( !result )
     {
         // normally, it's the same, but why not try it?
     if ( !result )
     {
         // normally, it's the same, but why not try it?
@@ -3395,8 +3399,8 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time)
 
     if ( !result )
     {
 
     if ( !result )
     {
-        // 12hour with AM/PM?
-        result = ParseFormat(time, _T("%I:%M:%S %p"));
+        // 12hour with AM/PM but without seconds?
+        result = ParseFormat(time, _T("%I:%M %p"));
     }
 
     if ( !result )
     }
 
     if ( !result )
@@ -3407,8 +3411,8 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time)
 
     if ( !result )
     {
 
     if ( !result )
     {
-        // 12hour with AM/PM but without seconds?
-        result = ParseFormat(time, _T("%I:%M %p"));
+        // just the hour and AM/PM?
+        result = ParseFormat(time, _T("%I %p"));
     }
 
     if ( !result )
     }
 
     if ( !result )
@@ -3419,8 +3423,9 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time)
 
     if ( !result )
     {
 
     if ( !result )
     {
-        // just the hour and AM/PM?
-        result = ParseFormat(time, _T("%I %p"));
+        // parse the standard format: normally it is one of the formats above
+        // but it may be set to something completely different by the user
+        result = ParseFormat(time, _T("%X"));
     }
 
     // TODO: parse timezones
     }
 
     // TODO: parse timezones
@@ -3441,6 +3446,19 @@ bool wxDateTime::IsWorkDay(Country WXUNUSED(country)) const
 // wxTimeSpan
 // ============================================================================
 
 // wxTimeSpan
 // ============================================================================
 
+// this enum is only used in wxTimeSpan::Format() below but we can't declare
+// it locally to the method as it provokes an internal compiler error in egcs
+// 2.91.60 when building with -O2
+enum TimeSpanPart
+{
+    Part_Week,
+    Part_Day,
+    Part_Hour,
+    Part_Min,
+    Part_Sec,
+    Part_MSec
+};
+
 // not all strftime(3) format specifiers make sense here because, for example,
 // a time span doesn't have a year nor a timezone
 //
 // not all strftime(3) format specifiers make sense here because, for example,
 // a time span doesn't have a year nor a timezone
 //
@@ -3478,15 +3496,7 @@ wxString wxTimeSpan::Format(const wxChar *format) const
     // should use GetMinutes() % 60, otherwise just GetMinutes() &c
 
     // we remember the most important unit found so far
     // should use GetMinutes() % 60, otherwise just GetMinutes() &c
 
     // we remember the most important unit found so far
-    enum TimeSpanPart
-    {
-        Part_Week,
-        Part_Day,
-        Part_Hour,
-        Part_Min,
-        Part_Sec,
-        Part_MSec
-    } partBiggest = Part_MSec;
+    TimeSpanPart partBiggest = Part_MSec;
 
     for ( const wxChar *pch = format; *pch; pch++ )
     {
 
     for ( const wxChar *pch = format; *pch; pch++ )
     {
@@ -3715,4 +3725,4 @@ size_t wxDateTimeWorkDays::DoGetHolidaysInRange(const wxDateTime& dtStart,
     return holidays.GetCount();
 }
 
     return holidays.GetCount();
 }
 
-
+#endif // wxUSE_DATETIME