public Image DrawSchema(out CoordsMaps coordsMaps, int colHeight, DateTime startDate, DateTime endDate, RowsFlags Pflags) { System.Globalization.CultureInfo UICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; System.Globalization.Calendar cal = UICulture.Calendar; ganttStart = startDate; ganttEnd = endDate; int days = endDate.Subtract(startDate).Days; int rowCount = 0; if ((Pflags & RowsFlags.NoYears) != RowsFlags.NoYears) { yearRow = (rowCount++) * rowsSize + top; } int startYear = startDate.Year; int firstColYear = 0; if ((Pflags & RowsFlags.NoMonths) != RowsFlags.NoMonths) { monthRow = (rowCount++) * rowsSize + top; } int startMonth = startDate.Month; int firstColMonth = 0; if ((Pflags & RowsFlags.NoWeeks) != RowsFlags.NoWeeks) { weekRow = (rowCount++) * rowsSize + top; } int startWeek = cal.GetWeekOfYear(startDate, UICulture.DateTimeFormat.CalendarWeekRule, UICulture.DateTimeFormat.FirstDayOfWeek); int firstColWeek = 0; if ((Pflags & RowsFlags.NoDays) != RowsFlags.NoDays) { dayRow = (rowCount++) * rowsSize + top; } this.ganttHeight = colHeight + dayRow + 1; Image img = new Bitmap(days * dayColumnSize + 1, this.ganttHeight); g = Graphics.FromImage(img); g.Clear(Color.White); SolidBrush brush = new SolidBrush(Color.Black); SolidBrush dayBrush = new SolidBrush(Color.LightGray); SolidBrush weekendBrush = new SolidBrush(Color.DarkGray); sf = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap | StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.MeasureTrailingSpaces); Font yearFont = FontToFitVertical(new FontFamily("Arial"), FontStyle.Regular, rowsSize, sf); monthFont = FontToFitVertical(new FontFamily("Arial"), FontStyle.Regular, rowsSize, sf); descFont = FontToFitVertical(new FontFamily("Arial"), FontStyle.Regular, rowsSize, sf); descFontBold = FontToFitVertical(new FontFamily("Arial"), FontStyle.Bold, rowsSize, sf); monthDayFont = FontToFitHorizontal(new FontFamily("Arial"), FontStyle.Regular, dayColumnSize, sf); Pen pen = new Pen(Color.DarkGray, 1F); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; int dayLeft = 0; Rectangle ra = new Rectangle(); CoordsMaps cm = new CoordsMaps(); for (int i = 0; i <= days; i++) { int currentPixel = i * dayColumnSize; DateTime todayDate = cal.AddDays(startDate, i); if (yearRow != -1 && (todayDate.Year != startYear || i == days)) { ra = new Rectangle(left + firstColYear, yearRow, currentPixel - firstColYear, rowsSize); g.DrawRectangle(pen, ra); g.DrawString(startYear.ToString(), monthFont, brush, ra, sf); cm.Add(new CoordsMap(RowTypes.Years, ra, startYear)); startYear = todayDate.Year; firstColYear = currentPixel; } if (monthRow != -1 && (todayDate.Day == 1 || i == days)) { ra = new Rectangle(left + firstColMonth, monthRow, currentPixel - firstColMonth, rowsSize); string month = UICulture.DateTimeFormat.GetMonthName(startMonth); if (yearRow == -1) { month += " " + todayDate.Year; } g.DrawRectangle(pen, ra); if (g.MeasureString(month, monthFont, 100000, sf).Width < ra.Width + 4) { g.DrawString(month, monthFont, brush, ra, sf); } else if (g.MeasureString(UICulture.DateTimeFormat.GetMonthName(startMonth), monthFont, 100000, sf).Width < ra.Width + 4) { g.DrawString(UICulture.DateTimeFormat.GetMonthName(startMonth), monthFont, brush, ra, sf); } cm.Add(new CoordsMap(RowTypes.Months, ra, startMonth)); startMonth = todayDate.Month; firstColMonth = currentPixel; } if (weekRow != -1 && (todayDate.DayOfWeek == UICulture.DateTimeFormat.FirstDayOfWeek || i == days)) { ra = new Rectangle(left + firstColWeek, weekRow, currentPixel - firstColWeek, rowsSize); g.DrawRectangle(pen, ra); g.DrawString(startWeek.ToString(), monthFont, brush, ra, sf); cm.Add(new CoordsMap(RowTypes.Weeks, ra, startWeek)); startWeek++; firstColWeek = currentPixel; } if (dayRow != -1 && i != days) { ra = new Rectangle(left + dayLeft, dayRow, dayColumnSize, rowsSize); dayLeft += (dayColumnSize); Rectangle r = ra; r.Height = colHeight; if (todayDate.DayOfWeek == DayOfWeek.Sunday || todayDate.DayOfWeek == DayOfWeek.Saturday) { g.FillRectangle(dayBrush, r); } g.DrawRectangle(pen, r); cm.Add(new CoordsMap(RowTypes.Days, r, i)); g.DrawString(cal.GetDayOfMonth(todayDate).ToString(), monthDayFont, brush, ra, sf); Rectangle r2 = ra; r2.Y += monthDayFont.Height; g.DrawString(UICulture.DateTimeFormat.GetShortestDayName(cal.GetDayOfWeek(todayDate)).ToUpper().Substring(0, 1), monthDayFont, brush, r2, sf); if (todayDate.ToShortDateString() == DateTime.Now.ToShortDateString()) { g.DrawLine(new Pen(Color.Red), currentPixel, dayRow, currentPixel, dayRow + colHeight); } } } dayRow += monthDayFont.Height; coordsMaps = cm; return(img); }
public Image DrawLegend(ref CoordsMaps coordsMaps, string[][] labels, int startRow) { Bitmap outBmp = new Bitmap(1, 1); for (int i = 0; i < labels.Length; i++) { int tempStartRow = startRow; Bitmap bmp = new Bitmap(1, 1); Graphics graphic = System.Drawing.Graphics.FromImage(bmp); SolidBrush brush = new SolidBrush(Color.Black); int margins = 5; sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Near; graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; int width = 0; foreach (string label in labels[i]) { int testWidth = Convert.ToInt32(graphic.MeasureString(label, descFont, new PointF(0, 0), sf).Width); if (testWidth > width) { width = testWidth; } if (width > maxLegendWidth) { width = maxLegendWidth; break; } } width += Convert.ToInt32(0.05 * width) + margins * 2; Rectangle ra = new Rectangle(0, 0, width - 1, ganttHeight - 1); bmp = new Bitmap(width, ganttHeight); graphic = System.Drawing.Graphics.FromImage(bmp); graphic.Clear(Color.White); Pen pen = new Pen(Color.DarkGray, 1F); graphic.DrawRectangle(pen, ra); Regex rx = new Regex(@"\{([PSE])(\d{2})\}"); Match m; int height = rowsSize + rowSpace; for (int j = 0; j < labels[0].Length; j++) { Rectangle r = new Rectangle(0, dayRow + (tempStartRow++ *height) - rowSpace, width, height); graphic.DrawLine(pen, 0, r.Y, width, r.Y); if (labels[i].Length <= j) { continue; } PointF point = new PointF(margins, r.Y + rowSpace); if ((m = rx.Match(labels[i][j])).Success) { point.X += 3 * int.Parse(m.Groups[2].ToString()); switch (m.Groups[1].ToString()) { case "P": graphic.DrawImage(Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Digita.Tustena.Project.Resources.project.png")), point); break; case "S": graphic.DrawImage(Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Digita.Tustena.Project.Resources.section.png")), point); break; case "E": graphic.DrawImage(Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Digita.Tustena.Project.Resources.event.png")), point); break; } point.X += 15; labels[i][j] = labels[i][j].Replace(m.Groups[0].ToString(), ""); } if (tempStartRow == 1) { graphic.DrawString(labels[i][j].Replace("\n", ""), descFontBold, brush, point, sf); } else { graphic.DrawString(labels[i][j].Replace("\n", ""), descFont, brush, point, sf); } if (i == 0) { coordsMaps.Add(new CoordsMap(RowTypes.Legend, r, labels[i][j])); } } if (labels.Length == 1) { return(bmp); } outBmp = AppendImage(outBmp, bmp); graphic.DrawLine(pen, 0, dayRow + (tempStartRow * height), width, dayRow + (tempStartRow * height)); } return(outBmp); }