Nikolay Sivov : comctl32/monthcal: Fix some bugs with date range.

Alexandre Julliard julliard at winehq.org
Mon Sep 28 11:54:37 CDT 2009


Module: wine
Branch: master
Commit: a44f03518e9daa04eabcbf4f965204d6171aae4f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a44f03518e9daa04eabcbf4f965204d6171aae4f

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Sat Sep 26 03:09:06 2009 +0400

comctl32/monthcal: Fix some bugs with date range.

---

 dlls/comctl32/monthcal.c       |   18 ++++------
 dlls/comctl32/tests/monthcal.c |   77 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 11 deletions(-)

diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 0d4c96b..77e58b7 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -36,9 +36,6 @@
  *    -- handle resources better (doesn't work now); 
  *    -- take care of internationalization.
  *    -- keyboard handling.
- *    -- GetRange: At the moment, we copy ranges anyway, regardless of
- *                 infoPtr->rangeValid; an invalid range is simply filled 
- *                 with zeros in SetRange.  Is this the right behavior?
  *    -- search for FIXME
  */
 
@@ -931,11 +928,11 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
     /* Only one limit set - we are done */
     if ((infoPtr->rangeValid & (GDTR_MIN | GDTR_MAX)) != (GDTR_MIN | GDTR_MAX))
         return TRUE;
-    
+
     SystemTimeToFileTime(&infoPtr->maxDate, &ft_max);
     SystemTimeToFileTime(&infoPtr->minDate, &ft_min);
 
-    if (CompareFileTime(&ft_min, &ft_max) > 0)
+    if (CompareFileTime(&ft_min, &ft_max) >= 0)
     {
         if ((limits & (GDTR_MIN | GDTR_MAX)) == (GDTR_MIN | GDTR_MAX))
         {
@@ -946,8 +943,11 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
         }
         else
         {
-            /* Reset the other limit. */
-            /* FIXME: native sets date&time to 0. Should we do this too? */
+            static const SYSTEMTIME zero;
+
+            /* reset the other limit */
+            if (limits & GDTR_MIN) infoPtr->maxDate = zero;
+            if (limits & GDTR_MAX) infoPtr->minDate = zero;
             infoPtr->rangeValid &= limits & GDTR_MIN ? ~GDTR_MAX : ~GDTR_MIN ;
         }
     }
@@ -1873,10 +1873,6 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
   MONTHCAL_SetFirstDayOfWeek(infoPtr, -1);
   infoPtr->currentMonth = infoPtr->todaysDate.wMonth;
   infoPtr->currentYear  = infoPtr->todaysDate.wYear;
-  infoPtr->minDate = infoPtr->todaysDate;
-  infoPtr->maxDate = infoPtr->todaysDate;
-  infoPtr->maxDate.wYear = 2050;
-  infoPtr->minDate.wYear = 1950;
   infoPtr->maxSelCount   = 7;
   infoPtr->monthRange    = 3;
   infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));
diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c
index 8cd3494..e5282ff 100644
--- a/dlls/comctl32/tests/monthcal.c
+++ b/dlls/comctl32/tests/monthcal.c
@@ -328,6 +328,29 @@ static void test_monthcal(void)
     hwnd = CreateWindowA(MONTHCAL_CLASSA, "MonthCal", WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,
                          0, 300, 300, 0, 0, NULL, NULL);
     ok(hwnd != NULL, "Failed to create MonthCal\n");
+
+    /* test range just after creation */
+    memset(&st, 0xcc, sizeof(st));
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st) == 0, "No limits should be set\n");
+
+    expect(0, st[0].wYear);
+    expect(0, st[0].wMonth);
+    expect(0, st[0].wDay);
+    expect(0, st[0].wDayOfWeek);
+    expect(0, st[0].wHour);
+    expect(0, st[0].wMinute);
+    expect(0, st[0].wSecond);
+    expect(0, st[0].wMilliseconds);
+
+    expect(0, st[1].wYear);
+    expect(0, st[1].wMonth);
+    expect(0, st[1].wDay);
+    expect(0, st[1].wDayOfWeek);
+    expect(0, st[1].wHour);
+    expect(0, st[1].wMinute);
+    expect(0, st[1].wSecond);
+    expect(0, st[1].wMilliseconds);
+
     GetSystemTime(&st[0]);
     st[1] = st[0];
 
@@ -380,6 +403,60 @@ static void test_monthcal(void)
     ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MAX, (LPARAM)st), "Failed to set max limit\n");
     ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MAX, "Only MAX limit should be set\n");
 
+    /* set both limits, then set max < min */
+    GetSystemTime(&st[0]);
+    st[1] = st[0];
+    st[1].wYear++;
+    ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MIN|GDTR_MAX, (LPARAM)st), "Failed to set limits\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == (GDTR_MIN|GDTR_MAX), "Min limit expected\n");
+    st[1].wYear -= 2;
+    ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MAX, (LPARAM)st), "Failed to set limits\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MAX, "Max limit expected\n");
+
+    expect(0, st1[0].wYear);
+    expect(0, st1[0].wMonth);
+    expect(0, st1[0].wDay);
+    expect(0, st1[0].wDayOfWeek);
+    expect(0, st1[0].wHour);
+    expect(0, st1[0].wMinute);
+    expect(0, st1[0].wSecond);
+    expect(0, st1[0].wMilliseconds);
+
+    expect(st[1].wYear,      st1[1].wYear);
+    expect(st[1].wMonth,     st1[1].wMonth);
+    expect(st[1].wDay,       st1[1].wDay);
+    expect(st[1].wDayOfWeek, st1[1].wDayOfWeek);
+    expect(st[1].wHour,      st1[1].wHour);
+    expect(st[1].wMinute,    st1[1].wMinute);
+    expect(st[1].wSecond,    st1[1].wSecond);
+    expect(st[1].wMilliseconds, st1[1].wMilliseconds);
+
+    st[1] = st[0];
+    st[1].wYear++;
+    ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MIN|GDTR_MAX, (LPARAM)st), "Failed to set limits\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == (GDTR_MIN|GDTR_MAX), "Min limit expected\n");
+    st[0].wYear++; /* start == end now */
+    ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MIN, (LPARAM)st), "Failed to set limits\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MIN, "Min limit expected\n");
+
+    expect(st[0].wYear,      st1[0].wYear);
+    expect(st[0].wMonth,     st1[0].wMonth);
+    expect(st[0].wDay,       st1[0].wDay);
+    expect(st[0].wDayOfWeek, st1[0].wDayOfWeek);
+    expect(st[0].wHour,      st1[0].wHour);
+    expect(st[0].wMinute,    st1[0].wMinute);
+    expect(st[0].wSecond,    st1[0].wSecond);
+    expect(st[0].wMilliseconds, st1[0].wMilliseconds);
+
+    expect(0, st1[1].wYear);
+    expect(0, st1[1].wMonth);
+    expect(0, st1[1].wDay);
+    expect(0, st1[1].wDayOfWeek);
+    expect(0, st1[1].wHour);
+    expect(0, st1[1].wMinute);
+    expect(0, st1[1].wSecond);
+    expect(0, st1[1].wMilliseconds);
+
     DestroyWindow(hwnd);
 }
 




More information about the wine-cvs mailing list