]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
Fixed bug [ 754596 ] wxUSE_CONSTRAINTS 0 breaks AutoLayout() with sizers
[wxWidgets.git] / src / common / datetime.cpp
index 45e40a662478bc0679f02fb23b448d44c4baa143..2ff057c54a4b3a0f8f9e16a158c53e68053beb88 100644 (file)
@@ -94,7 +94,7 @@ template<> void wxStringWriteValue(wxString &s , const wxDateTime &data )
     s = data.Format(wxT("%Y-%m-%d %H:%M:%S")) ;
 }
 
-WX_CUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringConverter<wxDateTime>)
+wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringConverter<wxDateTime>)
 
 #endif
 
@@ -3217,11 +3217,48 @@ const wxChar *wxDateTime::ParseDateTime(const wxChar *date)
 {
     wxCHECK_MSG( date, (wxChar *)NULL, _T("NULL pointer in wxDateTime::Parse") );
 
-    // there is a public domain version of getdate.y, but it only works for
-    // English...
-    wxFAIL_MSG(_T("TODO"));
+    // Set to current day and hour, so strings like '14:00' becomes today at
+    // 14, not some other random date
+    wxDateTime dtDate = wxDateTime::Today();
+    wxDateTime dtTime = wxDateTime::Today();
 
-    return (wxChar *)NULL;
+    const wxChar* pchTime;
+
+    // Try to parse the beginning of the string as a date
+    const wxChar* pchDate = dtDate.ParseDate(date);
+
+    // We got a date in the beginning, see if there is a time specified after the date
+    if ( pchDate )
+    {
+        // Skip spaces, as the ParseTime() function fails on spaces
+        while ( wxIsspace(*pchDate) )
+            pchDate++;
+
+        pchTime = dtTime.ParseTime(pchDate);
+    }
+    else // no date in the beginning
+    {
+        // check and see if we have a time followed by a date
+        pchTime = dtTime.ParseTime(date);
+        if ( pchTime )
+        {
+            while ( wxIsspace(*pchTime) )
+                pchTime++;
+
+            pchDate = dtDate.ParseDate(pchTime);
+        }
+    }
+
+    // If we have a date specified, set our own data to the same date
+    if ( !pchDate || !pchTime )
+        return NULL;
+
+    Set(dtDate.GetDay(), dtDate.GetMonth(), dtDate.GetYear(),
+        dtTime.GetHour(), dtTime.GetMinute(), dtTime.GetSecond(),
+        dtTime.GetMillisecond());
+
+    // Return endpoint of scan
+    return pchDate > pchTime ? pchDate : pchTime;
 }
 
 const wxChar *wxDateTime::ParseDate(const wxChar *date)
@@ -3312,18 +3349,27 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
             }
             else // not the month
             {
-                wxDateTime_t maxDays = haveMon
-                    ? GetNumOfDaysInMonth(haveYear ? year : Inv_Year, mon)
-                    : 31;
-
-                // can it be day?
-                if ( (val == 0) || (val > (unsigned long)maxDays) )  // cast to shut up compiler warning in BCC
+                if ( haveDay )
                 {
+                    // this can only be the year
                     isYear = TRUE;
                 }
-                else
+                else // may be either day or year
                 {
-                    isDay = TRUE;
+                    wxDateTime_t maxDays = haveMon
+                        ? GetNumOfDaysInMonth(haveYear ? year : Inv_Year, mon)
+                        : 31;
+
+                    // can it be day?
+                    if ( (val == 0) || (val > (unsigned long)maxDays) )
+                    {
+                        // no
+                        isYear = TRUE;
+                    }
+                    else // yes, suppose it's the day
+                    {
+                        isDay = TRUE;
+                    }
                 }
             }