blob: 9305150b66fc2fb178c8aa88679340eec34c66e8 [file] [log] [blame]
//
// Copyright 2017 Thomas Barnekow
//
// This code is licensed using the Microsoft Public License (Ms-PL). The text of the
// license can be found here:
//
// http://www.microsoft.com/resources/sharedsource/licensingbasics/publiclicense.mspx
//
// Developer: Thomas Barnekow
// Email: thomas@barnekow.info
//
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;
namespace OpenXmlPowerTools
{
public static class PowerToolsBlockExtensions
{
/// <summary>
/// Begins a PowerTools Block by (1) removing annotations and, unless the package was
/// opened in read-only mode, (2) saving the package.
/// </summary>
/// <remarks>
/// Removes <see cref="XDocument" /> and <see cref="XmlNamespaceManager" /> instances
/// added by <see cref="PtOpenXmlExtensions.GetXDocument(OpenXmlPart)" />,
/// <see cref="PtOpenXmlExtensions.GetXDocument(OpenXmlPart, out XmlNamespaceManager)" />,
/// <see cref="PtOpenXmlExtensions.PutXDocument(OpenXmlPart)" />,
/// <see cref="PtOpenXmlExtensions.PutXDocument(OpenXmlPart, XDocument)" />, and
/// <see cref="PtOpenXmlExtensions.PutXDocumentWithFormatting(OpenXmlPart)" />.
/// methods.
/// </remarks>
/// <param name="package">
/// A <see cref="WordprocessingDocument" />, <see cref="SpreadsheetDocument" />,
/// or <see cref="PresentationDocument" />.
/// </param>
public static void BeginPowerToolsBlock(this OpenXmlPackage package)
{
if (package == null) throw new ArgumentNullException("package");
package.RemovePowerToolsAnnotations();
package.Save();
}
/// <summary>
/// Ends a PowerTools Block by reloading the root elements of all package parts
/// that were changed by the PowerTools. A part is deemed changed by the PowerTools
/// if it has an annotation of type <see cref="XDocument" />.
/// </summary>
/// <param name="package">
/// A <see cref="WordprocessingDocument" />, <see cref="SpreadsheetDocument" />,
/// or <see cref="PresentationDocument" />.
/// </param>
public static void EndPowerToolsBlock(this OpenXmlPackage package)
{
if (package == null) throw new ArgumentNullException("package");
foreach (OpenXmlPart part in package.GetAllParts())
{
if (part.Annotations<XDocument>().Any() && part.RootElement != null)
part.RootElement.Reload();
}
}
private static void RemovePowerToolsAnnotations(this OpenXmlPackage package)
{
if (package == null) throw new ArgumentNullException("package");
foreach (OpenXmlPart part in package.GetAllParts())
{
part.RemoveAnnotations<XDocument>();
part.RemoveAnnotations<XmlNamespaceManager>();
}
}
}
}