[PATCH 11/15] Prevent configured range exceeding with prev/next buttons

Nikolay Sivov bunglehead at gmail.com
Sat Sep 26 08:15:17 CDT 2009


---
 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 daea03c..270e72b 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 */
-- 
1.5.6.5


--=-QiNEuHWJJ8lRqF4W8G+L--




More information about the wine-patches mailing list