From 76d3e1d553df0f8522cd04c242d44d9e2ef2ef07 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 7 Aug 2010 18:07:03 +0400 Subject: [PATCH] comctl32/monthcal: Support new hittest fields for some cases. --- dlls/comctl32/monthcal.c | 109 ++++++++++++++++++++++----------- dlls/comctl32/tests/monthcal.c | 24 ++++---- 2 files changed, 85 insertions(+), 48 deletions(-) diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 130e5f80d36..0b72603b89f 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -557,7 +557,7 @@ static int MONTHCAL_CalcDayFromPos(const MONTHCAL_INFO *infoPtr, int x, int y, * [O] y : week column (zero based) */ static void MONTHCAL_CalcDayXY(const MONTHCAL_INFO *infoPtr, - const SYSTEMTIME *date, int *x, int *y) + const SYSTEMTIME *date, INT *x, INT *y) { SYSTEMTIME st = infoPtr->minSel; LONG cmp; @@ -1633,10 +1633,22 @@ static INT MONTHCAL_GetCalendarFromPoint(const MONTHCAL_INFO *infoPtr, const POI return -1; } +static inline UINT fill_hittest_info(const MCHITTESTINFO *src, MCHITTESTINFO *dest) +{ + dest->uHit = src->uHit; + dest->st = src->st; + + if (dest->cbSize == sizeof(MCHITTESTINFO)) + memcpy(&dest->rc, &src->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE); + + return src->uHit; +} + static LRESULT MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) { INT day, wday, wnum, calIdx; + MCHITTESTINFO htinfo; SYSTEMTIME ht_month; UINT x, y; @@ -1645,7 +1657,11 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) x = lpht->pt.x; y = lpht->pt.y; - memset(&lpht->st, 0, sizeof(lpht->st)); + htinfo.st = st_null; + + /* we should preserve passed fields if hit area doesn't need them */ + if (lpht->cbSize == sizeof(MCHITTESTINFO)) + memcpy(&htinfo.rc, &lpht->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE); /* 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, @@ -1664,12 +1680,15 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) if (calIdx == -1) { if (PtInRect(&infoPtr->todayrect, lpht->pt)) - lpht->uHit = MCHT_TODAYLINK; + { + htinfo.uHit = MCHT_TODAYLINK; + htinfo.rc = infoPtr->todayrect; + } else /* outside of calendar area? What's left must be background :-) */ - lpht->uHit = MCHT_CALENDARBK; + htinfo.uHit = MCHT_CALENDARBK; - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } ht_month = infoPtr->calendars[calIdx].month; @@ -1680,83 +1699,101 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) two calendars have buttons */ if (calIdx == 0 && PtInRect(&infoPtr->titlebtnprev, lpht->pt)) { - lpht->uHit = MCHT_TITLEBTNPREV; + htinfo.uHit = MCHT_TITLEBTNPREV; + htinfo.rc = infoPtr->titlebtnprev; } else if (PtInRect(&infoPtr->titlebtnnext, lpht->pt)) { - lpht->uHit = MCHT_TITLEBTNNEXT; + htinfo.uHit = MCHT_TITLEBTNNEXT; + htinfo.rc = infoPtr->titlebtnnext; } else if (PtInRect(&infoPtr->calendars[calIdx].titlemonth, lpht->pt)) { - lpht->uHit = MCHT_TITLEMONTH; + htinfo.uHit = MCHT_TITLEMONTH; + htinfo.rc = infoPtr->calendars[calIdx].titlemonth; + htinfo.iOffset = calIdx; } else if (PtInRect(&infoPtr->calendars[calIdx].titleyear, lpht->pt)) { - lpht->uHit = MCHT_TITLEYEAR; + htinfo.uHit = MCHT_TITLEYEAR; + htinfo.rc = infoPtr->calendars[calIdx].titleyear; + htinfo.iOffset = calIdx; } else - lpht->uHit = MCHT_TITLE; + { + htinfo.uHit = MCHT_TITLE; + htinfo.rc = infoPtr->calendars[calIdx].title; + htinfo.iOffset = calIdx; + } - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } /* days area (including week days and week numbers */ day = MONTHCAL_CalcDayFromPos(infoPtr, x, y, &wday, &wnum); if (PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt)) { - lpht->uHit = MCHT_CALENDARDAY; - lpht->st.wYear = ht_month.wYear; - lpht->st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth; - lpht->st.wDay = (day < 1) ? + htinfo.uHit = MCHT_CALENDARDAY; + htinfo.iOffset = calIdx; + htinfo.st.wYear = ht_month.wYear; + htinfo.st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth; + htinfo.st.wDay = (day < 1) ? MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day; + + MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow); } else if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt)) { - lpht->uHit = MCHT_CALENDARWEEKNUM; - lpht->st.wYear = ht_month.wYear; + htinfo.uHit = MCHT_CALENDARWEEKNUM; + htinfo.st.wYear = ht_month.wYear; + htinfo.iOffset = calIdx; if (day < 1) { - lpht->st.wMonth = ht_month.wMonth - 1; - lpht->st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day; + htinfo.st.wMonth = ht_month.wMonth - 1; + htinfo.st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day; } else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) { - lpht->st.wMonth = ht_month.wMonth + 1; - lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); + htinfo.st.wMonth = ht_month.wMonth + 1; + htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); } else { - lpht->st.wMonth = ht_month.wMonth; - lpht->st.wDay = day; + htinfo.st.wMonth = ht_month.wMonth; + htinfo.st.wDay = day; } } else if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt)) { - lpht->st.wYear = ht_month.wYear; - lpht->st.wMonth = ht_month.wMonth; + htinfo.iOffset = calIdx; + htinfo.st.wYear = ht_month.wYear; + htinfo.st.wMonth = ht_month.wMonth; if (day < 1) { - lpht->uHit = MCHT_CALENDARDATEPREV; - MONTHCAL_GetPrevMonth(&lpht->st); - lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day; + htinfo.uHit = MCHT_CALENDARDATEPREV; + MONTHCAL_GetPrevMonth(&htinfo.st); + htinfo.st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day; } else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) { - lpht->uHit = MCHT_CALENDARDATENEXT; - MONTHCAL_GetNextMonth(&lpht->st); - lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); + htinfo.uHit = MCHT_CALENDARDATENEXT; + MONTHCAL_GetNextMonth(&htinfo.st); + htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); } - else { - lpht->uHit = MCHT_CALENDARDATE; - lpht->st.wDay = day; + else + { + htinfo.uHit = MCHT_CALENDARDATE; + htinfo.st.wDay = day; } + MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow); + MONTHCAL_CalcDayRect(infoPtr, &htinfo.rc, htinfo.iCol, htinfo.iRow); /* always update day of week */ - MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE); + MONTHCAL_CalculateDayOfWeek(&htinfo.st, TRUE); } - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } /* MCN_GETDAYSTATE notification helper */ diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c index 59dd0d52e5e..a522bd76dfe 100644 --- a/dlls/comctl32/tests/monthcal.c +++ b/dlls/comctl32/tests/monthcal.c @@ -1698,7 +1698,7 @@ static void test_hittest_v6(void) mchit.iOffset = -1; ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); expect_hex(MCHT_CALENDARDATE, ret); - todo_wine expect(0, mchit.iOffset); + expect(0, mchit.iOffset); /* over day area */ mchit.pt.x = r.right / (7*2); @@ -1710,12 +1710,12 @@ static void test_hittest_v6(void) ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); expect_hex(MCHT_CALENDARDATE, ret); expect_hex(MCHT_CALENDARDATE, mchit.uHit); - todo_wine expect(0, mchit.iOffset); - todo_wine expect(2, mchit.iRow); - todo_wine expect(0, mchit.iCol); + expect(0, mchit.iOffset); + expect(2, mchit.iRow); + expect(0, mchit.iCol); /* returned a one day rectangle */ - todo_wine expect_d(r.right / 7, mchit.rc.right - mchit.rc.left); - todo_wine expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top); + expect_d(r.right / 7, mchit.rc.right - mchit.rc.left); + expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top); /* title */ mchit.pt.x = 1; @@ -1727,13 +1727,13 @@ static void test_hittest_v6(void) ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); expect_hex(MCHT_TITLE, ret); expect_hex(MCHT_TITLE, mchit.uHit); - todo_wine expect(0, mchit.iOffset); + expect(0, mchit.iOffset); expect(-1, mchit.iRow); expect(-1, mchit.iCol); - todo_wine expect(0, mchit.rc.left); - todo_wine expect(0, mchit.rc.top); - todo_wine expect_d(r.right, mchit.rc.right); - todo_wine ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom); + expect(0, mchit.rc.left); + expect(0, mchit.rc.top); + expect_d(r.right, mchit.rc.right); + ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom); /* between two calendars */ MoveWindow(hwnd, 0, 0, r.right * 5/2, r.bottom, FALSE); @@ -1741,7 +1741,7 @@ static void test_hittest_v6(void) mchit.pt.y = r.bottom / 2; mchit.iOffset = -2; mchit.iCol = mchit.iRow = -2; - mchit.uHit = 0; + mchit.uHit = ~0; mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); todo_wine expect_hex(MCHT_NOWHERE, ret);