Module: wine Branch: master Commit: c68324dfedf2f1e25e984f3d87c9419db90ce1f5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c68324dfedf2f1e25e984f3d87...
Author: Nikolay Sivov bunglehead@gmail.com Date: Thu Oct 8 14:02:18 2009 +0400
comctl32/monthcal: Implement MCM_GETMONTHRANGE for GMR_DAYSTATE flag and a single calendar control.
---
dlls/comctl32/monthcal.c | 73 ++++++++++++++++++++++++++++++++------- dlls/comctl32/tests/monthcal.c | 17 +++++---- 2 files changed, 70 insertions(+), 20 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 6394600..a44ae31 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -395,7 +395,7 @@ int MONTHCAL_CalculateDayOfWeek(WORD day, WORD month, WORD year) }
/* properly updates date to point on next month */ -void inline MONTHCAL_GetNextMonth(SYSTEMTIME *date) +static inline void MONTHCAL_GetNextMonth(SYSTEMTIME *date) { if(++date->wMonth > 12) { @@ -407,7 +407,7 @@ void inline MONTHCAL_GetNextMonth(SYSTEMTIME *date) }
/* properly updates date to point on prev month */ -void inline MONTHCAL_GetPrevMonth(SYSTEMTIME *date) +static inline void MONTHCAL_GetPrevMonth(SYSTEMTIME *date) { if(--date->wMonth < 1) { @@ -418,6 +418,45 @@ void inline MONTHCAL_GetPrevMonth(SYSTEMTIME *date) date->wYear); }
+/* Returns full date for a first currently visible day */ +static void MONTHCAL_GetMinDate(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *date) +{ + int firstDay; + + firstDay = MONTHCAL_CalculateDayOfWeek(1, infoPtr->curSel.wMonth, infoPtr->curSel.wYear); + + *date = infoPtr->curSel; + MONTHCAL_GetPrevMonth(date); + + date->wDay = MONTHCAL_MonthLength(date->wMonth, date->wYear) + + (infoPtr->firstDay - firstDay) % 7 + 1; + + if(date->wDay > MONTHCAL_MonthLength(date->wMonth, date->wYear)) + date->wDay -= 7; + + /* fix day of week */ + date->wDayOfWeek = MONTHCAL_CalculateDayOfWeek(date->wDay, date->wMonth, + date->wYear); +} + +/* Returns full date for a last currently visible day */ +static void MONTHCAL_GetMaxDate(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *date) +{ + SYSTEMTIME st; + + *date = infoPtr->curSel; + MONTHCAL_GetNextMonth(date); + + MONTHCAL_GetMinDate(infoPtr, &st); + /* Use month length to get max day. 42 means max day count in calendar area */ + date->wDay = 42 - (MONTHCAL_MonthLength(st.wMonth, st.wYear) - st.wDay + 1) - + MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear); + + /* fix day of week */ + date->wDayOfWeek = MONTHCAL_CalculateDayOfWeek(date->wDay, date->wMonth, + date->wYear); +} + /* From a given point, calculate the row (weekpos), column(daypos) and day in the calendar. day== 0 mean the last day of tha last month */ @@ -661,7 +700,7 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT RECT *titlemonth=&infoPtr->titlemonth; RECT *titleyear=&infoPtr->titleyear; RECT dayrect; - int i, j, m, mask, day, firstDay, prevMonth; + int i, j, m, mask, day, prevMonth; int textHeight = infoPtr->textHeight; SIZE size; HBRUSH hbr; @@ -673,6 +712,7 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT RECT rcTemp; RECT rcDay; /* used in MONTHCAL_CalcDayRect() */ int startofprescal; + SYSTEMTIME st;
oldTextColor = SetTextColor(hdc, comctl32_color.clrWindowText);
@@ -764,13 +804,8 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT }
/* draw day numbers; first, the previous month */ - firstDay = MONTHCAL_CalculateDayOfWeek(1, infoPtr->curSel.wMonth, infoPtr->curSel.wYear); - - day = MONTHCAL_MonthLength(prevMonth, infoPtr->curSel.wYear) + - (infoPtr->firstDay - firstDay)%7 + 1; - - if (day > MONTHCAL_MonthLength(prevMonth, infoPtr->curSel.wYear)) - day -= 7; + MONTHCAL_GetMinDate(infoPtr, &st); + day = st.wDay; startofprescal = day; mask = 1<<(day-1);
@@ -1181,7 +1216,8 @@ MONTHCAL_GetMonthRange(const MONTHCAL_INFO *infoPtr, DWORD flag, SYSTEMTIME *st)
if(st) { - if(flag == GMR_VISIBLE) + switch (flag) { + case GMR_VISIBLE: { /*FIXME: currently multicalendar feature isn't implelented, so entirely visible month is current */ @@ -1193,9 +1229,20 @@ MONTHCAL_GetMonthRange(const MONTHCAL_INFO *infoPtr, DWORD flag, SYSTEMTIME *st) st[1].wDay = MONTHCAL_MonthLength(st[1].wMonth, st[1].wYear); st[1].wDayOfWeek = MONTHCAL_CalculateDayOfWeek(st[1].wDay, st[1].wMonth, st[1].wYear); + /* a single current month used */ + return 1; + } + case GMR_DAYSTATE: + { + /*FIXME: currently multicalendar feature isn't implelented, + min date from previous month and max date from next one returned */ + MONTHCAL_GetMinDate(infoPtr, &st[0]); + MONTHCAL_GetMaxDate(infoPtr, &st[1]); + break; + } + default: + WARN("Unknown flag value, got %d\n", flag); } - else - FIXME("only GMR_VISIBLE flag supported, got %d\n", flag); }
return infoPtr->monthRange; diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c index 57142a6..d3f6681 100644 --- a/dlls/comctl32/tests/monthcal.c +++ b/dlls/comctl32/tests/monthcal.c @@ -1374,10 +1374,10 @@ static void test_monthcal_monthrange(void) todo_wine { expect(2, res); } - expect(2000, st_visible[0].wYear); - expect(11, st_visible[0].wMonth); - expect(1, st_visible[0].wDay); - expect(2000, st_visible[1].wYear); + expect(2000, st_visible[0].wYear); + expect(11, st_visible[0].wMonth); + expect(1, st_visible[0].wDay); + expect(2000, st_visible[1].wYear);
todo_wine { expect(12, st_visible[1].wMonth); @@ -1386,9 +1386,12 @@ static void test_monthcal_monthrange(void) res = SendMessage(hwnd, MCM_GETMONTHRANGE, GMR_DAYSTATE, (LPARAM)st_daystate); todo_wine { expect(4, res); - expect(2000, st_daystate[0].wYear); - expect(10, st_daystate[0].wMonth); - expect(29, st_daystate[0].wDay); + } + expect(2000, st_daystate[0].wYear); + expect(10, st_daystate[0].wMonth); + expect(29, st_daystate[0].wDay); + + todo_wine { expect(2001, st_daystate[1].wYear); expect(1, st_daystate[1].wMonth); expect(6, st_daystate[1].wDay);