RedNegativesTable.cs
- //
- // This code is part of Document Solutions for Imaging demos.
- // Copyright (c) MESCIUS inc. All rights reserved.
- //
- using System;
- using System.IO;
- using System.Drawing;
- using System.Numerics;
- using System.Collections.Generic;
- using GrapeCity.Documents.Drawing;
- using GrapeCity.Documents.Text;
- using GrapeCity.Documents.Imaging;
- using GrapeCity.Documents.Layout;
- using GCTEXT = GrapeCity.Documents.Text;
- using GCDRAW = GrapeCity.Documents.Drawing;
-
- namespace DsImagingWeb.Demos
- {
- // This example shows how to draw a simple table containing
- // some numeric data, with negative values displayed in red,
- // and with differently shaded odd and even rows,
- // using the GrapeCity.Documents.Drawing.TableRenderer and related classes.
- public class RedNegativesTable
- {
- public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
- {
- var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
- using var g = bmp.CreateGraphics(Color.White);
- DrawTable(g, pixelSize.Width, pixelSize.Height);
- return bmp;
- }
-
- class ItemLine
- {
- public ItemLine(string text, double sales, double marginNumber, double marginPercent, int totalCustomers)
- {
- Text = text;
- Sales = sales;
- MarginNumber = marginNumber;
- MarginPercent = marginPercent;
- TotalCustomers = totalCustomers;
- }
- public string Text { get; }
- public double Sales { get; }
- public double MarginNumber { get; }
- public double MarginPercent { get; }
- public int TotalCustomers { get; }
- }
-
- static void DrawTable(GcGraphics g, int pageWidth, int pageHeight)
- {
- var items = new ItemLine[]
- {
- new ItemLine("Washers & Dryers", 1580, 196.82, 12.46, 247),
- new ItemLine("Projectors & Screens", 973, 211.26, 21.72, 382),
- new ItemLine("Refrigerators", 953, -350.57, -36.77, 331),
- new ItemLine("Laptops", 668, 181.17, 27.11, 301),
- new ItemLine("Coffee Machines", 476, -11.15, -2.34, 251),
- new ItemLine("Lamps", 471, 340.31, 72.28, 548),
- new ItemLine("Water Heaters", 443, 94.59, 21.34, 152),
- new ItemLine("Monitors", 424, -0.77, -0.18, 327),
- new ItemLine("Microwaves", 319, 14.30, 4.48, 375),
- new ItemLine("Desktops", 266, 23.22, 8.72, 184),
- new ItemLine("Air Conditioners", 253, 137.82, 54.54, 216),
- new ItemLine("Printers & Scanners", 219, 0.59, 0.27, 379),
- new ItemLine("Computers Accessories", 128, -18.23, -14.27, 654),
- new ItemLine("Fans", 83, -38.64, -46.35, 287)
- };
-
- var host = new LayoutHost();
- var view = host.CreateView(pageWidth, pageHeight);
-
- var rt = view.CreateRect();
- rt.AnchorTopLeft(null, 72, 72);
-
- var ta = new TableRenderer(g,
- rt, FixedTableSides.TopLeft,
- rowCount: items.Length + 1,
- columnCount: 5,
- gridLineColor: Color.Transparent,
- gridLineWidth: 0);
-
- var columns = ta.ColumnRects;
- columns[0].SetWidth(270);
- columns[1].SetWidth(150);
- columns[2].SetWidth(150);
- columns[3].SetWidth(150);
- columns[4].SetWidth(150);
-
- var fmt = new TextFormat
- {
- Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "consola.ttf")),
- ForeColor = Color.FromArgb(38, 38, 38),
- FontSize = 20,
- FontSizeInGraphicUnits = true,
- };
- var fmtSmall = new TextFormat(fmt)
- {
- FontSize = 14
- };
-
- var csCaption = new CellStyle
- {
- TextAlignment = TextAlignment.Trailing,
- ParagraphAlignment = ParagraphAlignment.Center,
- TextFormat = fmt,
- PaddingBottom = 10,
- PaddingRight = 4
- };
- ta.AddCell(new CellStyle(csCaption)
- {
- CustomDraw = (g, tc) =>
- {
- float y = tc.Height * 0.5f;
- float x = 10;
- var pen = new GCDRAW.Pen(Color.DimGray, 1);
- g.DrawLine(new PointF(x, y - 7), new PointF(x, y + 7), pen);
- g.DrawLine(new PointF(x - 3, y + 3), new PointF(x, y + 7), pen);
- g.DrawLine(new PointF(x + 3, y + 3), new PointF(x, y + 7), pen);
- },
- CreateTextLayout = (g, cs, data) =>
- {
- var tl = g.CreateTextLayout();
- tl.AppendLine("Sales", fmt);
- tl.Append("in Thousands", fmtSmall);
- return tl;
- }
- }, 0, 1, null);
- ta.AddCell(new CellStyle(csCaption)
- {
- CreateTextLayout = (g, cs, data) =>
- {
- var tl = g.CreateTextLayout();
- tl.AppendLine("Margin", fmt);
- tl.Append("in Thousands", fmtSmall);
- return tl;
- }
- }, 0, 2, null);
- ta.AddCell(csCaption, 0, 3, "Margin %");
- ta.AddCell(csCaption, 0, 4, "Total\nCustomers");
-
- var csName = new CellStyle
- {
- TextFormat = fmt,
- PaddingTopBottom = 5,
- PaddingLeft = 4
- };
- var csNum = new CellStyle
- {
- TextFormat = fmt,
- TextAlignment = TextAlignment.Trailing,
- PaddingTopBottom = 5,
- PaddingRight = 4
- };
- var csNumNegative = new CellStyle(csNum)
- {
- TextFormat = new TextFormat(fmt)
- {
- ForeColor = Color.Red
- }
- };
- var csBand = new CellStyle
- {
- FillColor = Color.FromArgb(244, 241, 250),
- Background = true
- };
-
- var ci = new System.Globalization.CultureInfo("en-US");
-
- for (int i = 0; i < items.Length; i++)
- {
- var item = items[i];
- int rowIndex = i + 1;
-
- if ((i & 1) != 0)
- {
- ta.AddCell(csBand, rowIndex, 0, 1, 5);
- }
- ta.AddCell(csName, rowIndex, 0, item.Text);
- ta.AddCell(csNum, rowIndex, 1, item.Sales.ToString("c0", ci));
- var v = item.MarginNumber;
- ta.AddCell(v >= 0.0 ? csNum : csNumNegative, rowIndex, 2, v.ToString("n2"));
- v = item.MarginPercent;
- ta.AddCell(v >= 0.0 ? csNum : csNumNegative, rowIndex, 3, v.ToString("n2"));
- ta.AddCell(csNum, rowIndex, 4, item.TotalCustomers.ToString("n0"));
- }
-
- ta.SetVerticalGridLineWidth(1, 2);
- ta.SetHorizontalGridLineWidth(1, 2);
-
- var pen = new GCDRAW.Pen(Color.FromArgb(159, 146, 213), 2)
- {
- DashStyle = DashStyle.Solid,
- LineCap = PenLineCap.Round
- };
- ta.AddCell(new CellStyle
- {
- Background = true,
- Borders = FrameBorders.LeftBorder | FrameBorders.TopBorder,
- Pen = pen,
- LinePaddingLeft = -2,
- LinePaddingTop = -2,
- }, 1, 1, items.Length, 4);
-
- ta.Render();
- }
- }
- }
-