[PATCH 15/21] Fix selection during navigation with prev/next buttons
Nikolay Sivov
bunglehead at gmail.com
Sun Oct 11 06:33:02 CDT 2009
---
dlls/comctl32/monthcal.c | 80 ++++++++++++++++++++++-----------------------
1 files changed, 39 insertions(+), 41 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index a0ca786..4cd902b 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -1520,10 +1520,12 @@ MONTHCAL_SetSelRange(MONTHCAL_INFO *infoPtr, SYSTEMTIME *range)
infoPtr->minSel = range[1];
infoPtr->maxSel = range[0];
}
+ infoPtr->curSel = infoPtr->minSel;
/* update day of week */
MONTHCAL_CalculateDayOfWeek(&infoPtr->minSel, TRUE);
MONTHCAL_CalculateDayOfWeek(&infoPtr->maxSel, TRUE);
+ MONTHCAL_CalculateDayOfWeek(&infoPtr->curSel, TRUE);
/* redraw if bounds changed */
/* FIXME: no actual need to redraw everything */
@@ -1725,35 +1727,42 @@ static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
}
}
-static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr)
+static void MONTHCAL_GoToPrevNextMonth(MONTHCAL_INFO *infoPtr, BOOL prev)
{
- SYSTEMTIME next = infoPtr->curSel;
-
- TRACE("\n");
-
- MONTHCAL_GetNextMonth(&next);
-
- if(!MONTHCAL_IsDateInValidRange(infoPtr, &next, FALSE)) return;
-
- infoPtr->curSel = next;
+ SYSTEMTIME st = infoPtr->curSel;
- MONTHCAL_NotifyDayState(infoPtr);
-}
+ TRACE("%s\n", prev ? "prev" : "next");
+ if(prev) MONTHCAL_GetPrevMonth(&st); else MONTHCAL_GetNextMonth(&st);
-static void MONTHCAL_GoToPrevMonth(MONTHCAL_INFO *infoPtr)
-{
- SYSTEMTIME prev = infoPtr->curSel;
+ if(!MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) return;
- TRACE("\n");
+ if(infoPtr->dwStyle & MCS_MULTISELECT)
+ {
+ SYSTEMTIME range[2];
- MONTHCAL_GetPrevMonth(&prev);
+ range[0] = infoPtr->minSel;
+ range[1] = infoPtr->maxSel;
- if(!MONTHCAL_IsDateInValidRange(infoPtr, &prev, FALSE)) return;
+ if(prev)
+ {
+ MONTHCAL_GetPrevMonth(&range[0]);
+ MONTHCAL_GetPrevMonth(&range[1]);
+ }
+ else
+ {
+ MONTHCAL_GetNextMonth(&range[0]);
+ MONTHCAL_GetNextMonth(&range[1]);
+ }
- infoPtr->curSel = prev;
+ MONTHCAL_SetSelRange(infoPtr, range);
+ }
+ else
+ MONTHCAL_SetCurSel(infoPtr, &st);
MONTHCAL_NotifyDayState(infoPtr);
+
+ MONTHCAL_NotifySelectionChange(infoPtr);
}
static LRESULT
@@ -1892,14 +1901,14 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
switch(hit)
{
case MCHT_TITLEBTNNEXT:
- MONTHCAL_GoToNextMonth(infoPtr);
+ MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE);
infoPtr->status = MC_NEXTPRESSED;
SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0;
case MCHT_TITLEBTNPREV:
- MONTHCAL_GoToPrevMonth(infoPtr);
+ MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE);
infoPtr->status = MC_PREVPRESSED;
SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
@@ -1951,17 +1960,13 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
case MCHT_CALENDARDATEPREV:
case MCHT_CALENDARDATE:
{
- MONTHCAL_CopyDate(&ht.st, &infoPtr->firstSel);
-
- if(infoPtr->dwStyle & MCS_MULTISELECT)
- {
- SYSTEMTIME st[2];
+ SYSTEMTIME st[2];
- st[0] = st[1] = ht.st;
+ MONTHCAL_CopyDate(&ht.st, &infoPtr->firstSel);
- /* clear selection range */
- MONTHCAL_SetSelRange(infoPtr, st);
- }
+ st[0] = st[1] = ht.st;
+ /* clear selection range */
+ MONTHCAL_SetSelRange(infoPtr, st);
infoPtr->status = MC_SEL_LBUTDOWN;
MONTHCAL_SetDayFocus(infoPtr, &ht.st);
@@ -2016,15 +2021,8 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
{
SYSTEMTIME sel = infoPtr->curSel;
- if(!(infoPtr->dwStyle & MCS_MULTISELECT))
- {
- SYSTEMTIME st[2];
-
- st[0] = st[1] = ht.st;
- MONTHCAL_SetSelRange(infoPtr, st);
- /* will be invalidated here */
- MONTHCAL_SetCurSel(infoPtr, &st[0]);
- }
+ /* will be invalidated here */
+ MONTHCAL_SetCurSel(infoPtr, &ht.st);
/* send MCN_SELCHANGE only if new date selected */
if (!MONTHCAL_IsDateEqual(&sel, &ht.st))
@@ -2044,8 +2042,8 @@ MONTHCAL_Timer(MONTHCAL_INFO *infoPtr, WPARAM id)
switch(id) {
case MC_PREVNEXTMONTHTIMER:
- if(infoPtr->status & MC_NEXTPRESSED) MONTHCAL_GoToNextMonth(infoPtr);
- if(infoPtr->status & MC_PREVPRESSED) MONTHCAL_GoToPrevMonth(infoPtr);
+ if(infoPtr->status & MC_NEXTPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE);
+ if(infoPtr->status & MC_PREVPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
break;
case MC_TODAYUPDATETIMER:
--
1.5.6.5
--=-B4JluF2FfuY7oQaTLZ1i--
More information about the wine-patches
mailing list