using System; using System.Windows.Forms; using System.IO; using System.Web.UI; using System.Drawing; using System.Drawing.Imaging; using TheArtOfDev.HtmlRenderer.WinForms; namespace AdvertsingProfitControl { internal class FrontPageGenerator { FrmLogConsole _console = FrmLogConsole.GetStaticInstance; public void RenderHtmlToImage() { var htmlCode = File.ReadAllLines(Application.StartupPath + "\\FrontPage.html"); var code = ""; foreach (var line in htmlCode) { code = code + "\r\n" + line; } try { var imageFromHtml = HtmlRender.RenderToImage(code); imageFromHtml.RotateFlip(RotateFlipType.Rotate90FlipNone); imageFromHtml.Save(Application.StartupPath + "\\FrontPage.png", ImageFormat.Png); imageFromHtml.Dispose(); } catch (Exception e) { _console.WriteToLog(FrmLogConsole.Level.Critical, "Failed to generate an updated image for the front page of Advertising Profit Control."); _console.WriteToLog(FrmLogConsole.Level.Debug, e.Message); _console.WriteToLog(FrmLogConsole.Level.Info, "This is most likely a screw you from the GDI+ subsystem of Windows."); } } public void BuildFormFrontCompressedLayout(int dateId, double departmentSales, double salesProducedByAdItems, double remainingSales, double totalProfitReturnFromAdItems, double totalProfitReturnFromRemainingSales, double totalProfitReturn, string comments) { var databaseTracker = new DatabaseTracker(); var databaseReader = new DatabaseReader(); var stringWriter = new StringWriter(); var writer = new HtmlTextWriter(stringWriter); var table = databaseReader.ReturnApcTableForReport(dateId, databaseTracker.DatabaseConnectionString); var dateString = databaseReader.RetrieveDateStringById(dateId, databaseTracker.DatabaseConnectionString); var spam = dateString.Split(' '); dateString = spam[0]; //Begin evaluating the size of the table. var isCompressedFormat = false; var willGenerateCommentRow = false; if ((table.Rows.Count + 1) == 15) { willGenerateCommentRow = true; } else if ((table.Rows.Count + 1) < 15) { isCompressedFormat = true; } writer.Write("\n"); writer.RenderBeginTag(HtmlTextWriterTag.Html); writer.RenderBeginTag(HtmlTextWriterTag.Head); writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css"); writer.RenderBeginTag(HtmlTextWriterTag.Style); writer.Write("th{margins:0; padding:0; vertical-align:bottom; height:35px; font-size:14px; border:1px solid black}"); writer.Write("td{margins:0; padding:0; border:1px solid black; font-size:14px; text-align:center; height:35px}"); writer.RenderEndTag();//style writer.RenderEndTag(); // Head writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:11in; height:8in"); writer.RenderBeginTag(HtmlTextWriterTag.Body); //Begin building the header for the page, the HTML engine doesn't seem to like putting content in the Head. writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin-top:200px; width:100%"); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin:0px; padding:0px"); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.AddAttribute(HtmlTextWriterAttribute.Style, "font-size:14px; width:20%; vertical-align:bottom; border:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("
Store Name: Allen's of Hastings
"); writer.RenderEndTag();//td writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:50%; font-size:15px; margin:0px; padding: 0px 0px 0px 0px; border:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); //(Mode: " + (willGenerateCommentRow ? "Generates Comment row" : "Compressed Format") + ") writer.Write("
Week Ending: " + dateString + "
Department: Produce
ProjectionActual
"); writer.RenderEndTag();//td writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("Profit Analysis
"); writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderEndTag();//table //END of header table structure writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; width:11in; height:7.0in; table-layout:fixed"); //style for the table writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); //Begin building the header row. writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none"); writer.RenderBeginTag(HtmlTextWriterTag.Th); writer.Write("Ad Items"); writer.RenderEndTag(); //th writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9"); writer.RenderBeginTag(HtmlTextWriterTag.Th); writer.Write("Sold"); writer.RenderEndTag(); //th writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9"); writer.RenderBeginTag(HtmlTextWriterTag.Th); writer.Write("Sale1"+ $"{departmentSales:C}" + "
"); writer.RenderEndTag();//td writer.RenderEndTag();//End of header row code. var isRowMember = false; var isRenderingGroup = false; var adSpecialRowIndex = -1; //Variables for the Totals row. double projectionProfitReturn = 0; double projectionTotalProfitReturn = 0; double actualProfitReturn = 0; double actualTotalProfitReturn = 0; var adSpecialOffset = 0; //Profit Analysis values. for (var rowIndex = 0; rowIndex < (table.Rows.Count < 19 ? 19 : table.Rows.Count); rowIndex++) //The comparison in the for loop is index based, so no need to add one to the row count. { var isProfitAnalysisCell = false; //IF the row index goes beyond the number of rows that are in the table, then start padding with blank cells to fit the Profit Analysis cells. if (rowIndex < table.Rows.Count) { var row = table.Rows[rowIndex]; var rowAttribute = 0; var groupId = 0; if (int.TryParse(row.ItemArray[17].ToString(), out rowAttribute)) { if (rowAttribute != 0) { if (rowAttribute == 1) { isRowMember = false; } else { isRowMember = true; } isRenderingGroup = true; } else { isRenderingGroup = false; isRowMember = false; } } if (adSpecialRowIndex == -1 && int.TryParse(row.ItemArray[18].ToString(), out groupId)) { if (groupId != 0) { adSpecialRowIndex = rowIndex; writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "17"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("2" + $"{salesProducedByAdItems:C}" + "
"); writer.RenderEndTag(); break; case 3: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("3" + $"{remainingSales:C}" + "
"); writer.RenderEndTag(); break; case 6: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("4" + $"{totalProfitReturnFromAdItems:C}" + "
"); writer.RenderEndTag(); break; case 9: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("5" + $"{totalProfitReturnFromRemainingSales:C}" + "
"); writer.RenderEndTag(); break; case 12: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("6" + $"{totalProfitReturn:C}" + "
"); writer.RenderEndTag(); break; case 15: //IF either the compressed format or the generate comment row flags are set, then ignore this case. Only tables with 19 or more rows can generate a full comments cell due to the amount of text it can contain. if (isCompressedFormat || willGenerateCommentRow) break; writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "4"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("Comments: " + comments); writer.RenderEndTag(); break; } writer.RenderEndTag();//tr }//end for loop if (!willGenerateCommentRow && !isCompressedFormat) { //Begin rendering the totals row. writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; border-left:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; text-align:right"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("Total"); writer.RenderEndTag(); //td writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("(A) " + $"{projectionProfitReturn:C}"); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("(B) " + $"{projectionTotalProfitReturn:C}"); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; text-align:right"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "5"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("Total"); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("(A) " + $"{actualProfitReturn:C}"); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.RenderEndTag(); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px"); writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("(B) " + $"{actualTotalProfitReturn:C}"); writer.RenderEndTag();//td writer.RenderEndTag(); //tr } writer.RenderEndTag();//table writer.RenderEndTag();//body writer.RenderEndTag();//HTML using (var streamWriter = new StreamWriter(Application.StartupPath + "\\FrontPage.html")) { streamWriter.WriteLine(stringWriter.ToString()); } RenderHtmlToImage(); } private void BuildProfitAnalysisCell(ref HtmlTextWriter writer, int rowIndex, out bool isProfitAnalysisCell, double salesProducedByAdItems, double remainingSales, double totalProfitReturnFromAdItems, double totalProfitReturnFromRemainingSales, double totalProfitReturn) { isProfitAnalysisCell = false; switch (rowIndex) { case 0: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("2" + $"{salesProducedByAdItems:C}" + "
"); writer.RenderEndTag(); break; case 3: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("3" + $"{remainingSales:C}" + "
"); writer.RenderEndTag(); break; case 6: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("4" + $"{totalProfitReturnFromAdItems:C}" + "
"); writer.RenderEndTag(); break; case 9: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("5" + $"{totalProfitReturnFromRemainingSales:C}" + "
"); writer.RenderEndTag(); break; case 12: writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none"); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("6" + $"{totalProfitReturn:C}" + "
"); writer.RenderEndTag(); break; } } } }