Commit 9723e621 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

comctl32/monthcal: Simplify WM_MOUSEMOVE handler.

parent f65c2f1d
...@@ -328,8 +328,13 @@ static BOOL MONTHCAL_ValidateTime(const SYSTEMTIME *time) ...@@ -328,8 +328,13 @@ static BOOL MONTHCAL_ValidateTime(const SYSTEMTIME *time)
return TRUE; return TRUE;
} }
/* Copies timestamp part only. Milliseconds are intentionaly not copied /* Copies timestamp part only.
cause it matches required behaviour for current use of this helper */ *
* PARAMETERS
*
* [I] from : source date
* [O] to : dest date
*/
static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to)
{ {
to->wHour = from->wHour; to->wHour = from->wHour;
...@@ -337,6 +342,21 @@ static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) ...@@ -337,6 +342,21 @@ static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to)
to->wSecond = from->wSecond; 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. /* 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. Need to find out if we're on a DST place & adjust the clock accordingly.
Above function assumes we have a valid data. Above function assumes we have a valid data.
...@@ -437,8 +457,10 @@ static inline void MONTHCAL_CalcPosFromDay(const MONTHCAL_INFO *infoPtr, ...@@ -437,8 +457,10 @@ static inline void MONTHCAL_CalcPosFromDay(const MONTHCAL_INFO *infoPtr,
- set focused date to given value; - set focused date to given value;
- reset to zero value if NULL passed; - reset to zero value if NULL passed;
- invalidate previous and new day rectangle only if needed. - 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; RECT r;
...@@ -446,7 +468,7 @@ static void MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) ...@@ -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, /* there's nothing to do if it's the same date,
mouse move within same date rectangle case */ 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 */ /* invalidate old focused day */
MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->focusedSel.wDay, MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->focusedSel.wDay,
...@@ -468,6 +490,8 @@ static void MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) ...@@ -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 */ /* on set invalidates new day, on reset clears previous focused day */
InvalidateRect(infoPtr->hwndSelf, &r, FALSE); InvalidateRect(infoPtr->hwndSelf, &r, FALSE);
return TRUE;
} }
/* day is the day in the month(1 == 1st of the month) */ /* day is the day in the month(1 == 1st of the month) */
...@@ -1719,7 +1743,6 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam) ...@@ -1719,7 +1743,6 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
} }
case MCHT_TODAYLINK: case MCHT_TODAYLINK:
{ {
infoPtr->firstSel = infoPtr->todaysDate;
infoPtr->curSel = infoPtr->todaysDate; infoPtr->curSel = infoPtr->todaysDate;
infoPtr->minSel = infoPtr->todaysDate; infoPtr->minSel = infoPtr->todaysDate;
infoPtr->maxSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate;
...@@ -1733,7 +1756,7 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam) ...@@ -1733,7 +1756,7 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
case MCHT_CALENDARDATEPREV: case MCHT_CALENDARDATEPREV:
case MCHT_CALENDARDATE: case MCHT_CALENDARDATE:
{ {
infoPtr->firstSel = ht.st; MONTHCAL_CopyDate(&ht.st, &infoPtr->firstSel);
if(infoPtr->dwStyle & MCS_MULTISELECT) if(infoPtr->dwStyle & MCS_MULTISELECT)
{ {
...@@ -1882,48 +1905,38 @@ MONTHCAL_MouseMove(MONTHCAL_INFO *infoPtr, LPARAM lParam) ...@@ -1882,48 +1905,38 @@ MONTHCAL_MouseMove(MONTHCAL_INFO *infoPtr, LPARAM lParam)
st_ht = ht.st; st_ht = ht.st;
old_focused = infoPtr->focusedSel; 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); MONTHCAL_CalcPosFromDay(infoPtr, ht.st.wDay, ht.st.wMonth, &r);
if(infoPtr->dwStyle & MCS_MULTISELECT) { if(infoPtr->dwStyle & MCS_MULTISELECT) {
SYSTEMTIME st[2]; SYSTEMTIME st[2];
int i;
LONG cmp;
MONTHCAL_GetSelRange(infoPtr, st); 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 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 range isn't empty we should change range to a single firstSel */
if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st_ht) && if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st_ht) &&
MONTHCAL_IsDateEqual(&st[0], &st[1])) goto done; MONTHCAL_IsDateEqual(&st[0], &st[1])) goto done;
/* new selected date is earlier */
if(cmp == -1) i = 0;
}
MONTHCAL_IsSelRangeValid(infoPtr, &st_ht, &infoPtr->firstSel, &st_ht); MONTHCAL_IsSelRangeValid(infoPtr, &st_ht, &infoPtr->firstSel, &st_ht);
if(!MONTHCAL_IsDateEqual(&st[i], &st_ht)) { st[0] = infoPtr->firstSel;
st[i] = st_ht; /* 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 */ /* bounds will be swapped here if needed */
MONTHCAL_SetSelRange(infoPtr, st); MONTHCAL_SetSelRange(infoPtr, st);
}
return 0;
} }
done: done:
/* only redraw if the currently selected day changed */ /* FIXME: this should specify a rectangle containing only the days that changed
/* FIXME: this should specify a rectangle containing only the days that changed */ using InvalidateRect */
/* using InvalidateRect */
if(!MONTHCAL_IsDateEqual(&old_focused, &infoPtr->focusedSel))
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment