ContentControlsHelpers.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 GrapeCity.Documents.Word;

namespace DsWordWeb.Demos
{
    // This sample demonstrates how to add content controls to a document.
    // The code is the same as in the ContentControls example, but
    // uses the (new in v6.2) content creation helper methods,
    // which in most cases yield more robust and compact code.
    // Lines of code replaced by the new helper method calls are preserved
    // in the code of this example for reference, commented out with '//old:' comment.
    public class ContentControlsHelpers
    {
        public GcWordDocument CreateDocx()
        {
            var doc = new GcWordDocument();
            // Heading:
            //old: var p = doc.Body.Paragraphs.Add("Content Control Examples");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading1];
            var p = doc.Body.AddParagraph("Content Control Examples", doc.Styles[BuiltInStyleId.Heading1]);
            //old: p = doc.Body.Paragraphs.Add("Below are some examples of content controls. Open the document in MS Word to see the controls in action.");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            p = doc.Body.AddParagraph(
                "Below are some examples of content controls. Open the document in MS Word to see the controls in action.",
                doc.Styles[BuiltInStyleId.Subtitle]);

            //
            // ContentControlType.DropdownList:
            //
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.DropdownList");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading2];
            doc.Body.AddParagraph("ContentControlType.DropdownList", doc.Styles[BuiltInStyleId.Heading2]);
            //old: p = doc.Body.Paragraphs.Add("Select a fruit from the dropdown list control: ");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            doc.Body.AddParagraph("Select a fruit from the dropdown list control: ", doc.Styles[BuiltInStyleId.Subtitle]);

            //old: var dropDownListCtrl = p.GetRange().ContentControls.Add(ContentControlType.DropdownList, false);
            var dropDownListCtrl = p.AddContentControl(ContentControlType.DropdownList, false);
            dropDownListCtrl.DropDownItems.Add(new DropDownItem("apple", "Apples"));
            dropDownListCtrl.DropDownItems.Add(new DropDownItem("orange", "Oranges"));
            dropDownListCtrl.DropDownItems.Add(new DropDownItem("banana", "Bananas"));
            dropDownListCtrl.DropDownItems.Add(new DropDownItem("pear", "Pears"));

            // Add placeholder to the building blocks gallery:
            BuildingBlock dropDownPlaceholder = doc.GlossaryDocument.BuildingBlocks.Add("dropdownlist-placeholder", "General",
                type: BuildingBlockType.ContentControlPlaceholder);

            //set placeholder text
            //old: Paragraph pp = dropDownPlaceholder.Body.Paragraphs.Add("Click to pick");
            var pp = dropDownPlaceholder.Body.AddParagraph("Click to pick");
            //apply style to placeholder element
            pp.GetRange().Runs.First.Style = p.ParentBody.Document.Styles[BuiltInStyleId.Strong];
            //...and change its color
            pp.GetRange().Runs.First.Font.Color.RGB = Color.DarkSeaGreen;

            //old: p.GetRange().Runs.Add(" The green 'Click to pick' text on the left is a placeholder, replaced with the picked fruit when you've selected one.");
            p.AddRun(" The green 'Click to pick' text on the left is a placeholder, replaced with the picked fruit when you've selected one.");

            // Set control border color:
            dropDownListCtrl.Color.RGB = Color.OrangeRed;
            // Set control text color:
            dropDownListCtrl.Font.Color.RGB = Color.DarkOrange;

            // Use building blocks placeholder on the DropDownList contentControl.           
            dropDownListCtrl.ShowingPlaceholderText = true;
            dropDownListCtrl.PlaceholderText = dropDownPlaceholder;

            //
            //  ContentControlType.Text
            //
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.Text");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading2];
            doc.Body.AddParagraph("ContentControlType.Text", doc.Styles[BuiltInStyleId.Heading2]);
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.Text allows entering a single run of text in the control. " +
            //old:     "All text in a Text control has the same formatting. In this case we use 'Block Text' paragraph style.");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            doc.Body.AddParagraph("ContentControlType.Text allows entering a single run of text in the control. " +
                "All text in a Text control has the same formatting. In this case we use 'Block Text' paragraph style.",
                doc.Styles[BuiltInStyleId.Subtitle]);

            //old: var textCtrl = doc.Body.ContentControls.Add(ContentControlType.Text, false);
            var textCtrl = doc.Body.AddContentControl(ContentControlType.Text, false);
            //old: p = textCtrl.Content.GetRange().Paragraphs.Add(
            //old:     "This is the default content of the only run in the only paragraph in a Text content control.",
            //old:     doc.Styles[BuiltInStyleId.BlockText]);
            p = textCtrl.Content.AddParagraph(
                "This is the default content of the only run in the only paragraph in a Text content control.",
                doc.Styles[BuiltInStyleId.BlockText]);

            // This code demonstrates that only one paragraph, and only one run in it,
            // can exist in a Text control. Both statements under 'try' clauses will fail:
            try
            {
                textCtrl.Content.GetRange().Paragraphs.Add("Another paragraph (cannot be added).");
            }
            catch (InvalidContentControlSingleChildException)
            {
                Console.WriteLine("Cannot have more than one paragraph to a Text content control.");
            }
            try
            {
                p.GetRange().Runs.Add("Another run (cannot be added).");
            }
            catch (InvalidContentControlSingleChildException)
            {
                Console.WriteLine("Cannot have more than one run to a Text content control.");
            }

            //
            // ContentControlType.RichText
            //
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.RichText");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading2];
            doc.Body.AddParagraph("ContentControlType.RichText", doc.Styles[BuiltInStyleId.Heading2]);
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.RichText allows having multiple paragraphs, with multiple runs, " +
            //old:     "in a single RichText content control.");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            doc.Body.AddParagraph("ContentControlType.RichText allows having multiple paragraphs, with multiple runs, " +
                "in a single RichText content control.", doc.Styles[BuiltInStyleId.Subtitle]);

            //old: var richtext = doc.Body.ContentControls.Add(ContentControlType.RichText, false);
            var richtext = doc.Body.AddContentControl(ContentControlType.RichText, false);
            //old: var p1 = richtext.Content.GetRange().Paragraphs.Add("First paragraphs in the ");
            var p1 = richtext.Content.AddParagraph("First paragraphs in the ");
            //old: p1.GetRange().Runs.Add("RichText ", doc.Styles[BuiltInStyleId.Strong]);
            p1.AddRun("RichText ", doc.Styles[BuiltInStyleId.Strong]);
            //old: p1.GetRange().Runs.Add("content control.");
            p1.AddRun("content control.");
            //old: var p2 = richtext.Content.GetRange().Paragraphs.Add("Second paragraphs in the ");
            var p2 = richtext.Content.AddParagraph("Second paragraphs in the ");
            //old: p2.GetRange().Runs.Add("RichText ", doc.Styles[BuiltInStyleId.Strong]);
            p2.AddRun("RichText ", doc.Styles[BuiltInStyleId.Strong]);
            //old: p2.GetRange().Runs.Add("content control.");
            p2.AddRun("content control.");

            p2.Style = doc.Styles[BuiltInStyleId.IntenseQuote];

            //
            // ContentControlType.BuildingBlockGallery
            //
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.BuildingBlockGallery");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading2];
            doc.Body.AddParagraph("ContentControlType.BuildingBlockGallery", doc.Styles[BuiltInStyleId.Heading2]);
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.BuildingBlockGallery allows selecting items from " +
            //old:     "building block galleries. Here we allow to select an equation from the built-in Word equations gallery.");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            doc.Body.AddParagraph("ContentControlType.BuildingBlockGallery allows selecting items from " +
                "building block galleries. Here we allow to select an equation from the built-in Word equations gallery.",
                doc.Styles[BuiltInStyleId.Subtitle]);

            // We create a content control that allows selecting equations from 
            // the built-in Word equations gallery:
            //old: var galleryControl = doc.Body.ContentControls.Add(ContentControlType.BuildingBlockGallery);
            var galleryControl = doc.Body.AddContentControl(ContentControlType.BuildingBlockGallery);
            galleryControl.BuildingBlockCategory = "Built-In";
            galleryControl.BuildingBlockGallery = "Equations";

            //
            // ContentControlType.Group
            //
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.Group");
            //old: p.Style = doc.Styles[BuiltInStyleId.Heading2];
            doc.Body.AddParagraph("ContentControlType.Group", doc.Styles[BuiltInStyleId.Heading2]);
            //old: p = doc.Body.Paragraphs.Add("ContentControlType.Group allows createing groups with modifiable " +
            //old:     "and constant (non-modifiable) content. Here we create a checkbox with a non-modifiable label on its right.");
            //old: p.Style = doc.Styles[BuiltInStyleId.Subtitle];
            p = doc.Body.AddParagraph("ContentControlType.Group allows createing groups with modifiable " +
                "and constant (non-modifiable) content. Here we create a checkbox with a non-modifiable label on its right.",
                doc.Styles[BuiltInStyleId.Subtitle]);

            // Group content control prevent some kinds of modifications of children controls.
            // Add a group content control that will be used as parent container for
            // child controls:
            //old: var groupControl = doc.Body.ContentControls.Add(ContentControlType.Group, false);
            var groupControl = doc.Body.AddContentControl(ContentControlType.Group, false);

            // Note how to add ContentControls inside another ContentControl:
            // Do not use groupControl.GetRange().ContentControls.Add(...),
            // instead use groupControl.Content.GetRange().ContentControls.Add(...):
            //old: p = groupControl.Content.GetRange().Paragraphs.Add();
            p = groupControl.Content.AddParagraph();
            //old: var checkBox = p.GetRange().ContentControls.Add(ContentControlType.CheckBox, true);
            var checkBox = p.AddContentControl(ContentControlType.CheckBox, true);

            checkBox.Title = "Grouped checkbox";
            checkBox.Checked = true;

            //old: p.GetRange().Runs.Add(" Text to the right of the checkbox");
            p.AddRun(" Text to the right of the checkbox");

            // Date:
            //old: groupControl.Content.GetRange().Paragraphs.Add("Finally, we add a ContentControlType.Date control that shows the current date.");
            groupControl.Content.AddParagraph("Finally, we add a ContentControlType.Date control that shows the current date.");

            // Add a Date control
            //old: var date = groupControl.Content.GetRange().ContentControls.Add(ContentControlType.Date, false);
            var date = groupControl.Content.AddContentControl(ContentControlType.Date, false);
            date.Date = Util.TimeNow();
            date.DateFormat = "u";

            //create representation of date time
            //old: var dateParagraph = date.Content.GetRange().Paragraphs.Add();
            var dateParagraph = date.Content.AddParagraph();
            //old: dateParagraph.GetRange().Runs.Add(date.Date.Value.ToString(date.DateFormat));
            dateParagraph.AddRun(date.Date.Value.ToString(date.DateFormat));

            // In the Group contentControl, we have:
            // - a checkbox content control
            // - a text to its left
            // - a paragraph
            // - a date content control
            // Due to being inside Group content control, text cannot be changed unless
            // you disable grouping (Word->Developer->Group and select Ungroup).

            // Done:
            return doc;
        }
    }
}