Module: wine Branch: master Commit: 211a55b8777ee5f91976d75d4813e1ec0014c365 URL: http://source.winehq.org/git/wine.git/?a=commit;h=211a55b8777ee5f91976d75d48...
Author: Nikolay Sivov bunglehead@gmail.com Date: Sat Sep 26 17:15:17 2009 +0400
comctl32/monthcal: Prevent configured range exceeding with prev/next buttons.
---
dlls/comctl32/monthcal.c | 52 ++++++++++++++++++++++++++++++++++++--------- 1 files changed, 41 insertions(+), 11 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index cee1f9e..3aa0693 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -1248,28 +1248,58 @@ static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr) { + SYSTEMTIME next = infoPtr->curSel; + TRACE("\n");
- infoPtr->curSel.wMonth++; - if(infoPtr->curSel.wMonth > 12) { - infoPtr->curSel.wYear++; - infoPtr->curSel.wMonth = 1; + next.wMonth++; + if(next.wMonth > 12) { + next.wYear++; + 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; }
+ infoPtr->curSel = next; + MONTHCAL_NotifyDayState(infoPtr); }
static void MONTHCAL_GoToPrevMonth(MONTHCAL_INFO *infoPtr) { + SYSTEMTIME prev = infoPtr->curSel; + TRACE("\n");
- infoPtr->curSel.wMonth--; - if(infoPtr->curSel.wMonth < 1) { - infoPtr->curSel.wYear--; - infoPtr->curSel.wMonth = 12; + prev.wMonth--; + if(prev.wMonth < 1) { + prev.wYear--; + 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; + } + + infoPtr->curSel = prev; + MONTHCAL_NotifyDayState(infoPtr); }
@@ -1495,7 +1525,7 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
infoPtr->status = MC_SEL_LBUTUP;
- if(hit ==MCHT_CALENDARDATENEXT) { + if(hit == MCHT_CALENDARDATENEXT) { MONTHCAL_GoToNextMonth(infoPtr); InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); return TRUE; @@ -1858,8 +1888,7 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs) GetLocalTime(&infoPtr->todaysDate); infoPtr->firstDayHighWord = FALSE; MONTHCAL_SetFirstDayOfWeek(infoPtr, -1); - infoPtr->curSel.wMonth = infoPtr->todaysDate.wMonth; - infoPtr->curSel.wYear = infoPtr->todaysDate.wYear; + infoPtr->maxSelCount = 7; infoPtr->monthRange = 3; infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); @@ -1872,6 +1901,7 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; + infoPtr->curSel = infoPtr->todaysDate;
/* call MONTHCAL_UpdateSize to set all of the dimensions */ /* of the control */