]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix bug with out of range date in wxMSW wxDatePickerCtrl under XP too.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 22 Jun 2011 22:58:11 +0000 (22:58 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 22 Jun 2011 22:58:11 +0000 (22:58 +0000)
The bug fix of r67990 relied on DateTime_SetSystemtime() returning FALSE if
setting the date failed but, unfortunately, this function doesn't behave
correctly under XP (and presumably earlier systems) and returns TRUE even if
it didn't actually change the date because it was out of range.

Implement an alternative solution not relying on this function return value
but simply checking the range ourselves.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68027 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/datectrl.cpp

index 2bf4df09b2af463fc45a47fbd0cdb0393e1b5fc5..c544e322511acb93dd7535b7f235906a190efd23 100644 (file)
@@ -188,22 +188,39 @@ void wxDatePickerCtrl::SetValue(const wxDateTime& dt)
 
     SYSTEMTIME st;
     if ( dt.IsValid() )
-        dt.GetAsMSWSysTime(&st);
-    if ( !DateTime_SetSystemtime(GetHwnd(),
-                                 dt.IsValid() ? GDT_VALID : GDT_NONE,
-                                 &st) )
     {
-        // Attempts to set the date outside of the valid range should fail so
-        // there is nothing unexpected if they do but still log a message if we
-        // failed for some other reason.
+        // Don't try setting the date if it's out of range: calendar control
+        // under XP (and presumably all the other pre-Vista Windows versions)
+        // doesn't return false from DateTime_SetSystemtime() in this case but
+        // doesn't actually change the date, so we can't update our m_date
+        // unconditionally and would need to check whether it was changed
+        // before doing it. It looks simpler to just check whether it's in
+        // range here instead.
+        //
+        // If we ever drop support for XP we could rely on the return value of
+        // DateTime_SetSystemtime() but this probably won't happen in near
+        // future.
         wxDateTime dtStart, dtEnd;
         GetRange(&dtStart, &dtEnd);
-        if ( (!dtStart.IsValid() || dt >= dtStart) &&
-                (!dtEnd.IsValid() || dt <= dtEnd) )
+        if ( (dtStart.IsValid() && dt < dtStart) ||
+                (dtEnd.IsValid() && dt > dtEnd) )
         {
-            wxLogDebug(wxT("DateTime_SetSystemtime() unexpectedly failed"));
+            // Fail silently, some existing code relies on SetValue() with an
+            // out of range value simply doing nothing -- so don't.
+            return;
         }
 
+        dt.GetAsMSWSysTime(&st);
+    }
+
+    if ( !DateTime_SetSystemtime(GetHwnd(),
+                                 dt.IsValid() ? GDT_VALID : GDT_NONE,
+                                 &st) )
+    {
+        // The only expected failure is when the date is out of range but we
+        // already checked for this above.
+        wxFAIL_MSG( wxT("Setting the calendar date unexpectedly failed.") );
+
         // In any case, skip updating m_date below.
         return;
     }