Module: wine Branch: master Commit: 9723e6213da3129e55fe500ddac1497c813de03f URL: http://source.winehq.org/git/wine.git/?a=commit;h=9723e6213da3129e55fe500dda...
Author: Nikolay Sivov bunglehead@gmail.com Date: Mon Oct 5 20:32:15 2009 +0400
comctl32/monthcal: Simplify WM_MOUSEMOVE handler.
---
dlls/comctl32/monthcal.c | 81 ++++++++++++++++++++++++++------------------- 1 files changed, 47 insertions(+), 34 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index cccdaf3..43df19c 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -328,8 +328,13 @@ static BOOL MONTHCAL_ValidateTime(const SYSTEMTIME *time) return TRUE; }
-/* Copies timestamp part only. Milliseconds are intentionaly not copied - cause it matches required behaviour for current use of this helper */ +/* Copies timestamp part only. + * + * PARAMETERS + * + * [I] from : source date + * [O] to : dest date + */ static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) { to->wHour = from->wHour; @@ -337,6 +342,21 @@ static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) to->wSecond = from->wSecond; }
+/* Copies date part only. + * + * PARAMETERS + * + * [I] from : source date + * [O] to : dest date + */ +static void MONTHCAL_CopyDate(const SYSTEMTIME *from, SYSTEMTIME *to) +{ + to->wYear = from->wYear; + to->wMonth = from->wMonth; + to->wDay = from->wDay; + to->wDayOfWeek = from->wDayOfWeek; +} + /* Note:Depending on DST, this may be offset by a day. Need to find out if we're on a DST place & adjust the clock accordingly. Above function assumes we have a valid data. @@ -437,8 +457,10 @@ static inline void MONTHCAL_CalcPosFromDay(const MONTHCAL_INFO *infoPtr, - set focused date to given value; - reset to zero value if NULL passed; - invalidate previous and new day rectangle only if needed. + + Returns TRUE if focused day changed, FALSE otherwise. */ -static void MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) +static BOOL MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) { RECT r;
@@ -446,7 +468,7 @@ static void MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) { /* there's nothing to do if it's the same date, mouse move within same date rectangle case */ - if(MONTHCAL_IsDateEqual(&infoPtr->focusedSel, st)) return; + if(MONTHCAL_IsDateEqual(&infoPtr->focusedSel, st)) return FALSE;
/* invalidate old focused day */ MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->focusedSel.wDay, @@ -468,6 +490,8 @@ static void MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st)
/* on set invalidates new day, on reset clears previous focused day */ InvalidateRect(infoPtr->hwndSelf, &r, FALSE); + + return TRUE; }
/* day is the day in the month(1 == 1st of the month) */ @@ -1719,7 +1743,6 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam) } case MCHT_TODAYLINK: { - infoPtr->firstSel = infoPtr->todaysDate; infoPtr->curSel = infoPtr->todaysDate; infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; @@ -1733,7 +1756,7 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam) case MCHT_CALENDARDATEPREV: case MCHT_CALENDARDATE: { - infoPtr->firstSel = ht.st; + MONTHCAL_CopyDate(&ht.st, &infoPtr->firstSel);
if(infoPtr->dwStyle & MCS_MULTISELECT) { @@ -1882,49 +1905,39 @@ MONTHCAL_MouseMove(MONTHCAL_INFO *infoPtr, LPARAM lParam)
st_ht = ht.st; old_focused = infoPtr->focusedSel; - MONTHCAL_SetDayFocus(infoPtr, &ht.st); + + /* if pointer is over focused day still there's nothing to do */ + if(!MONTHCAL_SetDayFocus(infoPtr, &ht.st)) return 0;
MONTHCAL_CalcPosFromDay(infoPtr, ht.st.wDay, ht.st.wMonth, &r);
- if(infoPtr->dwStyle & MCS_MULTISELECT) { + if(infoPtr->dwStyle & MCS_MULTISELECT) { SYSTEMTIME st[2]; - int i; - LONG cmp;
MONTHCAL_GetSelRange(infoPtr, st); - i = MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st[0]) ? 1 : 0;
- cmp = MONTHCAL_CompareSystemTime(&st_ht, &infoPtr->firstSel); - - if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st[1])) { - /* If we're still at the first selected date and range is empty, return. - If range isn't empty we should change range to a single firstSel */ - if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st_ht) && - MONTHCAL_IsDateEqual(&st[0], &st[1])) goto done; - - /* new selected date is earlier */ - if(cmp == -1) i = 0; - } + /* If we're still at the first selected date and range is empty, return. + If range isn't empty we should change range to a single firstSel */ + if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st_ht) && + MONTHCAL_IsDateEqual(&st[0], &st[1])) goto done;
MONTHCAL_IsSelRangeValid(infoPtr, &st_ht, &infoPtr->firstSel, &st_ht);
- if(!MONTHCAL_IsDateEqual(&st[i], &st_ht)) { - st[i] = st_ht; + st[0] = infoPtr->firstSel; + /* we should overwrite timestamp here */ + MONTHCAL_CopyDate(&st_ht, &st[1]);
- MONTHCAL_CopyTime(&infoPtr->todaysDate, &st[0]); - MONTHCAL_CopyTime(&infoPtr->todaysDate, &st[1]); - /* bounds will be swapped here if needed */ - MONTHCAL_SetSelRange(infoPtr, st); - } + /* bounds will be swapped here if needed */ + MONTHCAL_SetSelRange(infoPtr, st); + + return 0; }
done:
- /* only redraw if the currently selected day changed */ - /* FIXME: this should specify a rectangle containing only the days that changed */ - /* using InvalidateRect */ - if(!MONTHCAL_IsDateEqual(&old_focused, &infoPtr->focusedSel)) - InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); + /* FIXME: this should specify a rectangle containing only the days that changed + using InvalidateRect */ + InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0; }