Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }