comctl32/monthcal: Fix some bugs with date range.

This commit is contained in:
Nikolay Sivov 2009-09-26 03:09:06 +04:00 committed by Alexandre Julliard
parent d66dcb4ff8
commit a44f03518e
2 changed files with 84 additions and 11 deletions

View File

@ -36,9 +36,6 @@
* -- handle resources better (doesn't work now); * -- handle resources better (doesn't work now);
* -- take care of internationalization. * -- take care of internationalization.
* -- keyboard handling. * -- 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 * -- search for FIXME
*/ */
@ -931,11 +928,11 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
/* Only one limit set - we are done */ /* Only one limit set - we are done */
if ((infoPtr->rangeValid & (GDTR_MIN | GDTR_MAX)) != (GDTR_MIN | GDTR_MAX)) if ((infoPtr->rangeValid & (GDTR_MIN | GDTR_MAX)) != (GDTR_MIN | GDTR_MAX))
return TRUE; return TRUE;
SystemTimeToFileTime(&infoPtr->maxDate, &ft_max); SystemTimeToFileTime(&infoPtr->maxDate, &ft_max);
SystemTimeToFileTime(&infoPtr->minDate, &ft_min); 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)) if ((limits & (GDTR_MIN | GDTR_MAX)) == (GDTR_MIN | GDTR_MAX))
{ {
@ -946,8 +943,11 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
} }
else else
{ {
/* Reset the other limit. */ static const SYSTEMTIME zero;
/* FIXME: native sets date&time to 0. Should we do this too? */
/* 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 ; infoPtr->rangeValid &= limits & GDTR_MIN ? ~GDTR_MAX : ~GDTR_MIN ;
} }
} }
@ -1873,10 +1873,6 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
MONTHCAL_SetFirstDayOfWeek(infoPtr, -1); MONTHCAL_SetFirstDayOfWeek(infoPtr, -1);
infoPtr->currentMonth = infoPtr->todaysDate.wMonth; infoPtr->currentMonth = infoPtr->todaysDate.wMonth;
infoPtr->currentYear = infoPtr->todaysDate.wYear; 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->maxSelCount = 7;
infoPtr->monthRange = 3; infoPtr->monthRange = 3;
infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));

View File

@ -328,6 +328,29 @@ static void test_monthcal(void)
hwnd = CreateWindowA(MONTHCAL_CLASSA, "MonthCal", WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, hwnd = CreateWindowA(MONTHCAL_CLASSA, "MonthCal", WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,
0, 300, 300, 0, 0, NULL, NULL); 0, 300, 300, 0, 0, NULL, NULL);
ok(hwnd != NULL, "Failed to create MonthCal\n"); 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]); GetSystemTime(&st[0]);
st[1] = 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_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"); 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); DestroyWindow(hwnd);
} }