Hyperlinks.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.Linq;
using GrapeCity.Documents.Word;

namespace GcWordWeb.Samples
{
    // This sample shows how to insert hyperlinks into a Word document
    // using the Range.Hyperlinks collection.
    // It adds some external hyperlinks to Web sites,
    // and also hyperlinks to bookmarks within the document.
    // This sample is very similar to HyperlinkFields,
    // but unlike that sample uses hyperlinks collections
    // rather than HYPERLINK fields.
    public class Hyperlinks
    {
        public GcWordDocument CreateDocx()
        {
            var doc = new GcWordDocument();
            var section = doc.Body.Sections.First;
            var pars = section.GetRange().Paragraphs;

            // 0. Paragraph with an external hyperlink:
            var p = pars.Add(
                "It is easy to add hyperlinks to document content via Range.Hyperlinks collection. " +
                "Following is a hyperlink to a web address. ");
            // There are different Hyperlinks.Add() overloads that allow to specify
            // different hyperlink options such as screen tips etc:
            var hl0 = p.GetRange().Hyperlinks.Add(new Uri("http://www.google.com"), null, "Click to go to www.google.com.");

            // 1. Paragraph with an external hyperlink with its own style:
            p = pars.Add("Next is another hyperlink, this time with its own style and a custom tooltip. ");
            var hl1 = p.GetRange().Hyperlinks.Add(new Uri("https://www.grapecity.com/en/"), null, "Click to go to www.grapecity.com.", "Click to open GrapeCity web page");

            // 2. Link to a bookmark within the document:
            // We add bookmarks at the top and bottom of the document,
            // and set up links to jump between them.
            var bmkTop = "BookmarkTop";
            var bmkBot = "BookmarkEnd";
            p = pars.Add(
                "Hyperlinks can also point to locations within the document. " +
                "We add some filler paragraphs below, followed by a paragraph " +
                $"with a bookmark named '{bmkBot}' attached to it. " +
                "The next hyperlink jumps to that bookmark. ");
            // Attach a bookmark to this paragraph so we can jump back here:
            p.GetRange().Bookmarks.Add(bmkTop);
            // A hyperlink to a bookmark:
            var hl2 = p.GetRange().Hyperlinks.Add($"{bmkBot}", $"Click to jump to {bmkBot} at the end of the document.", $"Jumo to {bmkBot}");
            hl2.GetRange().Runs.First.Style = doc.Styles[BuiltInStyleId.FollowedHyperlink];

            // Add filler, bookmarked paragraph after it, and
            // a link to jump back:
            for (int i = 0; i < 100; ++i)
                pars.Add($"Filler paragraph {i}.");
            var pb = pars.Add($"{bmkBot} points here. ");
            pb.GetRange().Bookmarks.Add(bmkBot);
            var hl3 = pb.GetRange().Hyperlinks.Add($"{bmkTop}", $"Jump back to {bmkTop}.", $"Jumo to {bmkTop}");
            hl3.GetRange().Runs.First.Style = doc.Styles[BuiltInStyleId.FollowedHyperlink];

            // Done:
            return doc;
        }
    }
}