diff options
author | AlexKlimenkov <shurick.klimenkov@gmail.com> | 2017-02-17 13:45:02 +0300 |
---|---|---|
committer | AlexKlimenkov <shurick.klimenkov@gmail.com> | 2017-02-17 13:45:02 +0300 |
commit | e495105f25efd2b401c79a1be1b2abd0264b4226 (patch) | |
tree | b4386cefc590345e669dddee95c326feab17084c /DHTMLX.Export.PDF/PDFWriter.cs | |
download | scheduler-export-net-master.zip scheduler-export-net-master.tar.gz scheduler-export-net-master.tar.bz2 |
[add] initial commitHEADorigin/masterorigin/HEADmaster
Diffstat (limited to 'DHTMLX.Export.PDF/PDFWriter.cs')
-rw-r--r-- | DHTMLX.Export.PDF/PDFWriter.cs | 2141 |
1 files changed, 2141 insertions, 0 deletions
diff --git a/DHTMLX.Export.PDF/PDFWriter.cs b/DHTMLX.Export.PDF/PDFWriter.cs new file mode 100644 index 0000000..f4ce115 --- /dev/null +++ b/DHTMLX.Export.PDF/PDFWriter.cs @@ -0,0 +1,2141 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using PdfSharp; +using System.IO; +using PdfSharp.Drawing; +using System.Web; +using PdfSharp.Pdf; + +using PdfSharp.Drawing.Layout; +using DHTMLX.Export.PDF.Formatter; +using DHTMLX.Export.PDF.Scheduler; + +using HtmlAgilityPack; + +namespace DHTMLX.Export.PDF +{ + public enum Orientation + { + Default, + Landscape, + Portrait + } + public class SchedulerPDFWriter + { + + public Orientation Orientation = Orientation.Default; + public string HeaderImgPath = "header.png"; + public string FooterImgPath = "footer.png"; + public double HeaderImgHeight = 100; + public double FooterImgHeight = 100; + public double BaseFontSize = 7.0; + public double WeekAgendarDayFont = 9.4; + + public bool TrimContentStrings = true; + public bool TrimLayoutStrings = true; + public bool MultipageMonthLayout = false; + public double HeaderFontSize = 7.0; + public double TimelineRowMinHeight = 50; + public double BorderWidth = 0.5; + + protected XMLParser Parser; + protected PdfDocument Pdf; + protected PdfPage Page; + protected List<PdfPage> Pages; + protected List<XGraphics> Graphics; + protected XGraphics Gfx; + protected XFont F1; + protected PDFImages Images = new PDFImages(); + protected bool NeedPagesNums; + + private Resizer _resizer; + private double _pageWidth; + private double _pageHeight; + + private double _initialOffsetTop = 30; + private double _initialOffsetBottom = 30; + private double _initialOffsetLeft = 30; + private double _initialOffsetRight = 30; + + private double _offsetTop = 30; + private double _offsetBottom = 30; + private double _offsetLeft = 30; + private double _offsetRight = 30; + private double _headHeight = 20; + private double _monthDayHeaderHeight = 20; + private double _monthEventHeight = 12; + private double _leftScaleWidth = 80; + private double _timelineLeft = 80; + private double _monthEventOffsetLeft = 2; + private double _monthEventOffsetTop = 2; + private double _yearMonthOffsetLeft = 10; + private double _yearMonthOffsetTop = 10; + private double _yearMonthLabelHeight = 20; + private double _weekEventHeaderHeight = 10; + private double _agendaColOneWidth = 150; + private double _multidayLineHeight = 14; + private double _weekAgendaEventHeight = 20; + + private string _pageNumTemplate = "Page {pageNum}/{allNum}"; + + private double _monthDayWidth; + private double _monthDayHeight; + private double _contHeight; + private double _contWidth; + + private double _weekDayWidth; + private double _weekDayHeight; + private double _headerHeight; + private double _multiHeight; + + private ColorProfile _profile; + + private double _cellOffset = 3; + + private string _bgColor = "C2D5FC"; + private string _lineColor = "586A7E"; + private string _headerLineColor = "FFFFFF"; + + private string _dayHeaderColor = "EBEFF4"; + private string _watermarkTextColor = "8b8b8b"; + private string _dayBodyColor = "FFFFFF"; + private string _dayHeaderColorInactive = "E2E3E6"; + private string _dayBodyColorInactive = "ECECEC"; + private string _eventColor = "FFE763"; + private string _eventTextColor = "887A2E"; + private string _scaleOneColor = "FCFEFC"; + private string _scaleTwoColor = "DCE6F4"; + private string _timelineTreeColor = "969394"; + private string _eventBorderColor = "B7A543"; + private string _textColor = "000000"; + private string _yearDayActiveColor = "EBEFF4"; + private string _yearDayInactiveColor = "D6D6D6"; + private string _multidayColor = "E1E6FF"; + private string _matrixEventColor = "FFFFFF"; + private string _view; + private string _watermark; + + public string ContentType { get { return "application/pdf"; } } + protected PDFPage CurrentPage { get; set; } + + private double[] SelectColor(string fullColor, double[] def) + { + if ((fullColor != "transparent") + && ((_profile == ColorProfile.FullColor) || (_profile == ColorProfile.Color))) + { + return RGBColor.GetColor(fullColor); + } + return def; + } + + + private string StripHtml(string html) + { + return HtmlEntity.DeEntitize(html); + } + private string TextWrap(string text, double width, XFont f, bool actuallyDo) + { + text = StripHtml(text); + + if (!actuallyDo) + return text; + return TextWrap(text, width, f); + } + + private string TextWrap(string text, double width, XFont f) + { + text = StripHtml(text); + + width = _resizer.ResizeX(width); + if ((Gfx.MeasureString(text, f).Width <= width) || (text.Length == 0)) + { + return text; + } + while ((Gfx.MeasureString(text + "...", f).Width > width) && (text.Length > 0)) + { + text = text.Substring(0, text.Length - 1); + } + return text + "..."; + } + public double[] GetSizes(PageOrientation orientation, PageSize size) + { + var sizes = new double[2]; + var siz = PageSizeConverter.ToSize(size); + + if (orientation == PageOrientation.Landscape) + { + + sizes[0] = siz.Height; + sizes[1] = siz.Width; + } + else + { + sizes[1] = siz.Height; + sizes[0] = siz.Width; + } + + return sizes; + + } + private void SetColorProfile(ColorProfile profile) + { + if ((profile == ColorProfile.Color) || (profile == ColorProfile.FullColor)) + { + _bgColor = "C2D5FC"; + _lineColor = "c1d4fc"; + _headerLineColor = "FFFFFF"; + _dayHeaderColor = "EBEFF4"; + _dayBodyColor = "FFFFFF"; + _dayHeaderColorInactive = "E2E3E6"; + _dayBodyColorInactive = "ECECEC"; + _eventColor = "FFE763"; + _eventTextColor = "887A2E"; + _scaleOneColor = "FCFEFC"; + _scaleTwoColor = "DCE6F4"; + + _timelineTreeColor = "969394"; + + _eventBorderColor = "B7A543"; + _textColor = "000000"; + _yearDayActiveColor = "EBEFF4"; + _yearDayInactiveColor = "D6D6D6"; + _multidayColor = "E1E6FF"; + _matrixEventColor = "FFFFFF"; + _watermarkTextColor = "8b8b8b"; + } + else + { + if (profile == ColorProfile.Gray) + { + _bgColor = "D3D3D3"; + _lineColor = "666666"; + _headerLineColor = "FFFFFF"; + _dayHeaderColor = "EEEEEE"; + _dayBodyColor = "FFFFFF"; + _dayHeaderColorInactive = "E3E3E3"; + _dayBodyColorInactive = "ECECEC"; + _eventColor = "DFDFDF"; + _eventTextColor = "000000"; + _scaleOneColor = "FFFFFF"; + + _timelineTreeColor = "BBBBBB"; + + _scaleTwoColor = "E4E4E4"; + _eventBorderColor = "9F9F9F"; + _textColor = "000000"; + _yearDayActiveColor = "EBEFF4"; + _yearDayInactiveColor = "E2E3E6"; + _multidayColor = "E7E7E7"; + _matrixEventColor = "FFFFFF"; + _watermarkTextColor = "8b8b8b"; + } + else + { + _bgColor = "FFFFFF"; + _lineColor = "000000"; + _headerLineColor = "000000"; + _dayHeaderColor = "FFFFFF"; + _dayBodyColor = "FFFFFF"; + _dayHeaderColorInactive = "FFFFFF"; + _dayBodyColorInactive = "FFFFFF"; + _eventColor = "FFFFFF"; + _eventTextColor = "000000"; + + _timelineTreeColor = "FFFFFF"; + + _scaleOneColor = "FFFFFF"; + _scaleTwoColor = "FFFFFF"; + _eventBorderColor = "000000"; + _textColor = "000000"; + _yearDayActiveColor = "FFFFFF"; + _yearDayInactiveColor = "FFFFFF"; + _multidayColor = "FFFFFF"; + _matrixEventColor = "FFFFFF"; + _watermarkTextColor = "000000"; + } + } + } + private void CreatePdf(PageOrientation orientation, PageSize size) + { + _resizer = new Resizer(orientation, Orientation); + + if (Pdf == default(PdfDocument)) + { + Pdf = new PdfDocument(); + F1 = CreateFont("Helvetica", 10); + Pdf.Version = 14; + Pages = new List<PdfPage>(); + } + NewPage(_resizer.Orient, size); + } + + protected PdfPage NewPage(PageOrientation orient, PageSize size) + { + Page = new PdfPage(Pdf); + Pdf.AddPage(Page); + + Gfx = XGraphics.FromPdfPage(Page, XGraphicsPdfPageOptions.Replace); + if (Graphics == null) + Graphics = new List<XGraphics>(); + Graphics.Add(Gfx); + Pages.Add(Page); + + Page.Size = size; + Page.Orientation = orient; + + TodayLabelDraw(Gfx); + + _headerHeight = _headHeight; + _offsetTop = _initialOffsetTop; + _offsetBottom = _initialOffsetBottom; + _offsetLeft = _initialOffsetLeft; + _offsetRight = _initialOffsetRight; + + var sizes = GetSizes(_resizer.Orient, size); + _pageWidth = sizes[0] - _offsetLeft - _offsetRight; + _pageHeight = sizes[1] - _offsetTop - _offsetBottom; + + PrintHeader(); + PrintFooter(); + return Page; + } + protected XFont CreateFont(string name, double size) + { + var fontSettings = new XPdfFontOptions(PdfFontEncoding.Unicode); + return new XFont(name, size, new XFontStyle(), fontSettings); + } + + + public MemoryStream Generate(string xml) + { + var data = new MemoryStream(); + + Generate(xml, data); + return data; + } + public void Generate(string xml, HttpResponse resp) + { + if (resp == default(HttpResponse)) + { + throw new ArgumentNullException("resp", "HttpResponse is null"); + } + var data = new MemoryStream(); + + resp.ContentType = ContentType; + resp.HeaderEncoding = Encoding.UTF8; + + resp.AppendHeader("Cache-Control", "max-age=0"); + Generate(xml, data); + + try + { + data.WriteTo(resp.OutputStream); + } + catch (Exception e) + { + throw new Exception("Can't write to the output stream:" + e.Message); + } + + } + public void PrintPage(PDFPage page) + { + _view = page.Mode; + _profile = page.Profile; + SetColorProfile(_profile); + + + CurrentPage = page; + switch (_view) + { + case "month": + PrintMonth(page); + break; + case "year": + PrintYear(page); + break; + case "agenda": + case "map": + PrintAgenda(page); + break; + case "treetimeline": + case "timeline": + PrintTimeline(page); + break; + case "matrix": + PrintMatrix(page); + break; + case "week_agenda": + PrintWeekAgenda(page); + break; + default: + PrintWeek(page); + break; + } + + PrintWatermark(); + } + + public void PrintPages() + { + foreach (var i in Parser.Pages) + { + PrintPage(i); + } + } + + public void Generate(string xml, Stream resp) + { + if (string.IsNullOrEmpty(xml)) + { + throw new ArgumentException("Input string is null or empty!", "xml"); + } + Parser = new XMLParser(); + + try + { + + var pages = Parser.GetPages(xml); + foreach (var page in pages) + { + Parser.SetXML(page); + PrintPages(); + } + if (NeedPagesNums) + { + AgendaPagesDraw(); + } + OutputPdf(resp); + } + catch (Exception e) + { + throw; + } + } + + private void OutputPdf(Stream resp) + { + Pdf.Save(resp, false); + } + + private void PrintMonth(PDFPage page) + { + CreatePdf(PageOrientation.Landscape, PageSize.A4); + MonthHeaderDraw(); + MonthContainerDraw(); + MonthEventsDraw(page); + + } + + private void PrintYear(PDFPage page) + { + CreatePdf(PageOrientation.Landscape, PageSize.A4); + YearDraw(page); + } + + private void PrintAgenda(PDFPage page) + { + CreatePdf(PageOrientation.Portrait, PageSize.A4); + AgendaHeaderDraw(); + AgendaEventDraw(page); + NeedPagesNums = true; + } + + private void PrintTimeline(PDFPage page) + { + _leftScaleWidth = _timelineLeft; + var size = PageSize.A4; + CreatePdf(PageOrientation.Landscape, size); + + var rows = Parser.WeekRowsParsing(CurrentPage); + var blocksNumber = (int)((_pageHeight - _headerHeight) / TimelineRowMinHeight); + + var pages = (int)Math.Ceiling((double)rows.Length / (double)blocksNumber); + NeedPagesNums = true; + for (var i = 0; i < pages; i++) + { + var currentPageRows = rows.Skip(i * blocksNumber).Take(blocksNumber).ToArray(); + WeekHeaderDraw(); + TimelineContainerDraw(currentPageRows); + TimelineEventsDraw(page, i + 1, blocksNumber); + if (i != pages - 1) + { + NewPage(_resizer.Orient, size); + } + } + } + + private void PrintMatrix(PDFPage page) + { + _leftScaleWidth = _timelineLeft; + CreatePdf(PageOrientation.Landscape, PageSize.A4); + WeekHeaderDraw(); + MatrixContainerDraw(page); + } + + private void PrintWeek(PDFPage page) + { + CreatePdf(PageOrientation.Portrait, PageSize.A4); + WeekHeaderDraw(); + WeekMultidayDraw(page); + WeekContainerDraw(); + WeekEventsDraw(page); + if (_profile == ColorProfile.BW) + WeekBwBordersDraw(); + } + + private void PrintWeekAgenda(PDFPage page) + { + + CreatePdf(PageOrientation.Portrait, PageSize.A4); + var events = page.Events.ToArray(); + WeekAgendaContainerDraw(); + while (events.Length > 0) + { + + events = WeekAgendaEventsDraw(events); + if (events.Length > 0) + { + Page = NewPage(PageOrientation.Portrait, PageSize.A4); + WeekAgendaContainerDraw(); + } + } + } + + private void PrintWatermark() + { + if (_watermark == null) return; + + F1 = CreateFont(F1.FontFamily.Name, 10); + + for (var i = 1; i <= Pages.Count; i++) + { + var graph = Graphics[i - 1]; + + var text = new XTextFormatter(graph); + var x = _offsetLeft; + var y = _pageHeight + _offsetTop + F1.Size; + text.DrawString(_watermark, F1, new XSolidBrush(RGBColor.GetXColor(_watermarkTextColor)), _resizer.Rect(x, y, graph.MeasureString(_watermark, F1).Width, F1.Size)); + } + } + + private void MonthHeaderDraw() + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_headerLineColor); + var cols = Parser.MonthColsParsing(CurrentPage); + var width = _pageWidth / cols[0].Length; + var height = _headerHeight; + var x = _offsetLeft; + var y = _offsetTop; + + var font = new XFont(F1.FontFamily.Name, F1.Size); + + for (var i = 0; i < cols[0].Length; i++) + { + XRect cell = _resizer.Rect(x, y, width, height); + + Gfx.DrawRectangle(new XSolidBrush(RGBColor.GetXColor(bgColor)), cell); + + if (i > 0) + { + var points = new XPoint[4]; + points[0] = _resizer.Point(x, y); + points[1] = _resizer.Point(x, y + height); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), 1), points[0], points[1]); + } + + var text = new XTextFormatter(Gfx); + var content = TextWrap(cols[0][i], width - 2 * _cellOffset, font, TrimLayoutStrings); + var textX = x + (width - Gfx.MeasureString(content, F1).Width) / 2; + var textY = y + (height - F1.Size) / 2; + + text.DrawString(content, font, new XSolidBrush(RGBColor.GetXColor(RGBColor.GetColor(_textColor))), _resizer.Rect(textX, textY, Gfx.MeasureString(content, F1).Width, font.Size)); + + x += width; + } + } + + private void MonthContainerDraw() + { + var borderColor = RGBColor.GetColor(_lineColor); + var dayHeaderColor = RGBColor.GetColor(_dayHeaderColor); + var dayBodyColor = RGBColor.GetColor(_dayBodyColor); + var dayHeaderColorInactive = RGBColor + .GetColor(_dayHeaderColorInactive); + var dayBodyColorInactive = RGBColor + .GetColor(_dayBodyColorInactive); + var rows = Parser.MonthRowsParsing(CurrentPage); + var width = _pageWidth / 7; + var height = (_pageHeight - _headerHeight) / rows.GetLength(0); + _monthDayWidth = width; + _monthDayHeight = height; + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + for (var i = 0; i < rows.GetLength(0); i++) + { + + for (var j = 0; j < rows.GetLength(1); j++) + { + var activeDay = GetActiveDay(rows, i, j); + + var cell = _resizer.Rect(x, y, width, height); + var cellIn = _resizer.Rect(x, y, width, _monthDayHeaderHeight); + XBrush cellInBrush, cellBrush; + if (activeDay) + { + cellBrush = new XSolidBrush(RGBColor.GetXColor(dayBodyColor)); + cellInBrush = new XSolidBrush(RGBColor.GetXColor(dayHeaderColor)); + } + else + { + cellBrush = new XSolidBrush(RGBColor.GetXColor(dayBodyColorInactive)); + cellInBrush = new XSolidBrush(RGBColor.GetXColor(dayHeaderColorInactive)); + } + + + Gfx.DrawRectangle(cellBrush, cell); + Gfx.DrawRectangle(cellInBrush, cellIn); + + var points = new XPoint[3]; + points[0] = _resizer.Point(x, y); + points[1] = _resizer.Point(x + width, y); + points[2] = _resizer.Point(x, y + height); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[1]); + + + + var label = rows[i, j]; + var textX = x + width - Gfx.MeasureString(label, F1).Width - _cellOffset; + + var textY = y + (_monthDayHeaderHeight + F1.Size) / 2; + + Gfx.DrawString(label, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + x += width; + } + x = _offsetLeft; + + y += height; + } + + + var points2 = new XPoint[3]; + points2[0] = _resizer.Point(_offsetLeft + _pageWidth, _offsetTop); + points2[1] = _resizer.Point(_offsetLeft + _pageWidth, _offsetTop + _pageHeight); + points2[2] = _resizer.Point(_offsetLeft, _offsetTop + _pageHeight); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points2[0], points2[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points2[1], points2[2]); + + + } + + private void MonthEventsDraw(PDFPage page) + { + var rowObjects = Parser.GetRowsObjects(page); + + var eventColor = RGBColor.GetColor(_eventColor); + var eventBorderColor = RGBColor.GetColor(_eventBorderColor); + var textColor = RGBColor.GetColor(_eventTextColor); + var events = page.Events; + var minHeight = events.Count != 0 ? events.Min(e => e.Y) : 0; + var footenote = 1; + var eventsGrid = new int[6][]; + + for (var i = 0; i < 6; i++) + { + eventsGrid[i] = new int[7]; + for (var j = 0; j < 7; j++) + { + eventsGrid[i][j] = 0; + } + } + + var evHeight = events.Sum(e => e.Height) / (double)events.Count + 3; + + for (var i = 0; i < events.Count; i++) + { + var eventText = events[i].Text; + var day = events[i].Day; + var week = events[i].Week - 1; + + eventsGrid[week][day] = (int)Math.Floor((events[i].Y - rowObjects.Where((r, ind) => ind < week).Sum(r => r.Height)) / (evHeight));//todo: remove magic with event indexes + + var width = (events[i].Width * _monthDayWidth) / 100; + var type = events[i].Type; + var bgColor = events[i].BackgroundColor; + var color = events[i].Color; + if (type == "event_line") + { + + var cellX = _offsetLeft + day * _monthDayWidth + + _monthEventOffsetLeft; + var cellY = _offsetTop; + cellY += _headerHeight; + cellY += week * _monthDayHeight; + cellY += _monthDayHeaderHeight; + cellY += eventsGrid[week][day] + * (_monthEventHeight + _monthEventOffsetTop); + cellY += _monthEventOffsetTop; + + + var height = _monthEventHeight; + var cellPen = new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth); + + var borders = new XPoint[4]; + borders[0] = _resizer.Point(cellX, cellY); + borders[1] = _resizer.Point(cellX + width, cellY); + borders[2] = _resizer.Point(cellX + width, cellY + height); + borders[3] = _resizer.Point(cellX, cellY + height); + + + var cellIn = _resizer.Rect(cellX, cellY, width, height); + var cellInBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(bgColor, eventColor))); + + F1 = CreateFont(F1.FontFamily.Name, 8); + + var label = TextWrap(eventText, width - 2 * _cellOffset, F1, TrimContentStrings); + var textX = cellX + _cellOffset; + + var textY = cellY + (height + F1.Size) / 2; + var textBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + if ((cellY + height) >= (_offsetTop + _headerHeight + (week + 1) + * _monthDayHeight)) + { + var eventFootenote = GetFootenoteExists(events, week, day); + if (eventFootenote > 0) + { + events[i].Footenote = eventFootenote; + } + else + { + events[i].Footenote = footenote; + footenote++; + } + } + else + { + + Gfx.DrawRectangle(cellInBrush, cellIn); + Gfx.DrawLine(cellPen, borders[0], borders[1]); + Gfx.DrawLine(cellPen, borders[1], borders[2]); + Gfx.DrawLine(cellPen, borders[2], borders[3]); + Gfx.DrawLine(cellPen, borders[3], borders[0]); + + Gfx.DrawString(label, F1, textBrush, _resizer.Point(textX, textY)); + } + } + else + { + var cellX = _offsetLeft + day * _monthDayWidth + + _monthEventOffsetLeft; + var cellY = _offsetTop; + cellY += _headerHeight; + cellY += week * _monthDayHeight; + cellY += _monthDayHeaderHeight; + cellY += eventsGrid[week][day] + * (_monthEventHeight + _monthEventOffsetTop); + cellY += _monthEventOffsetTop; + var height = _monthEventHeight; + F1 = CreateFont(F1.FontFamily.Name, 8); + + var text = TextWrap(eventText, width - 2 * _cellOffset, F1, TrimContentStrings); + + XSolidBrush textBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + var textX = cellX + _cellOffset; + var textY = cellY + (height + F1.Size) / 2; + + if (cellY + height >= _offsetTop + _headerHeight + (week + 1) + * _monthDayHeight) + { + var eventFootenote = GetFootenoteExists(events, week, day); + if (eventFootenote > 0) + { + events[i].Footenote = eventFootenote; + } + else + { + events[i].Footenote = footenote; + footenote++; + } + } + else + { + Gfx.DrawString(text, F1, textBrush, _resizer.Point(textX, textY)); + + } + } + } + if (_profile == ColorProfile.BW) + MonthBwBordersDraw(); + MonthFootenotesDraw(events, footenote, page, minHeight); + } + + private int GetFootenoteExists(IList<SchedulerEvent> events, int week, int day) + { + var result = -1; + for (var i = 0; i < events.Count; i++) + { + var ev = events[i]; + var eventWeek = ev.Week - 1; + var eventDay = ev.Day; + if (eventWeek == week && eventDay == day) + { + var foote = ev.Footenote; + if (foote > 0) + { + result = ev.Footenote; + } + } + } + return result; + } + + private void MonthFootenotesDraw(IList<SchedulerEvent> events, int footenotes, PDFPage exportPage, double minHeight) + { + if (footenotes > 1) + { + NeedPagesNums = true; + Page = NewPage(PageOrientation.Landscape, PageSize.A4); + } + else + { + return; + } + + if (MultipageMonthLayout) + { + + var evs = new List<SchedulerEvent>(); + for (var i = 1; i < footenotes; i++) + { + var block = getFootenoteEvents(events, i).ToList(); + var offset = block.Min(e => e.Y) - minHeight; + foreach (var ev in block) + { + ev.Y -= offset; + } + evs.AddRange(block); + } + evs.ForEach(e => e.Footenote = 0); + + CurrentPage.Events = evs; + + MonthHeaderDraw(); + MonthContainerDraw(); + MonthEventsDraw(exportPage); + } + else + { + + var rows = Parser.MonthRowsParsing(CurrentPage); + var borderColor = RGBColor.GetColor(_lineColor); + var eventColor = RGBColor.GetColor(_eventColor); + var eventTextColor = RGBColor.GetColor(_eventTextColor); + + var labelHeight = 20; + var height = 20; + var width = 160; + var offsetLeft = 20; + var x = _offsetLeft; + var y = _offsetTop; + for (var i = 1; i < footenotes; i++) + { + var footEvents = getFootenoteEvents(events, i); + + + var day = footEvents[0].Day; + var week = footEvents[0].Week - 1; + if (y + labelHeight + height > _offsetTop + _pageHeight) + { + x += width + offsetLeft; + if (x + width > _offsetLeft + _pageWidth) + { + Page = NewPage(PageOrientation.Landscape, PageSize.A4); + + x = _offsetLeft; + } + y = _offsetTop; + } + var label = rows[week, day] + "[" + i.ToString() + "]"; + + + var labelX = x + (width - Gfx.MeasureString(label, F1).Width) / 2; + var labelY = y + labelHeight - _cellOffset; + Gfx.DrawString(label, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(labelX, labelY)); + + y += labelHeight; + for (var j = 0; j < footEvents.Count; j++) + { + if (y + height > _offsetTop + _pageHeight) + { + x += width + offsetLeft; + if (x + width > _offsetLeft + _pageWidth) + { + Page = NewPage(PageOrientation.Landscape, PageSize.A4); + x = _offsetLeft; + } + y = _offsetTop; + labelX = x + (width - Gfx.MeasureString(label, F1).Width) / 2; + labelY = y + labelHeight - _cellOffset; + + Gfx.DrawString(label, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(labelX, labelY)); + + y += labelHeight; + } + + var borders = new XPoint[4]; + borders[0] = _resizer.Point(x, y); + borders[1] = _resizer.Point(x + width, y); + borders[2] = _resizer.Point(x + width, y + height); + borders[3] = _resizer.Point(x, y + height); + var contBg = _resizer.Rect(x, y, width, height); + + var evBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(footEvents[j].BackgroundColor, eventColor))); + + Gfx.DrawRectangle(evBrush, contBg); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[3], borders[0]); + + var text = TextWrap(footEvents[j].Text, width - 2 * _cellOffset, F1, TrimContentStrings); + + var textX = x + _cellOffset; + var textY = y + (height + F1.Size) / 2; + + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(SelectColor(footEvents[j].Color, eventTextColor))), _resizer.Point(textX, textY)); + + y += height; + } + } + } + } + + private IList<SchedulerEvent> getFootenoteEvents(IList<SchedulerEvent> events, + int footenote) + { + var nums = 0; + for (var i = 0; i < events.Count; i++) + { + if (events[i].Footenote == footenote) + { + nums++; + } + } + var footEvents = new List<SchedulerEvent>(nums); + for (var i = 0; i < events.Count; i++) + { + if (events[i].Footenote == footenote) + { + footEvents.Add(events[i]); + } + } + return footEvents; + } + + private void MonthBwBordersDraw() + { + var borderColor = RGBColor.GetColor(_lineColor); + var x = _offsetLeft; + var y = _offsetTop; + Line(borderColor, x, y, x + _pageWidth, y); + Line(borderColor, x, y, x, y + _headerHeight); + + x = _offsetLeft + _pageWidth; + Line(borderColor, x, y, x, y + _headerHeight); + } + + private void WeekHeaderDraw() + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_headerLineColor); + var cols = Parser.WeekColsParsing(CurrentPage); + + _weekDayWidth = (_pageWidth - _leftScaleWidth) / cols[0].Length; + var defHeight = _headerHeight; + _headerHeight = defHeight * cols.Length; + + var ratios = Parser.ScaleRatios(CurrentPage).Select(r => (double)r).ToList(); + + + for (var scale = 0; scale < cols.Length && scale < 2; scale++) + { + var x = _offsetLeft + _leftScaleWidth; + var height = defHeight; + + var y = _offsetTop + defHeight * scale; + + + var width = (_pageWidth - _leftScaleWidth) / cols[scale].Length; + + + if (_weekDayWidth > width) + _weekDayWidth = width; + for (var col = 0; col < cols[scale].Length; col++) + { + if (scale == 0 && ratios.Count > 0 && cols[1].Length > 0 && col < ratios.Count) + { + width = (_pageWidth - _leftScaleWidth) / cols[1].Length * ratios[col]; + } + else + { + width = (_pageWidth - _leftScaleWidth) / cols[scale].Length; + } + + var cell = _resizer.Rect(x, y, width, height); + + var cellBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + Gfx.DrawRectangle(cellBrush, cell); + + var points = new XPoint[3]; + points[0] = _resizer.Point(x, y); + points[1] = _resizer.Point(x + width, y); + points[2] = _resizer.Point(x, y + height); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[1]); + + + F1 = new XFont(F1.FontFamily.Name, HeaderFontSize); + + var text = TextWrap(cols[scale][col], width + - 2 * _cellOffset, F1, TrimLayoutStrings); + + var textX = x + (width - Gfx.MeasureString(text, F1).Width) / 2; + var textY = y + (height + F1.Size) / 2; + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + + x += width; + } + + } + } + + private void WeekMultidayDraw(PDFPage page) + { + var bgColor = RGBColor.GetColor(_multidayColor); + var borderColor = RGBColor.GetColor(_headerLineColor); + + _multiHeight = GetMultidayHeight(page); + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + var cell = _resizer.Rect(x, y, _pageWidth, _multiHeight); + + var cellBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + Gfx.DrawRectangle(cellBrush, cell); + + var points = new XPoint[4]; + points[0] = _resizer.Point(x + _leftScaleWidth, y + 0); + points[1] = _resizer.Point(x + _leftScaleWidth, y + _multiHeight); + points[2] = _resizer.Point(x + 0, y + 0); + points[3] = _resizer.Point(x + _pageWidth, y + 0); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[2], points[3]); + + _headerHeight += _multiHeight; + } + + private double GetMultidayHeight(PDFPage page) + { + var cols = Parser.WeekColsParsing(page); + var events = page.Multiday; + var scheme = new int[cols[0].Length]; + for (var i = 0; i < scheme.Length; i++) + scheme[i] = 0; + for (var i = 0; i < events.Count; i++) + { + var day = events[i].Day; + var len = events[i].Len; + for (var j = day; j < day + len; j++) + scheme[j]++; + } + var max = scheme[0]; + for (var i = 1; i < scheme.Length; i++) + { + if (scheme[i] > max) + max = scheme[i]; + } + return max * _multidayLineHeight; + } + + private void WeekContainerDraw() + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_lineColor); + var headerLineColor = RGBColor.GetColor(_headerLineColor); + var scaleOneColor = RGBColor.GetColor(_scaleOneColor); + var scaleTwoColor = RGBColor.GetColor(_scaleTwoColor); + var rows = Parser.WeekRowsParsing(CurrentPage); + var width = _leftScaleWidth; + var height = (_pageHeight - _headerHeight) / rows.Length; + _weekDayHeight = height; + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + for (var i = 0; i < rows.Length; i++) + { + + var cell = _resizer.Rect(x, y, width, height); + var cellBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + + var scaleOne = _resizer.Rect(x + width, y, _pageWidth - width, height / 2); + var scaleOneBrush = new XSolidBrush(RGBColor.GetXColor(scaleOneColor)); + + var scaleTwo = _resizer.Rect(x + width, y + height / 2, _pageWidth - width, height / 2); + var scaleTwoBrush = new XSolidBrush(RGBColor.GetXColor(scaleTwoColor)); + + Gfx.DrawRectangle(cellBrush, cell); + Gfx.DrawRectangle(scaleOneBrush, scaleOne); + Gfx.DrawRectangle(scaleTwoBrush, scaleTwo); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(headerLineColor), BorderWidth), _resizer.Point(x, y), _resizer.Point(x + width, y)); + + var text = TextWrap(rows[i], width - 2 * _cellOffset, F1, TrimLayoutStrings); + var textX = x + (width - Gfx.MeasureString(text, F1).Width) / 2; + var textY = y + (height + F1.Size) / 2; + + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + + y += height; + } + + var cols = Parser.WeekColsParsing(CurrentPage); + width = (_pageWidth - _leftScaleWidth) / cols[0].Length; + x = _offsetLeft + _leftScaleWidth; + y = _offsetTop + _headerHeight; + for (var scale = 0; scale < cols.Length; scale++) + { + for (var col = 0; col < cols[scale].Length; col++) + { + var points = new XPoint[2]; + points[0] = _resizer.Point(x, y); + points[1] = _resizer.Point(x, _pageHeight + _offsetTop); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points[0], points[1]); + + x += width; + } + y += _headerHeight; + } + + var points2 = new XPoint[2]; + points2[0] = _resizer.Point(x, y - _multiHeight); + points2[1] = _resizer.Point(x, _offsetTop + _pageHeight); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), points2[0], points2[1]); + } + + private void WeekEventsDraw(PDFPage page) + { + var eventBorderColor = RGBColor.GetColor(_eventBorderColor); + var eventColor = RGBColor.GetColor(_eventColor); + + var textColor = RGBColor.GetColor(_eventTextColor); + var textFormatter = new DHXTextFormatter(Gfx); + var events = page.Events; + var defAlign = textFormatter.Alignment; + + for (var i = 0; i < events.Count; i++) + { + var x = _offsetLeft + _leftScaleWidth + events[i].X + * _weekDayWidth / 100; + var y = _offsetTop + _headerHeight + events[i].Y + * _weekDayHeight / 100; + var width = events[i].Width * _weekDayWidth / 100; + var height = events[i].Height * _weekDayHeight / 100; + var text = events[i].Text; + var headerText = events[i].HeaderText; + var bgColor = events[i].BackgroundColor; + var color = events[i].Color; + + + var borders = new XPoint[4]; + borders[0] = _resizer.Point(x, y); + borders[1] = _resizer.Point(x + width, y); + borders[2] = _resizer.Point(x + width, y + height); + borders[3] = _resizer.Point(x, y + height); + + + var eventBg = _resizer.Rect(x, y, width, height); + var evBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(bgColor, eventColor))); + + F1 = new XFont(F1.FontFamily.Name, BaseFontSize); + + var textY = y + (_weekEventHeaderHeight - F1.Size) / 2; + var headTxtBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + var bodyTxt = text; + var bodyTextX = x; + var bodyTextWidth = width; + if (width > 3 * _cellOffset) + { + bodyTextX = x + _cellOffset; + bodyTextWidth = width - 2 * _cellOffset; + } + var bodyTextY = y; + var bodyTextHeight = height; + if (height > 3 * _cellOffset) + { + bodyTextY = y + _cellOffset + _weekEventHeaderHeight; + bodyTextHeight = height - 2 * _cellOffset; + } + + + + var bodyTxtBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + Gfx.DrawRectangle(evBrush, eventBg); + var borderPen = new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth); + Gfx.DrawLine(borderPen, borders[0], borders[1]); + Gfx.DrawLine(borderPen, borders[1], borders[2]); + Gfx.DrawLine(borderPen, borders[2], borders[3]); + Gfx.DrawLine(borderPen, borders[3], borders[0]); + + Gfx.DrawLine(borderPen, _resizer.Point(x, y + _weekEventHeaderHeight), _resizer.Point(x + width, y + _weekEventHeaderHeight)); + + textFormatter.Alignment = XParagraphAlignment.Center; + textFormatter.DrawString(headerText, F1, headTxtBrush, _resizer.Rect(x, textY, width, _weekEventHeaderHeight)); + + textFormatter.Alignment = defAlign; + + textFormatter.DrawString(bodyTxt, F1, bodyTxtBrush, _resizer.Rect(bodyTextX, bodyTextY, bodyTextWidth, bodyTextHeight)); + + } + + // preparing scheme to calculate multiday position + var cols = Parser.WeekColsParsing(CurrentPage); + var scheme = new int[cols[0].Length]; + for (var i = 0; i < scheme.Length; i++) + scheme[i] = 0; + + events = page.Multiday; + var offset = 1; + for (var i = 0; i < events.Count; i++) + { + var ev = events[i]; + var day = ev.Day; + var len = ev.Len; + var text = ev.Text; + var bgColor = ev.BackgroundColor; + var color = ev.Color; + + var width = len * _weekDayWidth - 2 * offset; + var height = _monthEventHeight; + var x = _offsetLeft + _leftScaleWidth + day + * _weekDayWidth + offset; + var y = _offsetTop + _headHeight + scheme[day] + * _multidayLineHeight; + + var cont = _resizer.Rect(x, y, width, height); + var evBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(bgColor, eventColor))); + + F1 = new XFont(F1.FontFamily.Name, BaseFontSize); + var txtX = x + _cellOffset; + var txtY = y + (_weekEventHeaderHeight - F1.Size) / 2; + var textBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + Gfx.DrawRectangle(evBrush, cont); + var borders = new XPoint[4]; + borders[0] = _resizer.Point(x, y); + borders[1] = _resizer.Point(x + width, y); + borders[2] = _resizer.Point(x + width, y + height); + borders[3] = _resizer.Point(x, y + height); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[3], borders[0]); + textFormatter.DrawString(text, F1, textBrush, _resizer.Rect(txtX, txtY, width, height)); + for (var j = day; j < day + len; j++) + scheme[j]++; + } + } + + private void WeekBwBordersDraw() + { + var borderColor = RGBColor.GetColor(_lineColor); + + var x = _offsetLeft; + var y = _offsetTop; + Line(borderColor, x + _leftScaleWidth, y, x + _pageWidth, + y); + + if (_multiHeight > 0) + { + y = _offsetTop + _headerHeight - _multiHeight; + Line(borderColor, x + _leftScaleWidth, y, x + + _pageWidth, y); + Line(borderColor, x, y, x, y + _pageHeight + - (_headerHeight - _multiHeight)); + } + + y = _offsetTop + _headerHeight; + Line(borderColor, x, y, x + _pageWidth, y); + + y = _offsetTop + _pageHeight; + Line(borderColor, x, y, x + _pageWidth, y); + + x = _offsetLeft + _leftScaleWidth; + Line(borderColor, x, y, x, y + _headerHeight); + + x = _offsetLeft + _pageWidth; + Line(borderColor, x, y, x, y + _headerHeight); + + } + + private void Line(double[] color, double x1, double y1, double x2, double y2) + { + Gfx.DrawLine(new XPen(RGBColor.GetXColor(color), BorderWidth), _resizer.Point(x1, y1), _resizer.Point(x2, y2)); + } + private void Line(double[] color, double x1, double y1, double x2, double y2, XRect cell) + { + Gfx.DrawLine(new XPen(RGBColor.GetXColor(color), BorderWidth), _resizer.Point(cell.Location.X + x1, cell.Location.Y + y1), _resizer.Point(cell.Location.X + x2, cell.Location.Y + y2)); + } + + private void _drawTimelineContainerPart(string[] rows) + { + var headerLineColor = RGBColor.GetColor(_headerLineColor); + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + var width = _leftScaleWidth; + var height = TimelineRowMinHeight; + for (var i = 0; i < rows.Length; i++) + { + var cell = _resizer.Rect(x, y, width, height); + var cellBrush = new XSolidBrush(RGBColor.GetXColor(_bgColor)); + + var scaleOne = _resizer.Rect(x + width, y, _pageWidth - width, height); + var scaleOneBrush = new XSolidBrush(RGBColor.GetXColor(_scaleOneColor)); + + Gfx.DrawRectangle(cellBrush, cell); + Gfx.DrawRectangle(scaleOneBrush, scaleOne); + + Line(headerLineColor, x, y, x + width, y); + + var text = TextWrap(rows[i], width - 2 * _cellOffset, F1, TrimLayoutStrings); + var textX = x + (width - Gfx.MeasureString(text, F1).Width) / 2; + var textY = y + (height + F1.Size) / 2; + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + + y += height; + } + } + + + private double _getPadding(TreeTimelineCategory row) + { + double levelPadding = 0.0; + for (var lev = 0; lev < row.Level; lev++) + { + levelPadding += Gfx.MeasureString("ww", F1).Width; + } + if (row.IsExpandable) + levelPadding -= Gfx.MeasureString("+ ", F1).Width; + if (levelPadding < 0) + levelPadding = 0.0; + return levelPadding; + } + private void _drawTreeLevelScales(string[] rows) + { + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + var width = _leftScaleWidth; + var height = (_pageHeight - _headerHeight) / rows.Length; + var pars = new TreeTimelineParser(); + F1 = new XFont(F1.FontFamily.Name, F1.Size, XFontStyle.Bold); + for (var i = 0; i < rows.Length; i++) + { + + var row = pars.Parse(rows[i]); + if (row.IsExpandable) + { + var levelPadding = _getPadding(row); + var scaleOne = _resizer.Rect(x + width, y, _pageWidth - width, height); + var scaleOneBrush = new XSolidBrush(RGBColor.GetXColor(_timelineTreeColor)); + + + Gfx.DrawRectangle(scaleOneBrush, scaleOne); + + + var textX = levelPadding + x; + var textY = y + (height + F1.Size) / 2; + var text = (row.Expanded ? " - " : " + ") + row.Text; + text = TextWrap(text, _pageWidth, F1, TrimLayoutStrings); + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + } + y += height; + } + F1 = new XFont(F1.FontFamily.Name, F1.Size, XFontStyle.Regular); + } + private void _drawTreeTimelineContainerPart(string[] rows) + { + var headerLineColor = RGBColor.GetColor(_headerLineColor); + var y = _offsetTop + _headerHeight; + var width = _leftScaleWidth; + var height = (_pageHeight - _headerHeight) / rows.Length; + + var pars = new TreeTimelineParser(); + + for (var i = 0; i < rows.Length; i++) + { + var x = _offsetLeft; + var row = pars.Parse(rows[i]); + + var levelPadding = _getPadding(row); + + XRect cell; + XBrush cellBrush; + + if (row.IsExpandable) + { + F1 = new XFont(F1.FontFamily.Name, F1.Size, XFontStyle.Bold); + cell = _resizer.Rect(x, y, width, height); + cellBrush = new XSolidBrush(RGBColor.GetXColor(_timelineTreeColor)); + Gfx.DrawRectangle(cellBrush, cell); + } + else + { + F1 = new XFont(F1.FontFamily.Name, F1.Size, XFontStyle.Regular); + + cell = _resizer.Rect(x, y, width, height); + cellBrush = new XSolidBrush(RGBColor.GetXColor(_bgColor)); + + var scaleOne = _resizer.Rect(x + width, y, _pageWidth - width, height); + var scaleOneBrush = new XSolidBrush(RGBColor.GetXColor(_scaleOneColor)); + + var text = TextWrap(row.Text, width - 2 * _cellOffset - levelPadding, F1, TrimLayoutStrings); + var textX = levelPadding + x; + var textY = y + (height + F1.Size) / 2; + Gfx.DrawRectangle(cellBrush, cell); + Gfx.DrawRectangle(scaleOneBrush, scaleOne); + Gfx.DrawString(text, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(textX, textY)); + } + + Line(headerLineColor, x, y, x + width, y); + + y += height; + } + + } + + private void TimelineContainerDraw(string[] rows) + { + var borderColor = RGBColor.GetColor(_lineColor); + + var isTree = false; + if (rows.Length > 0) + { + isTree = TreeTimelineParser.IsTreeRow(rows[0]); + } + + if (isTree) + { + _drawTreeTimelineContainerPart(rows); + } + else + { + _drawTimelineContainerPart(rows); + } + + var cols = Parser.WeekColsParsing(CurrentPage); + var width = double.MaxValue; + var height = TimelineRowMinHeight; + _weekDayHeight = height; + var colCount = -1; + for (var i = 0; i < cols.Length; i++) + { + var scale = (_pageWidth - _leftScaleWidth) / cols[i].Length; + if (width > scale) + width = scale; + if (colCount < cols[i].Length) + colCount = cols[i].Length; + } + + var x = _offsetLeft + _leftScaleWidth; + var y = _offsetTop + _headerHeight; + + var colHeight = height * rows.Length + _offsetTop + _headerHeight; + for (var i = 0; i < colCount; i++) + { + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), + _resizer.Point(x, y), _resizer.Point(x, colHeight)); + + x += width; + } + + if (isTree) + _drawTreeLevelScales(rows); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), + _resizer.Point(_offsetLeft + _leftScaleWidth, y), _resizer.Point(_offsetLeft + _leftScaleWidth + width, y)); + + y = _offsetTop + _headerHeight + height; + for (var i = 0; i < rows.Length; i++) + { + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), + _resizer.Point(_offsetLeft + _leftScaleWidth, y), _resizer.Point(_offsetLeft + _pageWidth, y)); + y += height; + } + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), + _resizer.Point(_offsetLeft + _leftScaleWidth, _offsetTop + _headerHeight), + _resizer.Point(_offsetLeft + _pageWidth, _offsetTop + _headerHeight)); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), + _resizer.Point(x, _offsetTop), + _resizer.Point(x, colHeight)); + } + + private void MatrixContainerDraw(PDFPage page) + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_lineColor); + var headerLineColor = RGBColor.GetColor(_headerLineColor); + var matrixEventColor = RGBColor.GetColor(_matrixEventColor); + var textColor = RGBColor.GetColor(_textColor); + var rows = Parser.WeekRowsParsing(CurrentPage); + var height = (_pageHeight - _headerHeight) / rows.Length; + var cols = Parser.WeekColsParsing(CurrentPage); + var events = page.Events; + var columns = cols[0]; + for (var i = 0; i < rows.Length; i++) + { + for (var j = 0; j <= columns.Length; j++) + { + var ev = events[i * (columns.Length + 1) + j]; + var evBgColor = ev.BackgroundColor; + var evTextColor = ev.Color; + var text = ev.Text; + var x = _offsetLeft + Math.Max(j - 1, 0) + * _weekDayWidth + (j != 0 ? 1 : 0) + * _leftScaleWidth; + var y = _offsetTop + _headerHeight + i * height; + + var width = (j == 0) ? _leftScaleWidth : _weekDayWidth; + + + var cell = _resizer.Rect(x, y, width, height); + var cellBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(evBgColor, matrixEventColor))); + + + + if (j == 0) + cellBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + Gfx.DrawRectangle(cellBrush, cell); + + + // draw cell text + F1 = new XFont(F1.FontFamily.Name, (j == 0) ? BaseFontSize : 8.4); + var txt = TextWrap(text, width - 2 * _cellOffset, F1, TrimContentStrings); + var textX = x + (width - Gfx.MeasureString(txt, F1).Width) / 2; + var textY = y + (height - F1.Size) / 2; + var txtBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(evTextColor, textColor))); + + Gfx.DrawString(txt, F1, txtBrush, _resizer.Point(textX, textY)); + + // draw borders + if (j == 0) + { + Line(headerLineColor, x, y, x + width, y); + } + else + { + Line(borderColor, x, y, x + width, y); + Line(borderColor, x, y, x, y + height); + } + } + } + + // border right + Line(borderColor, _offsetLeft + _pageWidth, _offsetTop, _offsetLeft + _pageWidth, _offsetTop + + _pageHeight); + + Line(borderColor, _offsetLeft, _offsetTop + _pageHeight, _offsetLeft + _pageWidth, _offsetTop + + _pageHeight); + } + + private void TimelineEventsDraw(PDFPage page, int pageNumber, int blocksNumber) + { + var eventBorderColor = RGBColor.GetColor(_eventBorderColor); + var eventColor = RGBColor.GetColor(_eventColor); + var textColor = RGBColor.GetColor(_eventTextColor); + var events = page.Events; + + var offset = 1; + for (var i = 0; i < events.Count; i++) + { + var ev = events[i]; + var text = ev.Text; + var bgColor = ev.BackgroundColor; + var color = ev.Color; + + if (ev.Week >= pageNumber * blocksNumber) continue; + if (ev.Week < (pageNumber - 1) * blocksNumber) continue; + + var x = _offsetLeft + _leftScaleWidth + ev.X + * _weekDayWidth / 100 + offset; + var y = _offsetTop + _headerHeight + ev.Y + * _weekDayHeight / 100 + ((ev.Week - (pageNumber - 1) * blocksNumber) + * _weekDayHeight); + + var width = ev.Width * _weekDayWidth / 100; + var height = _monthEventHeight; + + var cell = _resizer.Rect(x, y, width, height); + + var cellBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(bgColor, eventColor))); + + F1 = new XFont(F1.FontFamily.Name, BaseFontSize); + var txt = TextWrap(text, width, F1, TrimContentStrings); + var txtX = x + _cellOffset; + var txtY = y + (_weekEventHeaderHeight + F1.Size) / 2; + var txtBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + + Gfx.DrawRectangle(cellBrush, cell); + + var borders = new XPoint[4]; + borders[0] = _resizer.Point(x, y); + borders[1] = _resizer.Point(x + width, y); + borders[2] = _resizer.Point(x + width, y + height); + borders[3] = _resizer.Point(x, y + height); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(eventBorderColor), BorderWidth), borders[3], borders[0]); + + Gfx.DrawString(txt, F1, txtBrush, _resizer.Point(txtX, txtY)); + } + } + + private void YearDraw(PDFPage page) + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_lineColor); + var headerLineColor = RGBColor.GetColor(_headerLineColor); + var textColor = RGBColor.GetColor(_textColor); + var eventColor = RGBColor.GetColor(_eventColor); + var yearDayActiveColor = RGBColor.GetColor(_yearDayActiveColor); + var yearDayInactiveColor = RGBColor.GetColor(_yearDayInactiveColor); + var monthes = Parser.YearParsing(CurrentPage); + var events = page.Events; + var width = (_pageWidth - _yearMonthOffsetLeft * 3) / 4; + var height = (_pageHeight - _yearMonthOffsetTop * 2) / 3; + var monthX = _offsetLeft; + var monthY = _offsetTop; + for (var i = 0; i < 3; i++) + { + for (var j = 0; j < 4; j++) + { + var mon = monthes[i * 4 + j]; + var label = mon.GetLabel(); + var rows = mon.GetRows(); + var onlyDays = mon.GetOnlyDays(); + + var monthCont = _resizer.Rect(monthX, monthY, width, height); + var monthContBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + + + var labelText = TextWrap(label, width, F1, TrimLayoutStrings); + var labelTextX = monthX + (width - Gfx.MeasureString(label, F1).Width) / 2; + var labelTextY = monthY + (_yearMonthLabelHeight + F1.Size) / 2; + var labelTextBrush = new XSolidBrush(RGBColor.GetXColor(textColor)); + + Gfx.DrawRectangle(monthContBrush, monthCont); + Gfx.DrawString(labelText, F1, labelTextBrush, _resizer.Point(labelTextX, labelTextY)); + + + var cellWidth = width / 7; + var cellHeight = (height - _yearMonthLabelHeight) + / rows.GetLength(0); + var cellX = monthX; + var cellY = monthY + _yearMonthLabelHeight; + for (var k = 0; k < rows.GetLength(0); k++) + { + for (var l = 0; l < 7; l++) + { + + var cell = _resizer.Rect(cellX, cellY, cellWidth, cellHeight); + XBrush cellBrush; + + var ind = GetEventIndex(events, l, k - 1, i * 4 + j); + if (k == 0) + { + cellBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + } + else + { + if (GetActiveDay(onlyDays, k - 1, l)) + { + if (ind == -1) + { + cellBrush = new XSolidBrush(RGBColor.GetXColor(yearDayActiveColor)); + } + else + { + var ev = events[ind]; + var color = ev.BackgroundColor; + cellBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, eventColor))); + + } + } + else + { + cellBrush = new XSolidBrush(RGBColor.GetXColor(yearDayInactiveColor)); + + } + } + Gfx.DrawRectangle(cellBrush, cell); + + if (k == 0) + Line(headerLineColor, 0, 0, cellWidth, 0, + cell); + else + Line(borderColor, 0, 0, cellWidth, 0, cell); + if (l > 0) + if (k == 0) + Line(headerLineColor, 0, 0, 0, + cellHeight, cell); + else + Line(borderColor, 0, 0, 0, cellHeight, + cell); + + var cellText = rows[k, l]; + var cellTextX = cellX + (cellWidth - Gfx.MeasureString(cellText, F1).Width) / 2; + var cellTextY = cellY + (cellHeight + F1.Size) / 2; + XSolidBrush evBrush; + + if (ind > -1) + { + var ev = events[ind]; + var color = ev.Color; + evBrush = new XSolidBrush(RGBColor.GetXColor(SelectColor(color, textColor))); + + } + else + evBrush = new XSolidBrush(RGBColor.GetXColor(textColor)); + Gfx.DrawString(cellText, F1, evBrush, _resizer.Point(cellTextX, cellTextY)); + cellX += cellWidth; + } + cellX = monthX; + cellY += cellHeight; + } + if (_profile == ColorProfile.BW) + { + Line(headerLineColor, 0, 0, 0, height, monthCont); + Line(headerLineColor, 0, 0, width, 0, monthCont); + Line(headerLineColor, 0, height, width, height, + monthCont); + Line(headerLineColor, width, 0, width, height, + monthCont); + } + monthX += _yearMonthOffsetLeft + width; + } + monthX = _offsetLeft; + monthY += _yearMonthOffsetTop + height; + } + } + + private void AgendaHeaderDraw() + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_headerLineColor); + var textColor = RGBColor.GetColor(_textColor); + var cols = Parser.AgendaColsParsing(CurrentPage); + + var width = _pageWidth; + var height = _headerHeight; + var x = _offsetLeft; + var y = _offsetTop; + + var headerBg = _resizer.Rect(x, y, width, height); + + var monthContBrush = new XSolidBrush(RGBColor.GetXColor(bgColor)); + Gfx.DrawRectangle(monthContBrush, headerBg); + + var dateWidth = _agendaColOneWidth; + var nameWidth = width - _agendaColOneWidth; + + var sep = new[] { _resizer.Point(x + dateWidth, y), _resizer.Point(x + dateWidth, y + _headerHeight) }; + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), 0.3), sep[0], sep[1]); + + + F1 = new XFont(F1.FontFamily.Name, BaseFontSize); + var dateText = cols[0]; + + var textBrush = new XSolidBrush(RGBColor.GetXColor(textColor)); + var dateTextX = x + (dateWidth - Gfx.MeasureString(dateText, F1).Width) / 2; + var dateTextY = y + (height + F1.Size) / 2; + Gfx.DrawString(dateText, F1, textBrush, _resizer.Point(dateTextX, dateTextY)); + + + + var nameText = cols[1]; + var nameTextX = x + dateWidth + (nameWidth - Gfx.MeasureString(nameText, F1).Width) / 2; + var nameTextY = y + (height + F1.Size) / 2; + Gfx.DrawString(nameText, F1, textBrush, _resizer.Point(nameTextX, nameTextY)); + + + var borders = new[]{ + _resizer.Point(x, y), + _resizer.Point(x + width, y), + _resizer.Point(x + width, y + height), + _resizer.Point(x, y + height)}; + Gfx.DrawLine(new XPen(RGBColor.GetXColor(_lineColor), 0.3), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(_lineColor), 0.3), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(_lineColor), 0.3), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(_lineColor), 0.3), borders[3], borders[0]); + + } + + private void AgendaEventDraw(PDFPage page) + { + var scaleOneColor = RGBColor.GetColor(_scaleOneColor); + var scaleTwoColor = RGBColor.GetColor(_scaleTwoColor); + var borderColor = RGBColor.GetColor(_lineColor); + var textColor = RGBColor.GetColor(_textColor); + var events = page.Events; + var width = _pageWidth; + var height = _headerHeight; + var x = _offsetLeft; + var y = _offsetTop + _headerHeight; + + var linePen = new XPen(RGBColor.GetXColor(_eventBorderColor), BorderWidth); + + F1 = new XFont(F1.FontFamily.Name, BaseFontSize); + for (var i = 0; i < events.Count; i++) + { + if (y + height > _offsetTop + _pageHeight) + { + + Gfx.DrawLine(linePen, _resizer.Point(x, y), _resizer.Point(x + width, y)); + + + Page = NewPage(PageOrientation.Portrait, PageSize.A4); + + AgendaHeaderDraw(); + y = _offsetTop + _headerHeight; + } + + + + var headerCont = _resizer.Rect(x, y, width, height); + XBrush headerBrush; + if (i % 2 == 0) + { + headerBrush = new XSolidBrush(RGBColor.GetXColor(scaleOneColor)); + } + else + { + headerBrush = new XSolidBrush(RGBColor.GetXColor(scaleTwoColor)); + } + + var dateWidth = _agendaColOneWidth; + + Gfx.DrawRectangle(headerBrush, headerCont); + + var borders = new[]{ + _resizer.Point(x, y), + _resizer.Point(x + dateWidth, y), + _resizer.Point(x + dateWidth, y + height), + _resizer.Point(x, y + height)}; + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[3], borders[0]); + + var headerText = events[i].HeaderAgendaText; + var text = events[i].Text; + + var textBrush = new XSolidBrush(RGBColor.GetXColor(textColor)); + + var dateTextX = x + (dateWidth - Gfx.MeasureString(headerText, F1).Width) / 2; + var dateTextY = y + (height + F1.Size) / 2; + Gfx.DrawString(headerText, F1, textBrush, _resizer.Point(dateTextX, dateTextY)); + + + + var nameTextX = x + dateWidth + _cellOffset; + var nameTextY = y + (height + F1.Size) / 2; + Gfx.DrawString(text, F1, textBrush, _resizer.Point(nameTextX, nameTextY)); + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), _resizer.Point(x, y), _resizer.Point(x, y + height)); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), _resizer.Point(x, y), _resizer.Point(x + width, y)); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), _resizer.Point(x + width, y), _resizer.Point(x + width, y + height)); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), _resizer.Point(x + dateWidth, y), _resizer.Point(x + dateWidth, y + height)); + + + y += height; + } + + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), _resizer.Point(x, y), _resizer.Point(x + width, y)); + + + } + + private void PrintFooter() + { + if (CurrentPage.Footer) + { + var im = Images.Get(FooterImgPath); + if (im != null) + { + Gfx.DrawImage(im, _resizer.Point(_offsetLeft, _pageHeight + _offsetTop - FooterImgHeight)); + _pageHeight -= FooterImgHeight; + _offsetBottom += FooterImgHeight; + } + } + } + + private void AgendaPagesDraw() + { + for (var i = 1; i <= Pages.Count; i++) + { + var graph = Graphics[i - 1]; + if (_profile == ColorProfile.BW + && CurrentPage.Mode != "month") + MonthBwBordersDraw(); + var str = _pageNumTemplate; + str = str.Replace("{pageNum}", i.ToString()); + str = str.Replace("{allNum}", Pages.Count.ToString()); + + var text = new XTextFormatter(graph); + var x = _pageWidth + _offsetLeft - graph.MeasureString(str, F1).Width; + + var y = _pageHeight + _offsetTop + F1.Size; + if (CurrentPage.Footer && Images.Get(FooterImgPath) != null) + y += FooterImgHeight; + + text.DrawString(str, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Rect(x, y, graph.MeasureString(str, F1).Width, F1.Size)); + } + + } + + + private void WeekAgendaContainerDraw() + { + var cols = Parser.AgendaColsParsing(CurrentPage); + var x = _offsetLeft; + var contWidth = (_pageWidth) / 2; + var contHeight = (_pageHeight) / 3; + _contWidth = contWidth; + _contHeight = contHeight; + + + for (var i = 0; i < 3; i++) + { + var y = _offsetTop + contHeight * i; + WeekAgendarDayDraw(cols[i], contWidth, contHeight, x, y); + } + x += contWidth; + for (var i = 0; i < 2; i++) + { + var y = _offsetTop + contHeight * i; + WeekAgendarDayDraw(cols[i + 3], contWidth, contHeight, x, y); + } + + var tallContHeight = contHeight / 2; + for (var i = 0; i < 2; i++) + { + var y = _offsetTop + contHeight * 2 + tallContHeight * i; + WeekAgendarDayDraw(cols[i + 5], contWidth, tallContHeight, x, y); + } + var headerLineColor = RGBColor.GetColor(_headerLineColor); + for (var i = 0; i < 3; i++) + { + var y = _offsetTop + contHeight * i; + Line(headerLineColor, x, y, x, y + _monthDayHeaderHeight); + } + } + + private void WeekAgendarDayDraw(string name, double width, double height, double x, double y) + { + var bgColor = RGBColor.GetColor(_bgColor); + var borderColor = RGBColor.GetColor(_lineColor); + var textColor = RGBColor.GetColor(_textColor); + F1 = new XFont(F1.FontFamily.Name, WeekAgendarDayFont); + var dayCont = _resizer.Rect(x, y, width, height); + + var borders = new[]{ + _resizer.Point(x, y), + _resizer.Point(x + width, y), + _resizer.Point(x + width, y + height), + _resizer.Point(x, y + height)}; + Gfx.DrawLine(new XPen(RGBColor.GetXColor(bgColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(bgColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(bgColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(bgColor), BorderWidth), borders[3], borders[0]); + + Line(borderColor, 0, 0, width, 0, dayCont); + Line(borderColor, 0, 0, 0, height, dayCont); + Line(borderColor, width, 0, width, height, dayCont); + Line(borderColor, 0, height, width, height, dayCont); + + var labelCont = _resizer.Rect(x, y, width, _monthDayHeaderHeight); + Gfx.DrawRectangle(new XSolidBrush(RGBColor.GetXColor(bgColor)), labelCont); + + var txt = name; + x = x + _cellOffset + (width - _cellOffset - Gfx.MeasureString(name, F1).Width) / 2; + y = y + (_monthDayHeaderHeight + F1.Size) / 2; + Gfx.DrawString(txt, F1, new XSolidBrush(RGBColor.GetXColor(textColor)), _resizer.Point(x, y)); + } + + private SchedulerEvent[] WeekAgendaEventsDraw(SchedulerEvent[] events) + { + var borderColor = RGBColor.GetColor(_lineColor); + var textColor = RGBColor.GetColor(_textColor); + var offsets = new int[7]; + for (var i = 0; i < offsets.Length; i++) + offsets[i] = 0; + var rest = new List<SchedulerEvent>(); + + for (var i = 0; i < events.Length; i++) + { + var ev = events[i]; + var day = ev.Day; + var contHeight = (day < 5) ? _contHeight : _contHeight / 2; + var contWidth = _contWidth; + double x; + switch (day) + { + case 0: + case 2: + case 4: + x = _offsetLeft; + break; + default: + x = _offsetLeft + contWidth; + break; + } + var contStartY = _offsetTop + Math.Floor(day / 2.0) * _contHeight - (day > 5 ? contHeight : 0); + var offset = offsets[day] * _weekAgendaEventHeight; + var y = contStartY + _monthDayHeaderHeight + offset; + + if (contStartY + contHeight < y + _weekAgendaEventHeight) + { + rest.Add(ev); + continue; + } + + + var borders = new[]{ + _resizer.Point(x, y), + _resizer.Point(x + _contWidth, y), + _resizer.Point(x + _contWidth, y + _weekAgendaEventHeight), + _resizer.Point(x, y + _weekAgendaEventHeight)}; + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[0], borders[1]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[1], borders[2]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[2], borders[3]); + Gfx.DrawLine(new XPen(RGBColor.GetXColor(borderColor), BorderWidth), borders[3], borders[0]); + + F1 = new XFont(F1.FontFamily.Name, 9); + + x = x + _cellOffset; + y = y + (_weekAgendaEventHeight + F1.Size) / 2; + Gfx.DrawString(ev.Text, F1, new XSolidBrush(RGBColor.GetXColor(textColor)), _resizer.Point(x, y)); + + offsets[day]++; + } + var eventsList = new SchedulerEvent[rest.Count]; + for (var i = 0; i < rest.Count; i++) + eventsList[i] = rest[i]; + return eventsList; + } + + private void TodayLabelDraw() + { + var g1 = Graphics[0]; + TodayLabelDraw(g1); + } + + private void TodayLabelDraw(XGraphics p1) + { + F1 = new XFont(F1.FontFamily.Name, 10); + + var today = CurrentPage.TodayLabel; + var todayText = today; + var todayX = _offsetLeft; + var todayY = _offsetTop - _cellOffset; + p1.DrawString(todayText, F1, new XSolidBrush(RGBColor.GetXColor(_textColor)), _resizer.Point(todayX, todayY)); + } + + private int GetEventIndex(IList<SchedulerEvent> events, int day, int week, int month) + { + for (var i = 0; i < events.Count; i++) + { + var evDay = events[i].Day; + var evWeek = events[i].Week; + var evMonth = events[i].Month; + if ((evDay == day) && (evWeek == week) && (evMonth == month)) + { + return i; + } + } + return -1; + } + + private bool GetActiveDay(string[,] rows, int row, int col) + { + bool flag; + var flagCount = 0; + if (int.Parse(rows[0, 0]) == 1) + { + flag = true; + flagCount = 1; + } + else + { + flag = false; + } + + var prevDay = int.Parse(rows[0, 0]); + for (var i = 0; i < rows.Length; i++) + { + for (var j = 0; j < rows.GetLength(1); j++) + { + if (int.Parse(rows[i, j]) < prevDay && flagCount < 2) + { + flag = !flag; + flagCount++; + } + if (i == row && j == col) + { + return flag; + } + prevDay = int.Parse(rows[i, j]); + } + } + return flag; + } + + public string GetView() + { + return _view; + } + + + + private void PrintHeader() + { + if (CurrentPage.Header) + { + var im = Images.Get(HeaderImgPath); + if (im != null) + { + Gfx.DrawImage(im, _resizer.Point(_offsetLeft, _offsetTop)); + _pageHeight -= HeaderImgHeight; + _offsetTop += HeaderImgHeight; + } + } + } + + public void SetWatermark(string mark) + { + _watermark = mark; + } + } +}
\ No newline at end of file |