[PATCH 14/21] Fix multiselection days painting, including intersections with prev/next months
Nikolay Sivov
bunglehead at gmail.com
Sat Oct 10 20:03:59 CDT 2009
---
dlls/comctl32/monthcal.c | 50 ++++++++++++++++++++++++++++++---------------
1 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 06e2e1e..a0ca786 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -283,6 +283,17 @@ static LONG MONTHCAL_CompareMonths(const SYSTEMTIME *first, const SYSTEMTIME *se
return MONTHCAL_CompareSystemTime(&st_first, &st_second);
}
+static LONG MONTHCAL_CompareDate(const SYSTEMTIME *first, const SYSTEMTIME *second)
+{
+ SYSTEMTIME st_first, st_second;
+
+ st_first = st_second = st_null;
+ MONTHCAL_CopyDate(first, &st_first);
+ MONTHCAL_CopyDate(second, &st_second);
+
+ return MONTHCAL_CompareSystemTime(&st_first, &st_second);
+}
+
/* Checks largest possible date range and configured one
*
* PARAMETERS
@@ -634,7 +645,7 @@ static void MONTHCAL_CircleDay(const MONTHCAL_INFO *infoPtr, HDC hdc,
SelectObject(hdc, hOldPen2);
}
-static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, int month,
+static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, const SYSTEMTIME *st,
int x, int y, int bold)
{
static const WCHAR fmtW[] = { '%','d',0 };
@@ -645,7 +656,7 @@ static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, int
COLORREF oldCol = 0;
COLORREF oldBk = 0;
- wsprintfW(buf, fmtW, day);
+ wsprintfW(buf, fmtW, st->wDay);
/* No need to check styles: when selection is not valid, it is set to zero.
* 1<day<31, so everything is OK.
@@ -653,11 +664,11 @@ static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, int
MONTHCAL_CalcDayRect(infoPtr, &r, x, y);
- if((day>=infoPtr->minSel.wDay) && (day<=infoPtr->maxSel.wDay)
- && (month == infoPtr->curSel.wMonth)) {
+ if ((MONTHCAL_CompareDate(st, &infoPtr->minSel) >= 0) &&
+ (MONTHCAL_CompareDate(st, &infoPtr->maxSel) <= 0)) {
RECT r2;
- TRACE("%d %d %d\n",day, infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
+ TRACE("%d %d %d\n", st->wDay, infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
TRACE("%s\n", wine_dbgstr_rect(&r));
oldCol = SetTextColor(hdc, infoPtr->monthbk);
oldBk = SetBkColor(hdc, infoPtr->trailingtxt);
@@ -853,53 +864,54 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT
i = 0;
m = 0;
- while(day <= MONTHCAL_MonthLength(prevMonth, infoPtr->curSel.wYear)) {
+ while(st.wDay <= MONTHCAL_MonthLength(prevMonth, infoPtr->curSel.wYear)) {
MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, 0);
if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
{
- MONTHCAL_DrawDay(infoPtr, hdc, day, prevMonth, i, 0,
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, i, 0,
infoPtr->monthdayState[m] & mask);
}
- mask<<=1;
- day++;
+ mask <<= 1;
+ st.wDay++;
i++;
}
/* draw `current' month */
day = 1; /* start at the beginning of the current month */
-
+ st = infoPtr->curSel;
+ st.wDay = 1;
infoPtr->firstDayplace = i;
SetTextColor(hdc, infoPtr->txt);
m++;
mask = 1;
/* draw the first week of the current month */
- while(i<7) {
+ while(i < 7) {
MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, 0);
if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
{
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->curSel.wMonth, i, 0,
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, i, 0,
infoPtr->monthdayState[m] & mask);
}
mask<<=1;
- day++;
+ st.wDay++;
i++;
}
j = 1; /* move to the 2nd week of the current month */
i = 0; /* move back to sunday */
- while(day <= MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear)) {
+ while(st.wDay <= MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear)) {
MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j);
if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
{
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->curSel.wMonth, i, j,
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, i, j,
infoPtr->monthdayState[m] & mask);
}
mask<<=1;
- day++;
+ st.wDay++;
i++;
if(i>6) { /* past saturday, goto the next weeks sunday */
i = 0;
@@ -910,6 +922,9 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT
/* draw `next' month */
day = 1; /* start at the first day of the next month */
+ st = infoPtr->curSel;
+ st.wDay = 1;
+ MONTHCAL_GetNextMonth(&st);
m++;
mask = 1;
@@ -918,11 +933,12 @@ static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT
MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j);
if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
{
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->curSel.wMonth + 1, i, j,
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, i, j,
infoPtr->monthdayState[m] & mask);
}
mask<<=1;
+ st.wDay++;
day++;
i++;
if(i==7) { /* past saturday, go to next week's sunday */
--
1.5.6.5
--=-1fjZwoauM2fBtqWPEAXY--
More information about the wine-patches
mailing list