Nikolay Sivov : comctl32/monthcal: Check date limits on prev/ next month buttons and year UpDown control.
Alexandre Julliard
julliard at winehq.org
Tue Oct 6 10:35:48 CDT 2009
Module: wine
Branch: master
Commit: 42733f980b3652730364fed94b891d8529ff3255
URL: http://source.winehq.org/git/wine.git/?a=commit;h=42733f980b3652730364fed94b891d8529ff3255
Author: Nikolay Sivov <bunglehead at gmail.com>
Date: Mon Oct 5 22:37:04 2009 +0400
comctl32/monthcal: Check date limits on prev/next month buttons and year UpDown control.
---
dlls/comctl32/monthcal.c | 44 +++++++++++++-------------------------------
1 files changed, 13 insertions(+), 31 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index a7fb406..ad54074 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -132,6 +132,10 @@ static const WCHAR themeClass[] = { 'S','c','r','o','l','l','b','a','r',0 };
/* empty SYSTEMTIME const */
static const SYSTEMTIME st_null;
+/* valid date limits */
+static const SYSTEMTIME max_allowed_date = { .wYear = 9999, .wMonth = 12, .wDay = 31 };
+static const SYSTEMTIME min_allowed_date = { .wYear = 1752, .wMonth = 9, .wDay = 14 };
+
#define MONTHCAL_GetInfoPtr(hwnd) ((MONTHCAL_INFO *)GetWindowLongPtrW(hwnd, 0))
@@ -244,11 +248,8 @@ static LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME
*/
static BOOL MONTHCAL_IsDateInValidRange(const MONTHCAL_INFO *infoPtr, const SYSTEMTIME *date)
{
- static const SYSTEMTIME max_date = { .wYear = 9999, .wMonth = 12, .wDay = 31 };
- static const SYSTEMTIME min_date = { .wYear = 1752, .wMonth = 9, .wDay = 14 };
-
- if((MONTHCAL_CompareSystemTime(date, &max_date) == 1) ||
- (MONTHCAL_CompareSystemTime(date, &min_date) == -1)) return FALSE;
+ if((MONTHCAL_CompareSystemTime(date, &max_allowed_date) == 1) ||
+ (MONTHCAL_CompareSystemTime(date, &min_allowed_date) == -1)) return FALSE;
if(infoPtr->rangeValid & GDTR_MAX) {
if((MONTHCAL_CompareSystemTime(date, &infoPtr->maxSel) == 1)) return FALSE;
@@ -1194,12 +1195,10 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
}
else
{
- 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 ;
+ if (limits & GDTR_MIN) infoPtr->maxDate = st_null;
+ if (limits & GDTR_MAX) infoPtr->minDate = st_null;
+ infoPtr->rangeValid &= limits & GDTR_MIN ? ~GDTR_MAX : ~GDTR_MIN;
}
}
@@ -1554,16 +1553,7 @@ static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr)
next.wMonth = 1;
}
- /* prevent max range exceeding */
- if(infoPtr->rangeValid & GDTR_MAX)
- {
- FILETIME ft_next, ft_max;
-
- SystemTimeToFileTime(&infoPtr->maxDate, &ft_max);
- SystemTimeToFileTime(&next, &ft_next);
-
- if (CompareFileTime(&ft_next, &ft_max) > 0) return;
- }
+ if(!MONTHCAL_IsDateInValidRange(infoPtr, &next)) return;
infoPtr->curSel = next;
@@ -1583,16 +1573,7 @@ static void MONTHCAL_GoToPrevMonth(MONTHCAL_INFO *infoPtr)
prev.wMonth = 12;
}
- /* prevent min range exceeding */
- if(infoPtr->rangeValid & GDTR_MIN)
- {
- FILETIME ft_prev, ft_min;
-
- SystemTimeToFileTime(&infoPtr->minDate, &ft_min);
- SystemTimeToFileTime(&prev, &ft_prev);
-
- if (CompareFileTime(&ft_prev, &ft_min) < 0) return;
- }
+ if(!MONTHCAL_IsDateInValidRange(infoPtr, &prev)) return;
infoPtr->curSel = prev;
@@ -1651,7 +1632,8 @@ static void MONTHCAL_EditYear(MONTHCAL_INFO *infoPtr)
NULL, NULL, NULL);
/* attach edit box */
- SendMessageW(infoPtr->hWndYearUpDown, UDM_SETRANGE, 0, MAKELONG(9999, 1753));
+ SendMessageW(infoPtr->hWndYearUpDown, UDM_SETRANGE, 0,
+ MAKELONG(max_allowed_date.wYear, min_allowed_date.wYear));
SendMessageW(infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM)infoPtr->hWndYearEdit, 0);
SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, infoPtr->curSel.wYear);
}
More information about the wine-cvs
mailing list