comctl32/monthcal: Get rid of goto jumps in hit test helper.

This commit is contained in:
Nikolay Sivov 2010-07-18 16:16:33 +04:00 committed by Alexandre Julliard
parent 8ea515c872
commit 34fba5a2d2
1 changed files with 43 additions and 46 deletions

View File

@ -1618,17 +1618,16 @@ static INT MONTHCAL_GetCalendarFromPoint(const MONTHCAL_INFO *infoPtr, const POI
static LRESULT static LRESULT
MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
{ {
UINT x,y;
DWORD retval;
INT day, wday, wnum, calIdx; INT day, wday, wnum, calIdx;
SYSTEMTIME ht_month; SYSTEMTIME ht_month;
UINT x, y;
if(!lpht || lpht->cbSize < MCHITTESTINFO_V1_SIZE) return -1; if(!lpht || lpht->cbSize < MCHITTESTINFO_V1_SIZE) return -1;
x = lpht->pt.x; x = lpht->pt.x;
y = lpht->pt.y; y = lpht->pt.y;
ZeroMemory(&lpht->st, sizeof(lpht->st)); memset(&lpht->st, 0, sizeof(lpht->st));
/* Comment in for debugging... /* Comment in for debugging...
TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y, TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y,
@ -1644,47 +1643,58 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
/* guess in what calendar we are */ /* guess in what calendar we are */
calIdx = MONTHCAL_GetCalendarFromPoint(infoPtr, &lpht->pt); calIdx = MONTHCAL_GetCalendarFromPoint(infoPtr, &lpht->pt);
if (calIdx == -1) goto nocal; if (calIdx == -1)
{
if (PtInRect(&infoPtr->todayrect, lpht->pt))
lpht->uHit = MCHT_TODAYLINK;
else
/* outside of calendar area? What's left must be background :-) */
lpht->uHit = MCHT_CALENDARBK;
return lpht->uHit;
}
ht_month = infoPtr->calendars[calIdx].month; ht_month = infoPtr->calendars[calIdx].month;
/* are we in the header? */ /* are we in the header? */
if (PtInRect(&infoPtr->calendars[calIdx].title, lpht->pt)) { if (PtInRect(&infoPtr->calendars[calIdx].title, lpht->pt)) {
/* FIXME: buttons hittesting could be optimized cause maximum /* FIXME: buttons hittesting could be optimized cause maximum
two calendars have buttons */ two calendars have buttons */
if(PtInRect(&infoPtr->titlebtnprev, lpht->pt)) { if (calIdx == 0 && PtInRect(&infoPtr->titlebtnprev, lpht->pt))
retval = MCHT_TITLEBTNPREV; {
goto done; lpht->uHit = MCHT_TITLEBTNPREV;
} }
if(PtInRect(&infoPtr->titlebtnnext, lpht->pt)) { else if (PtInRect(&infoPtr->titlebtnnext, lpht->pt))
retval = MCHT_TITLEBTNNEXT; {
goto done; lpht->uHit = MCHT_TITLEBTNNEXT;
} }
if(PtInRect(&infoPtr->calendars[calIdx].titlemonth, lpht->pt)) { else if (PtInRect(&infoPtr->calendars[calIdx].titlemonth, lpht->pt))
retval = MCHT_TITLEMONTH; {
goto done; lpht->uHit = MCHT_TITLEMONTH;
} }
if(PtInRect(&infoPtr->calendars[calIdx].titleyear, lpht->pt)) { else if (PtInRect(&infoPtr->calendars[calIdx].titleyear, lpht->pt))
retval = MCHT_TITLEYEAR; {
goto done; lpht->uHit = MCHT_TITLEYEAR;
} }
else
retval = MCHT_TITLE; lpht->uHit = MCHT_TITLE;
goto done;
return lpht->uHit;
} }
/* days area (including week days and week numbers */
day = MONTHCAL_CalcDayFromPos(infoPtr, x, y, &wday, &wnum); day = MONTHCAL_CalcDayFromPos(infoPtr, x, y, &wday, &wnum);
if(PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt)) { if (PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt))
retval = MCHT_CALENDARDAY; {
lpht->uHit = MCHT_CALENDARDAY;
lpht->st.wYear = ht_month.wYear; lpht->st.wYear = ht_month.wYear;
lpht->st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth; lpht->st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth;
lpht->st.wDay = (day < 1) ? lpht->st.wDay = (day < 1) ?
MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day; MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day;
goto done;
} }
if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt)) { else if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt))
retval = MCHT_CALENDARWEEKNUM; {
lpht->uHit = MCHT_CALENDARWEEKNUM;
lpht->st.wYear = ht_month.wYear; lpht->st.wYear = ht_month.wYear;
if (day < 1) { if (day < 1) {
@ -1704,46 +1714,33 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
} }
else else
lpht->st.wDay = day; lpht->st.wDay = day;
goto done;
} }
if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt)) else if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt))
{ {
lpht->st.wYear = ht_month.wYear; lpht->st.wYear = ht_month.wYear;
lpht->st.wMonth = ht_month.wMonth; lpht->st.wMonth = ht_month.wMonth;
if (day < 1) if (day < 1)
{ {
retval = MCHT_CALENDARDATEPREV; lpht->uHit = MCHT_CALENDARDATEPREV;
MONTHCAL_GetPrevMonth(&lpht->st); MONTHCAL_GetPrevMonth(&lpht->st);
lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day; lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day;
} }
else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear))
{ {
retval = MCHT_CALENDARDATENEXT; lpht->uHit = MCHT_CALENDARDATENEXT;
MONTHCAL_GetNextMonth(&lpht->st); MONTHCAL_GetNextMonth(&lpht->st);
lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
} }
else { else {
retval = MCHT_CALENDARDATE; lpht->uHit = MCHT_CALENDARDATE;
lpht->st.wDay = day; lpht->st.wDay = day;
} }
/* always update day of week */ /* always update day of week */
MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE); MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE);
goto done;
} }
nocal: return lpht->uHit;
if(PtInRect(&infoPtr->todayrect, lpht->pt)) {
retval = MCHT_TODAYLINK;
goto done;
}
/* Hit nothing special? What's left must be background :-) */
retval = MCHT_CALENDARBK;
done:
lpht->uHit = retval;
return retval;
} }
/* MCN_GETDAYSTATE notification helper */ /* MCN_GETDAYSTATE notification helper */