Commit c68324df authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

comctl32/monthcal: Implement MCM_GETMONTHRANGE for GMR_DAYSTATE flag and a single calendar control.

parent f37130c8
......@@ -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;
......
......@@ -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);
......
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