|  | using System.Collections; | 
|  | using System.Collections.Generic; | 
|  | using System.Xml; | 
|  | using OfficeOpenXml.Utils; | 
|  |  | 
|  | namespace OfficeOpenXml; | 
|  |  | 
|  | public class ExcelProtectedRangeCollection : XmlHelper, IEnumerable<ExcelProtectedRange> { | 
|  | internal ExcelProtectedRangeCollection( | 
|  | XmlNamespaceManager nsm, | 
|  | XmlNode topNode, | 
|  | ExcelWorksheet ws) | 
|  | : base(nsm, topNode) { | 
|  | foreach (XmlNode protectedRangeNode in topNode.SelectNodes( | 
|  | "d:protectedRanges/d:protectedRange", | 
|  | nsm)) { | 
|  | if (!(protectedRangeNode is XmlElement)) { | 
|  | continue; | 
|  | } | 
|  | _baseList.Add( | 
|  | new( | 
|  | protectedRangeNode.Attributes["name"].Value, | 
|  | new(SqRefUtility.FromSqRefAddress(protectedRangeNode.Attributes["sqref"].Value)), | 
|  | nsm, | 
|  | topNode)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private readonly List<ExcelProtectedRange> _baseList = new(); | 
|  |  | 
|  | public ExcelProtectedRange Add(string name, ExcelAddress address) { | 
|  | if (!ExistNode("d:protectedRanges")) { | 
|  | CreateNode("d:protectedRanges"); | 
|  | } | 
|  |  | 
|  | var newNode = CreateNode("d:protectedRanges/d:protectedRange"); | 
|  | var item = new ExcelProtectedRange(name, address, NameSpaceManager, newNode); | 
|  | _baseList.Add(item); | 
|  | return item; | 
|  | } | 
|  |  | 
|  | public void Clear() { | 
|  | DeleteNode("d:protectedRanges"); | 
|  | _baseList.Clear(); | 
|  | } | 
|  |  | 
|  | public bool Contains(ExcelProtectedRange item) { | 
|  | return _baseList.Contains(item); | 
|  | } | 
|  |  | 
|  | public void CopyTo(ExcelProtectedRange[] array, int arrayIndex) { | 
|  | _baseList.CopyTo(array, arrayIndex); | 
|  | } | 
|  |  | 
|  | public int Count => _baseList.Count; | 
|  |  | 
|  | public bool Remove(ExcelProtectedRange item) { | 
|  | DeleteAllNode( | 
|  | "d:protectedRanges/d:protectedRange[@name='" | 
|  | + item.Name | 
|  | + "' and @sqref='" | 
|  | + item.Address.Address | 
|  | + "']"); | 
|  | if (_baseList.Count == 0) { | 
|  | DeleteNode("d:protectedRanges"); | 
|  | } | 
|  | return _baseList.Remove(item); | 
|  | } | 
|  |  | 
|  | public int IndexOf(ExcelProtectedRange item) { | 
|  | return _baseList.IndexOf(item); | 
|  | } | 
|  |  | 
|  | public void RemoveAt(int index) { | 
|  | _baseList.RemoveAt(index); | 
|  | } | 
|  |  | 
|  | public ExcelProtectedRange this[int index] => _baseList[index]; | 
|  |  | 
|  | IEnumerator<ExcelProtectedRange> IEnumerable<ExcelProtectedRange>.GetEnumerator() { | 
|  | return _baseList.GetEnumerator(); | 
|  | } | 
|  |  | 
|  | IEnumerator IEnumerable.GetEnumerator() { | 
|  | return _baseList.GetEnumerator(); | 
|  | } | 
|  | } |