comctl32/monthcal: Move selection logic to LButton release handler, fix notifications order.

This commit is contained in:
Nikolay Sivov 2009-09-30 00:22:51 +04:00 committed by Alexandre Julliard
parent cc6fca015c
commit 916017d420
1 changed files with 30 additions and 40 deletions

View File

@ -1498,34 +1498,9 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
} }
case MCHT_CALENDARDATE: case MCHT_CALENDARDATE:
{ {
RECT rcDay; /* used in determining area to invalidate */
SYSTEMTIME selArray[2];
NMSELCHANGE nmsc;
selArray[0] = ht.st;
selArray[1] = ht.st;
MONTHCAL_SetSelRange(infoPtr, selArray);
MONTHCAL_SetCurSel(infoPtr, &selArray[0]);
TRACE("MCHT_CALENDARDATE\n"); TRACE("MCHT_CALENDARDATE\n");
nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmsc.nmhdr.code = MCN_SELCHANGE;
nmsc.stSelStart = infoPtr->minSel;
nmsc.stSelEnd = infoPtr->maxSel;
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
/* redraw both old and new days if the selected day changed */
if(infoPtr->curSel.wDay != ht.st.wDay) {
MONTHCAL_CalcPosFromDay(infoPtr, ht.st.wDay, ht.st.wMonth, &rcDay);
InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE);
MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->curSel.wDay, infoPtr->curSel.wMonth, &rcDay);
InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE);
}
infoPtr->firstSelDay = ht.st.wDay; infoPtr->firstSelDay = ht.st.wDay;
infoPtr->curSel.wDay = ht.st.wDay;
infoPtr->status = MC_SEL_LBUTDOWN; infoPtr->status = MC_SEL_LBUTDOWN;
return 0; return 0;
} }
@ -1557,6 +1532,14 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
redraw = TRUE; redraw = TRUE;
} }
/* always send NM_RELEASEDCAPTURE notification */
nmhdr.hwndFrom = infoPtr->hwndSelf;
nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmhdr.code = NM_RELEASEDCAPTURE;
TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify);
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
ht.cbSize = sizeof(MCHITTESTINFO); ht.cbSize = sizeof(MCHITTESTINFO);
ht.pt.x = (short)LOWORD(lParam); ht.pt.x = (short)LOWORD(lParam);
ht.pt.y = (short)HIWORD(lParam); ht.pt.y = (short)HIWORD(lParam);
@ -1564,28 +1547,29 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
infoPtr->status = MC_SEL_LBUTUP; infoPtr->status = MC_SEL_LBUTUP;
if((hit == MCHT_CALENDARDATENEXT) || (hit == MCHT_CALENDARDATEPREV)) { if((hit == MCHT_CALENDARDATENEXT) ||
SYSTEMTIME st[2]; (hit == MCHT_CALENDARDATEPREV) ||
(hit == MCHT_CALENDARDATE))
{
SYSTEMTIME st[2], sel = infoPtr->curSel;
st[0] = st[1] = ht.st; st[0] = st[1] = ht.st;
MONTHCAL_SetSelRange(infoPtr, st); MONTHCAL_SetSelRange(infoPtr, st);
/* will be invalidated here */
MONTHCAL_SetCurSel(infoPtr, &st[0]); MONTHCAL_SetCurSel(infoPtr, &st[0]);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); /* send MCN_SELCHANGE only if new date selected */
return TRUE; if (!MONTHCAL_IsDateEqual(&sel, &ht.st))
} {
nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmsc.nmhdr.code = MCN_SELCHANGE;
nmsc.stSelStart = infoPtr->minSel;
nmsc.stSelEnd = infoPtr->maxSel;
nmhdr.hwndFrom = infoPtr->hwndSelf; SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); }
nmhdr.code = NM_RELEASEDCAPTURE;
TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify);
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
/* redraw if necessary */
if(redraw)
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
/* only send MCN_SELECT if currently displayed month's day was selected */
if(hit == MCHT_CALENDARDATE) {
nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf; nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmsc.nmhdr.code = MCN_SELECT; nmsc.nmhdr.code = MCN_SELECT;
@ -1594,7 +1578,13 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc); SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
return 0;
} }
/* redraw if necessary */
if(redraw)
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0; return 0;
} }