comctl32: When entering a month or year, keep the day in range.
authorVincent Povirk <vincent@codeweavers.com>
Thu, 31 Mar 2011 19:04:15 +0000 (14:04 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 31 Mar 2011 21:47:33 +0000 (23:47 +0200)
dlls/comctl32/datetime.c

index bc643ebc581183bdd9a713c7a35b27d89c05e793..fd97fdda56e06a8d543b3cdf0acbac485f60c95b 100644 (file)
@@ -770,7 +770,7 @@ static void
 DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
 {
     int fieldNum = infoPtr->select & DTHT_DATEFIELD;
-    int i, val=0;
+    int i, val=0, clamp_day=0;
     SYSTEMTIME date = infoPtr->date;
 
     if (infoPtr->select == -1 || infoPtr->nCharsEntered == 0)
@@ -785,14 +785,17 @@ DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
         case ONEDIGITYEAR:
         case TWODIGITYEAR:
             date.wYear = date.wYear - (date.wYear%100) + val;
+            clamp_day = 1;
             break;
         case INVALIDFULLYEAR:
         case FULLYEAR:
             date.wYear = val;
+            clamp_day = 1;
             break;
         case ONEDIGITMONTH:
         case TWODIGITMONTH:
             date.wMonth = val;
+            clamp_day = 1;
             break;
         case ONEDIGITDAY:
         case TWODIGITDAY:
@@ -815,6 +818,9 @@ DATETIME_ApplySelectedField (DATETIME_INFO *infoPtr)
             break;
     }
 
+    if (clamp_day && date.wDay > MONTHCAL_MonthLength(date.wMonth, date.wYear))
+        date.wDay = MONTHCAL_MonthLength(date.wMonth, date.wYear);
+
     if (DATETIME_SetSystemTime(infoPtr, GDT_VALID, &date))
         DATETIME_SendDateTimeChangeNotify (infoPtr);
 }