IndexFieldOpts.cs
//
// This code is part of Document Solutions for Word demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using GrapeCity.Documents.Word;
using GrapeCity.Documents.Word.Fields;
using System.Text;
using C1.DataCollection;
using System.Text.RegularExpressions;

namespace DsWordWeb.Demos
{
    // This sample shows how to use the INDEX and XE field options
    // to add an index to a DOCX Word document.
    public class IndexFieldOpts
    {
        // For this demo, we arbitrarily pick some of the 'lorem ipsum' words to include in the index:
        private static string[] s_indexWords =
        {
            "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "mauris", "id", "volutpat",
            "tellus", "ullamcorper", "sem", "praesent", "et", "ante", "laoreet", "lobortis", "nunc", "congue",
        };

        public GcWordDocument CreateDocx()
        {
            var doc = new GcWordDocument();

            // Arbitrary number of sample paragraphs in the document:
            const int NPARS = 30;
            // We add some random "lorem ipsum" paragraphs to the document,
            // and build the index on the arbitrarily chosen subset of words,
            // including pages where the indexed word appears as the first
            // word in a paragraph:
            for (int i = 0; i < NPARS; ++i)
            {
                var par = doc.Body.Paragraphs.Add();
                var txt = Util.LoremIpsumPar();

                var words = txt.Split([' ', ',', '.'], 2);
                if (words.Length != 2)
                    throw new Exception("Unexpected");

                var word = words[0];
                var xe = new XeFieldOptions(doc);
                xe.Entry.Content.Text = word;
                par.AddComplexField(xe);
                par.AddRun(txt);
            }
            // Add new section for the index:
            doc.Body.Paragraphs.Last.AddSectionBreak();
            var p = doc.Body.Paragraphs.Add(doc.Styles[BuiltInStyleId.Index1]);
            // Set up INDEX field options:
            var index = new IndexFieldOptions(doc);
            // Two column layout:
            index.Columns = 2;
            // Use headings for index entries:
            index.Heading = "A";
            // Set any additional options as needed,
            // then create the INDEX field with the specified options:
            ComplexField field = p.AddComplexField(index);

            // Update the index field with a specific culture:
            field.Update(new GrapeCity.Documents.Word.Layout.WordLayoutSettings() { FontCollection = Util.FontCollection, Culture = CultureInfo.GetCultureInfo("en-US") });

            // Done:
            return doc;
        }
    }
}