ConditionalTableStyles.cs
//
// This code is part of GrapeCity Documents for Word samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Word;

namespace GcWordWeb.Samples
{
    // This sample demonstrates various conditional table formatting options.
    public class ConditionalTableStyles
    {
        public GcWordDocument CreateDocx()
        {
            GcWordDocument doc = new GcWordDocument();

            // Table dimensions:
            var rows = 20;
            var cols = 7;

            var section = doc.Body.Sections.First;
            section.GetRange().Paragraphs.Add(
                $"A {cols} columns by {rows} rows table, with conditional styles applied to most elements:");

            // Add an empty table:
            var t = section.GetRange().Tables.Add(0, 0);

            // Add some rows and cells to it:
            var cells = new List<string>(cols);
            for (int col = 0; col < cols; ++col)
                cells.Add(string.Empty);
            for (int row = 0; row < rows; ++row)
            {
                for (int col = 0; col < cols; ++col)
                    cells[col] = $"Row {row + 1}, col {col + 1}";
                t.Rows.Add(cells.ToArray());
            }

            // Create a table style on which we will define conditional formatting:
            var ts1 = doc.Styles.Add("Table Style 1", StyleType.Table);
            // And assign the style to the table:
            t.Style = ts1;

            // Set up simple borders:
            foreach (var border in ts1.Table.Borders)
            {
                border.LineStyle = LineStyle.Single;
                border.LineWidth = 0.5f;
                border.Color.RGB = Color.DarkGray;
            }
            // Add some padding:
            ts1.Table.Padding.All = 2;

            // To use conditional styles, we need to set corresponding flags on the table's style options.
            // In this case, we set all of them:
            t.Format.StyleOptions =
                TableStyleOptions.FirstRow | TableStyleOptions.LastRow | 
                TableStyleOptions.FirstColumn | TableStyleOptions.LastColumn | 
                TableStyleOptions.RowBands | TableStyleOptions.ColumnBands;

            // Set up the table for row and column bands:
            ts1.Table.RowStripe = 1;
            ts1.Table.ColumnStripe = 1;

            // Shortcut to access table's conditionals:
            var conds = ts1.Table.Conditionals;

            // Odd rows' style:
            conds[TableStyleOverride.Band1Horizontal].Font.Bold = true;
            // Band*Vertical styles override Band*Horizontal styles if there is a conflict.
            // Here, becase we set vertical band backgrounds, horizontal ones 
            // will not be seen in the document:
            conds[TableStyleOverride.Band1Horizontal].Shading.Texture = TexturePattern.Clear; // overridden
            conds[TableStyleOverride.Band1Horizontal].Shading.BackgroundPatternColor.RGB = Color.Magenta; // overridden
            // Even rows' style:
            conds[TableStyleOverride.Band2Horizontal].Font.Italic = true;
            // Won't be seen in the document (see comment above):
            conds[TableStyleOverride.Band2Horizontal].Shading.Texture = TexturePattern.Clear; // overridden
            conds[TableStyleOverride.Band2Horizontal].Shading.BackgroundPatternColor.RGB = Color.Brown; // overridden

            // Odd columns' style:
            conds[TableStyleOverride.Band1Vertical].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.Band1Vertical].Shading.BackgroundPatternColor.RGB = Color.FromArgb(0xe6, 0xff, 0xe6);
            // Even columns' style:
            conds[TableStyleOverride.Band2Vertical].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.Band2Vertical].Shading.BackgroundPatternColor.RGB = Color.FromArgb(0xff, 0xff, 0xe6);

            // First/last/corner styles will override horizontal and vertical bands if there is a conflict:
            conds[TableStyleOverride.FirstColumn].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.FirstColumn].Shading.BackgroundPatternColor.RGB = Color.CadetBlue;

            conds[TableStyleOverride.FirstRow].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.FirstRow].Shading.BackgroundPatternColor.RGB = Color.PaleVioletRed;

            conds[TableStyleOverride.LastColumn].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.LastColumn].Shading.BackgroundPatternColor.RGB = Color.PapayaWhip;

            conds[TableStyleOverride.LastRow].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.LastRow].Shading.BackgroundPatternColor.RGB = Color.PaleGoldenrod;

            conds[TableStyleOverride.NorthWestCell].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.NorthWestCell].Shading.BackgroundPatternColor.RGB = Color.Red;

            conds[TableStyleOverride.NorthEastCell].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.NorthEastCell].Shading.BackgroundPatternColor.RGB = Color.Green;

            conds[TableStyleOverride.SouthWestCell].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.SouthWestCell].Shading.BackgroundPatternColor.RGB = Color.Blue;

            conds[TableStyleOverride.SouthEastCell].Shading.Texture = TexturePattern.Clear;
            conds[TableStyleOverride.SouthEastCell].Shading.BackgroundPatternColor.RGB = Color.Purple;

            // Done:
            return doc;
        }
    }
}