Module: wine Branch: master Commit: ecf89c7e3d1e21434e73a25eadfc77bca9dbff71 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ecf89c7e3d1e21434e73a25ead...
Author: Nikolay Sivov bunglehead@gmail.com Date: Sun Oct 11 15:33:02 2009 +0400
comctl32/monthcal: Fix selection during navigation with prev/next buttons.
---
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 cdb21c6..b46bac6 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: