Nikolay Sivov : comctl32/monthcal: Fix hittesting in blank areas of multiple calendars case.

Alexandre Julliard julliard at winehq.org
Mon Sep 19 13:48:42 CDT 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Sep 18 22:32:16 2011 +0400

comctl32/monthcal: Fix hittesting in blank areas of multiple calendars case.

---

 dlls/comctl32/monthcal.c |   45 ++++++++++++++++++++++++++-------------------
 1 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 5a6f326..cb007d7 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -1679,7 +1679,7 @@ static LRESULT
 MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
 {
   MCHITTESTINFO htinfo;
-  SYSTEMTIME ht_month;
+  SYSTEMTIME *ht_month;
   INT day, calIdx;
 
   if(!lpht || lpht->cbSize < MCHITTESTINFO_V1_SIZE) return -1;
@@ -1718,8 +1718,6 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
     return fill_hittest_info(&htinfo, lpht);
   }
 
-  ht_month = infoPtr->calendars[calIdx].month;
-
   /* are we in the header? */
   if (PtInRect(&infoPtr->calendars[calIdx].title, lpht->pt)) {
     /* FIXME: buttons hittesting could be optimized cause maximum
@@ -1756,57 +1754,66 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
     return fill_hittest_info(&htinfo, lpht);
   }
 
-  /* days area (including week days and week numbers */
+  ht_month = &infoPtr->calendars[calIdx].month;
+  /* days area (including week days and week numbers) */
   day = MONTHCAL_GetDayFromPos(infoPtr, lpht->pt, calIdx);
   if (PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt))
   {
     htinfo.uHit = MCHT_CALENDARDAY;
     htinfo.iOffset = calIdx;
-    htinfo.st.wYear  = ht_month.wYear;
-    htinfo.st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth;
+    htinfo.st.wYear  = ht_month->wYear;
+    htinfo.st.wMonth = (day < 1) ? ht_month->wMonth -1 : ht_month->wMonth;
     htinfo.st.wDay   = (day < 1) ?
-      MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day;
+      MONTHCAL_MonthLength(ht_month->wMonth-1, ht_month->wYear) - day : day;
 
     MONTHCAL_GetDayPos(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow, calIdx);
   }
   else if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt))
   {
     htinfo.uHit = MCHT_CALENDARWEEKNUM;
-    htinfo.st.wYear  = ht_month.wYear;
+    htinfo.st.wYear = ht_month->wYear;
     htinfo.iOffset = calIdx;
 
     if (day < 1)
     {
-      htinfo.st.wMonth = ht_month.wMonth - 1;
-      htinfo.st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day;
+      htinfo.st.wMonth = ht_month->wMonth - 1;
+      htinfo.st.wDay = MONTHCAL_MonthLength(ht_month->wMonth-1, ht_month->wYear) - day;
     }
-    else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear))
+    else if (day > MONTHCAL_MonthLength(ht_month->wMonth, ht_month->wYear))
     {
-      htinfo.st.wMonth = ht_month.wMonth + 1;
-      htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
+      htinfo.st.wMonth = ht_month->wMonth + 1;
+      htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month->wMonth, ht_month->wYear);
     }
     else
     {
-      htinfo.st.wMonth = ht_month.wMonth;
+      htinfo.st.wMonth = ht_month->wMonth;
       htinfo.st.wDay = day;
     }
   }
   else if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt))
   {
       htinfo.iOffset = calIdx;
-      htinfo.st.wYear  = ht_month.wYear;
-      htinfo.st.wMonth = ht_month.wMonth;
-      if (day < 1)
+      htinfo.st.wYear  = ht_month->wYear;
+      htinfo.st.wMonth = ht_month->wMonth;
+      /* previous month only valid for first calendar */
+      if (day < 1 && calIdx == 0)
       {
 	  htinfo.uHit = MCHT_CALENDARDATEPREV;
 	  MONTHCAL_GetPrevMonth(&htinfo.st);
 	  htinfo.st.wDay = MONTHCAL_MonthLength(htinfo.st.wMonth, htinfo.st.wYear) + day;
       }
-      else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear))
+      /* next month only valid for last calendar */
+      else if (day > MONTHCAL_MonthLength(ht_month->wMonth, ht_month->wYear) &&
+               calIdx == MONTHCAL_GetCalCount(infoPtr)-1)
       {
 	  htinfo.uHit = MCHT_CALENDARDATENEXT;
 	  MONTHCAL_GetNextMonth(&htinfo.st);
-	  htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
+	  htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month->wMonth, ht_month->wYear);
+      }
+      /* multiple calendars case - blank areas for previous/next month */
+      else if (day < 1 || day > MONTHCAL_MonthLength(ht_month->wMonth, ht_month->wYear))
+      {
+          htinfo.uHit = MCHT_CALENDARBK;
       }
       else
       {




More information about the wine-cvs mailing list