using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO.Packaging;
namespace Novacode
{
///
/// Represents a Hyperlink in a document.
///
public class Hyperlink: DocXElement
{
internal Uri uri;
internal Dictionary hyperlink_rels;
///
/// Remove a Hyperlink from this Paragraph only.
///
///
///
/// // Create a document.
/// using (DocX document = DocX.Create(@"Test.docx"))
/// {
/// // Add a hyperlink to this document.
/// Hyperlink h = document.AddHyperlink("link", new Uri("http://www.google.com"));
///
/// // Add a Paragraph to this document and insert the hyperlink
/// Paragraph p1 = document.InsertParagraph();
/// p1.Append("This is a cool ").AppendHyperlink(h).Append(" .");
///
/// /*
/// * Remove the hyperlink from this Paragraph only.
/// * Note a reference to the hyperlink will still exist in the document and it can thus be reused.
/// */
/// p1.Hyperlinks[0].Remove();
///
/// // Add a new Paragraph to this document and reuse the hyperlink h.
/// Paragraph p2 = document.InsertParagraph();
/// p2.Append("This is the same cool ").AppendHyperlink(h).Append(" .");
///
/// document.Save();
/// }// Release this document from memory.
///
///
public void Remove()
{
Xml.Remove();
}
///
/// Change the Text of a Hyperlink.
///
///
/// Change the Text of a Hyperlink.
///
/// // Create a document.
/// using (DocX document = DocX.Load(@"Test.docx"))
/// {
/// // Get all of the hyperlinks in this document
/// List hyperlinks = document.Hyperlinks;
///
/// // Change the first hyperlinks text and Uri
/// Hyperlink h0 = hyperlinks[0];
/// h0.Text = "DocX";
/// h0.Uri = new Uri("http://docx.codeplex.com");
///
/// // Save this document.
/// document.Save();
/// }
///
///
public string Text
{
get
{
// Create a string builder.
StringBuilder sb = new StringBuilder();
// Get all the runs in this Text.
var runs = from r in Xml.Elements()
where r.Name.LocalName == "r"
select new Run(Document, r, 0);
// Remove each run.
foreach (Run r in runs)
sb.Append(r.Value);
return sb.ToString();
}
set
{
// Get all the runs in this Text.
var runs = from r in Xml.Elements()
where r.Name.LocalName == "r"
select r;
// Remove each run.
for (int i = 0; i < runs.Count(); i++)
runs.Remove();
XElement rPr =
new XElement
(
DocX.w + "rPr",
new XElement
(
DocX.w + "rStyle",
new XAttribute(DocX.w + "val", "Hyperlink")
)
);
// Format and add the new text.
List newRuns = HelperFunctions.FormatInput(value, rPr);
Xml.Add(newRuns);
}
}
///
/// Change the Uri of a Hyperlink.
///
///
/// Change the Uri of a Hyperlink.
///
/// // Create a document.
/// using (DocX document = DocX.Load(@"Test.docx"))
/// {
/// // Get all of the hyperlinks in this document
/// List hyperlinks = document.Hyperlinks;
///
/// // Change the first hyperlinks text and Uri
/// Hyperlink h0 = hyperlinks[0];
/// h0.Text = "DocX";
/// h0.Uri = new Uri("http://docx.codeplex.com");
///
/// // Save this document.
/// document.Save();
/// }
///
///
public Uri Uri
{
get
{
// Return the Hyperlinks Uri.
return uri;
}
set
{
foreach (PackagePart p in hyperlink_rels.Keys)
{
PackageRelationship r = hyperlink_rels[p];
// Get all of the information about this relationship.
TargetMode r_tm = r.TargetMode;
string r_rt = r.RelationshipType;
string r_id = r.Id;
// Delete the relationship
p.DeleteRelationship(r_id);
p.CreateRelationship(value, r_tm, r_rt, r_id);
}
uri = value;
}
}
internal Hyperlink(DocX document, XElement i): base(document, i)
{
hyperlink_rels = new Dictionary();
}
}
}