/// <summary> /// Draws all weeks of the specified month. /// </summary> private void DrawWeeks(MonthInfo month, ref float topOffset) { SizeF weekRowSize = CalendarData.GetDefaultWeekRowSize(MonthAreaSize); SizeF dayCellSize = CalendarData.GetDayCellSize(weekRowSize); // do the first pass to collect day info objects List <DayInfo> days = CollectDays(month, dayCellSize, ref topOffset); // sort the days according to its day kind days.Sort(new DayInfo.Comparer()); // render sorted days RenderDays(days); // render appointments on the top RenderAppointments(month, days, dayCellSize); }
/// <summary> /// Draws the week day names. /// </summary> private void DrawWeekDays(ref float topOffset) { // calc the rect of the week day names row SizeF weekDaysRowSize = CalendarData.GetDaysOfWeekRowSize(MonthAreaSize); RectangleF weekDaysRowRect = new RectangleF( CalendarArea.X, CalendarArea.Y + topOffset, weekDaysRowSize.Width, weekDaysRowSize.Height); SizeF dayCellSize = CalendarData.GetDayCellSize(weekDaysRowSize); using (BrushEx brush = Canvas.CreateSolidBrush(CalendarData.DayHeadersBackcolor)) Canvas.FillRectangle(brush, weekDaysRowRect); // draw the week days how they represented in month var font = CalendarData.DayHeadersFontStyle.CreateFontInfo(); using (BrushEx brush = Canvas.CreateSolidBrush(CalendarData.DayHeadersFontStyle.FontColor)) using (PenEx pen = LineStyle.CreatePen(Canvas, CalendarData.DayHeadersBorderStyle)) { for (int i = 0; i < CalendarData.DaysInWeek; i++) { RectangleF dayCellRect; if (!_rightToLeft) { dayCellRect = new RectangleF( weekDaysRowRect.X + (i * dayCellSize.Width), weekDaysRowRect.Y, dayCellSize.Width, dayCellSize.Height); } else { dayCellRect = new RectangleF( (weekDaysRowRect.X + weekDaysRowRect.Width) - ((i + 1) * dayCellSize.Width), weekDaysRowRect.Y, dayCellSize.Width, dayCellSize.Height); } var borderPath = new PathEx(); { // create day-box area borderPath.AddLines( new PointF[] { new PointF(dayCellRect.X, dayCellRect.Y), new PointF(dayCellRect.X + dayCellRect.Width, dayCellRect.Y), new PointF(dayCellRect.X + dayCellRect.Width, dayCellRect.Y + dayCellRect.Height), new PointF(dayCellRect.X, dayCellRect.Y + dayCellRect.Height), }); borderPath.CloseAllFigures(); // the day name to draw string weekDayName = CalendarData.Culture.DateTimeFormat.GetDayName(CalendarData.WeekDays[i]); // HACK: we should consider the issue with drawing string later. the issue comes about in the designer when caledar has small width to fit titles. --SergeyP { Canvas.PushState(); Canvas.DrawString(weekDayName, font, brush, dayCellRect, ToEx(CalendarData.DayHeadersFormat)); Canvas.PopState(); } Canvas.DrawAndFillPath(pen, null, borderPath); //RenderUtils.DrawRectangle(Canvas, pen, dayCellRect.X, dayCellRect.Y, dayCellRect.Width, dayCellRect.Height); } } } // set offset topOffset += weekDaysRowSize.Height; }