[PATCH 4/4] Implement MCM_GETMONTHRANGE for GMR_DAYSTATE flag and a single calendar control
Nikolay Sivov
bunglehead at gmail.com
Thu Oct 8 05:02:18 CDT 2009
---
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);
--
1.5.6.5
--=-1O4sdnW52e/iReh7PHFI--
More information about the wine-patches
mailing list