Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

TableOfContents.cs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*************************************************************************************
  2. DocX – DocX is the community edition of Xceed Words for .NET
  3. Copyright (C) 2009-2016 Xceed Software Inc.
  4. This program is provided to you under the terms of the Microsoft Public
  5. License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
  6. For more features and fast professional support,
  7. pick up Xceed Words for .NET at https://xceed.com/xceed-words-for-net/
  8. ***********************************************************************************/
  9. using System;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Xml;
  13. using System.Xml.Linq;
  14. namespace Xceed.Words.NET
  15. {
  16. /// <summary>
  17. /// Represents a table of contents in the document
  18. /// </summary>
  19. public class TableOfContents : DocXElement
  20. {
  21. #region Private Constants
  22. private const string HeaderStyle = "TOCHeading";
  23. private const int RightTabPos = 9350;
  24. #endregion
  25. #region Internal Methods
  26. internal static TableOfContents CreateTableOfContents( DocX document, string title, TableOfContentsSwitches switches, string headerStyle = null, int lastIncludeLevel = 3, int? rightTabPos = null )
  27. {
  28. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsXmlBase, headerStyle ?? HeaderStyle, title, rightTabPos ?? RightTabPos, BuildSwitchString( switches, lastIncludeLevel ) ) ) );
  29. var xml = XElement.Load( reader );
  30. return new TableOfContents( document, xml, headerStyle );
  31. }
  32. #endregion
  33. #region Private Methods
  34. private void InitElement( string elementName, DocX document, string headerStyle = "" )
  35. {
  36. if( elementName == "updateFields" )
  37. {
  38. if( document._settings.Descendants().Any( x => x.Name.Equals( DocX.w + elementName ) ) )
  39. return;
  40. var element = new XElement( XName.Get( elementName, DocX.w.NamespaceName ), new XAttribute( DocX.w + "val", true ) );
  41. document._settings.Root.Add( element );
  42. }
  43. else if( elementName == "styles" )
  44. {
  45. if( !HasStyle( document, headerStyle, "paragraph" ) )
  46. {
  47. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsHeadingStyleBase, headerStyle ?? HeaderStyle ) ) );
  48. var xml = XElement.Load( reader );
  49. document._styles.Root.Add( xml );
  50. }
  51. if( !HasStyle( document, "TOC1", "paragraph" ) )
  52. {
  53. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsElementStyleBase, "TOC1", "toc 1" ) ) );
  54. var xml = XElement.Load( reader );
  55. document._styles.Root.Add( xml );
  56. }
  57. if( !HasStyle( document, "TOC2", "paragraph" ) )
  58. {
  59. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsElementStyleBase, "TOC2", "toc 2" ) ) );
  60. var xml = XElement.Load( reader );
  61. document._styles.Root.Add( xml );
  62. }
  63. if( !HasStyle( document, "TOC3", "paragraph" ) )
  64. {
  65. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsElementStyleBase, "TOC3", "toc 3" ) ) );
  66. var xml = XElement.Load( reader );
  67. document._styles.Root.Add( xml );
  68. }
  69. if( !HasStyle( document, "TOC4", "paragraph" ) )
  70. {
  71. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsElementStyleBase, "TOC4", "toc 4" ) ) );
  72. var xml = XElement.Load( reader );
  73. document._styles.Root.Add( xml );
  74. }
  75. if( !HasStyle( document, "Hyperlink", "character" ) )
  76. {
  77. var reader = XmlReader.Create( new StringReader( string.Format( XmlTemplates.TableOfContentsHyperLinkStyleBase ) ) );
  78. var xml = XElement.Load( reader );
  79. document._styles.Root.Add( xml );
  80. }
  81. }
  82. }
  83. private bool HasStyle( DocX document, string value, string type )
  84. {
  85. return document._styles.Descendants().Any( x => x.Name.Equals( DocX.w + "style" ) && ( x.Attribute( DocX.w + "type" ) == null || x.Attribute( DocX.w + "type" ).Value.Equals( type ) ) && x.Attribute( DocX.w + "styleId" ) != null && x.Attribute( DocX.w + "styleId" ).Value.Equals( value ) );
  86. }
  87. private static string BuildSwitchString( TableOfContentsSwitches switches, int lastIncludeLevel )
  88. {
  89. var allSwitches = Enum.GetValues( typeof( TableOfContentsSwitches ) ).Cast<TableOfContentsSwitches>();
  90. var switchString = "TOC";
  91. foreach( var s in allSwitches.Where( s => s != TableOfContentsSwitches.None && switches.HasFlag( s ) ) )
  92. {
  93. switchString += " " + s.EnumDescription();
  94. if( s == TableOfContentsSwitches.O )
  95. {
  96. switchString += string.Format( " '{0}-{1}'", 1, lastIncludeLevel );
  97. }
  98. }
  99. return switchString;
  100. }
  101. #endregion
  102. #region Constructor
  103. private TableOfContents( DocX document, XElement xml, string headerStyle )
  104. : base( document, xml )
  105. {
  106. InitElement( "updateFields", document );
  107. InitElement( "styles", document, headerStyle );
  108. }
  109. #endregion
  110. }
  111. }