[PATCH] comctl32/monthcal: Implement MCS_NOSELCHANGEONNAV style

Nikolay Sivov nsivov at codeweavers.com
Mon Jul 25 16:13:45 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/comctl32/monthcal.c | 18 ++++++++++++------
 include/commctrl.rh      |  1 +
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 36acb41..0fef638 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -1969,7 +1969,7 @@ static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
 }
 
 /* no valid range check performed */
-static void MONTHCAL_Scroll(MONTHCAL_INFO *infoPtr, INT delta)
+static void MONTHCAL_Scroll(MONTHCAL_INFO *infoPtr, INT delta, BOOL keep_selection)
 {
   INT i, selIdx = -1;
 
@@ -1982,8 +1982,11 @@ static void MONTHCAL_Scroll(MONTHCAL_INFO *infoPtr, INT delta)
     MONTHCAL_GetMonth(&infoPtr->calendars[i].month, delta);
   }
 
+  if (keep_selection)
+    return;
+
   /* selection is always shifted to first calendar */
-  if(infoPtr->dwStyle & MCS_MULTISELECT)
+  if (infoPtr->dwStyle & MCS_MULTISELECT)
   {
     SYSTEMTIME range[2];
 
@@ -2004,6 +2007,7 @@ static void MONTHCAL_Scroll(MONTHCAL_INFO *infoPtr, INT delta)
 static void MONTHCAL_GoToMonth(MONTHCAL_INFO *infoPtr, enum nav_direction direction)
 {
   INT delta = infoPtr->delta ? infoPtr->delta : MONTHCAL_GetCalCount(infoPtr);
+  BOOL keep_selection;
   SYSTEMTIME st;
 
   TRACE("%s\n", direction == DIRECTION_BACKWARD ? "back" : "fwd");
@@ -2022,9 +2026,11 @@ static void MONTHCAL_GoToMonth(MONTHCAL_INFO *infoPtr, enum nav_direction direct
 
   if(!MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) return;
 
-  MONTHCAL_Scroll(infoPtr, direction == DIRECTION_BACKWARD ? -delta : delta);
+  keep_selection = infoPtr->dwStyle & MCS_NOSELCHANGEONNAV;
+  MONTHCAL_Scroll(infoPtr, direction == DIRECTION_BACKWARD ? -delta : delta, keep_selection);
   MONTHCAL_NotifyDayState(infoPtr);
-  MONTHCAL_NotifySelectionChange(infoPtr);
+  if (!keep_selection)
+    MONTHCAL_NotifySelectionChange(infoPtr);
 }
 
 static LRESULT
@@ -2212,7 +2218,7 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
 
         if (MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE))
         {
-            MONTHCAL_Scroll(infoPtr, delta);
+            MONTHCAL_Scroll(infoPtr, delta, FALSE);
             MONTHCAL_NotifyDayState(infoPtr);
             MONTHCAL_NotifySelectionChange(infoPtr);
             InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
@@ -2851,7 +2857,7 @@ MONTHCAL_Notify(MONTHCAL_INFO *infoPtr, NMHDR *hdr)
     if (hdr->hwndFrom == infoPtr->hWndYearUpDown && nmud->iDelta)
     {
       /* year value limits are set up explicitly after updown creation */
-      MONTHCAL_Scroll(infoPtr, 12 * nmud->iDelta);
+      MONTHCAL_Scroll(infoPtr, 12 * nmud->iDelta, FALSE);
       MONTHCAL_NotifyDayState(infoPtr);
       MONTHCAL_NotifySelectionChange(infoPtr);
     }
diff --git a/include/commctrl.rh b/include/commctrl.rh
index b778ee7..aac1746 100644
--- a/include/commctrl.rh
+++ b/include/commctrl.rh
@@ -187,6 +187,7 @@
 #define MCS_NOTODAYCIRCLE   0x0008
 #define MCS_NOTRAILINGDATES 0x0040
 #define MCS_SHORTDAYSOFWEEK 0x0080
+#define MCS_NOSELCHANGEONNAV 0x0100
 
 /* Datetime Control */
 #define DTS_SHORTDATEFORMAT 0x0000
-- 
2.8.1




More information about the wine-patches mailing list