RotatedTable.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Numerics;
using System.Collections.Generic;
using GrapeCity.Documents.Pdf;
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 DsPdfWeb.Demos
{
    // このサンプルでは、角度の制約を使用して回転したテーブルを描画する方法を紹介しています。
    // 角度の制約は、変換行列による回転と似ていますが、変換と違って、
    // 角度の制約を使用すると、ビューに他の視覚的要素を追加することがより簡単になります。
    public class RotatedTable
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var p = doc.NewPage();
            var g = p.Graphics;

            // デフォルトのグラフィックス解像度(GcPdfGraphics では 72 dpi)を変更することで、
            // 忠実度を損なわずにドキュメントを拡大縮小することができます。
            g.Resolution = 96;
            DrawTable(g, g.CanvasSize.Width, g.CanvasSize.Height);

            // PDF を保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }

        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, float pageWidth, float pageHeight)
        {
            float marginX = 20, marginY = 20;
            var host = new LayoutHost();
            var view = host.CreateView(0, 0);

            // 注:テーブルの矩形は AngleConstraint を使用して回転させています。
            // 変換行列を持つ View を別に用意する必要はありません。

            var rt = view.CreateRect();
            rt.SetAngle(null, 270);
            rt.SetTop(null, AnchorParam.Left, marginX);
            rt.SetRight(null, AnchorParam.Top, -marginY);

            var ta = new TableRenderer(g,
                rt, FixedTableSides.TopRight,
                rowCount: 9,
                columnCount: 5,
                gridLineColor: Color.Black,
                gridLineWidth: 1,
                paddingLeft: 20,
                paddingRight: 20,
                paddingBottom: 20,
                paddingTop: 12);

            var lgb = new LinearGradientBrush(Color.FromArgb(240, 234, 249), new PointF(0, 0), Color.FromArgb(201, 181, 232), new PointF(0, 1));
            ta.TableFrameStyle = new FrameStyle
            {
                LineColor = Color.FromArgb(126, 96, 160),
                LineWidth = 1,
                FillBrush = lgb
            };

            var columns = ta.ColumnRects;
            columns[0].SetWidth(80);
            columns[1].SetWidth(125);
            columns[2].SetWidth(110);
            columns[3].SetWidth(80);
            columns[4].SetWidth(80);

            var fmt = new TextFormat
            {
                Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "ipag.ttc")),
                FontSize = 16,
                FontSizeInGraphicUnits = true,
                FontFeatures = new FontFeature[] { new FontFeature(FeatureTag.liga, false) }
            };
            var fmtHeader = new TextFormat(fmt)
            {
                ForeColor = Color.White,
                FontBold = true
            };

            var csTitle = new CellStyle
            {
                Background = true,
                TextFormat = new TextFormat(fmt)
                {
                    FontBold = true,
                    FontSize = 20
                },
                TextAlignment = TextAlignment.Center,
                PaddingBottom = 8
            };

            ta.AddCell(csTitle, 0, 0, 1, 5, "授業スケジュール");

            var csHeader = new CellStyle
            {
                TextFormat = fmtHeader,
                TextAlignment = TextAlignment.Center,
                PaddingTop = 5,
                PaddingBottom = 6
            };
            ta.AddCell(csHeader, 1, 0, "レッスン");
            ta.AddCell(csHeader, 1, 1, "トピック");
            ta.AddCell(csHeader, 1, 2, "課題");
            ta.AddCell(csHeader, 1, 3, "点数");
            ta.AddCell(csHeader, 1, 4, "期限");

            var csCenter = new CellStyle(csHeader)
            {
                TextFormat = fmt,
                PaddingLeftRight = 6
            };
            var csLeft = new CellStyle(csCenter)
            {
                TextAlignment = TextAlignment.Leading
            };

            ta.AddCell(csCenter, 2, 0, 2, 1, "1");
            ta.AddCell(csLeft, 2, 1, 2, 1, "遠隔教育とは?");
            ta.AddCell(csLeft, 2, 2, "Wiki #1");
            ta.AddCell(csCenter, 2, 3, "10");
            ta.AddCell(csCenter, 2, 4, "3月10日");
            ta.AddCell(csLeft, 3, 2, "プレゼンテーション");
            ta.AddCell(csCenter, 3, 3, "20");
            ta.AddCell(csCenter, 3, 4);

            ta.AddCell(csCenter, 4, 0, "2");
            ta.AddCell(csLeft, 4, 1, "歴史と理論");
            ta.AddCell(csLeft, 4, 2, "小論文");
            ta.AddCell(csCenter, 4, 3, "20");
            ta.AddCell(csCenter, 4, 4, "3月24日");

            ta.AddCell(csCenter, 5, 0, 1, 5, "春休み");

            ta.AddCell(csCenter, 6, 0, 2, 1, "3");
            ta.AddCell(csLeft, 6, 1, 2, 1, "遠隔学習者");
            ta.AddCell(csLeft, 6, 2, "ディスカッション #1");
            ta.AddCell(csCenter, 6, 3, "10");
            ta.AddCell(csCenter, 6, 4, "4月7日");
            ta.AddCell(csLeft, 7, 2, "グループプロジェクト");
            ta.AddCell(csCenter, 7, 3, "50");
            ta.AddCell(csCenter, 7, 4, "4月14日");

            ta.AddCell(csCenter, 8, 0, "4");
            ta.AddCell(csLeft, 8, 1, "メディア選択");
            ta.AddCell(csLeft, 8, 2, "ブログ #1");
            ta.AddCell(csCenter, 8, 3, "10");
            ta.AddCell(csCenter, 8, 4, "4月21日");

            ta.AddCell(new CellStyle
            {
                Background = true,
                FillColor = Color.FromArgb(79, 129, 189)
            }, 1, 0, 1, 5);

            ta.AddCell(new CellStyle
            {
                Background = true,
                FillColor = Color.FromArgb(208, 216, 232)
            }, 2, 0, 7, 5);

            var bkHighlight = new CellStyle
            {
                Background = true,
                FillColor = Color.FromArgb(233, 237, 244)
            };
            ta.AddCell(bkHighlight, 3, 2, 1, 3);
            ta.AddCell(bkHighlight, 5, 0, 1, 5);
            ta.AddCell(bkHighlight, 7, 2, 1, 3);

            ta.ApplyCellConstraints();

            g.Transform = Matrix3x2.CreateScale(1.8f);
            ta.Render(g);
        }
    }
}