private void AddCommentsFromXml()
 {
     foreach (XmlElement node in ThreadedCommentsXml.SelectNodes("tc:ThreadedComments/tc:threadedComment", _worksheet.NameSpaceManager))
     {
         var comment     = new ExcelThreadedComment(node, _worksheet.NameSpaceManager, _worksheet.Workbook);
         var cellAddress = comment.CellAddress;
         int i           = -1;
         ExcelThreadedCommentThread thread;
         if (_worksheet._threadedCommentsStore.Exists(cellAddress.Row, cellAddress.Column, ref i))
         {
             thread = _threads[_threadsIndex[i]];
         }
         else
         {
             thread = new ExcelThreadedCommentThread(cellAddress, ThreadedCommentsXml, _worksheet);
             lock (_worksheet._threadedCommentsStore)
             {
                 i = _threads.Count;
                 _worksheet._threadedCommentsStore.SetValue(cellAddress.Row, cellAddress.Column, i);
                 _threadsIndex.Add(i);
                 _threads.Add(thread);
             }
         }
         comment.Thread = thread;
         thread.AddComment(comment);
     }
 }
        /// <summary>
        /// Removes the <see cref="ExcelThreadedCommentThread"/> supplied
        /// </summary>
        /// <param name="threadedComment">An existing <see cref="ExcelThreadedCommentThread"/> in the worksheet</param>
        public void Remove(ExcelThreadedCommentThread threadedComment)
        {
            int i = -1;
            ExcelThreadedCommentThread c = null;

            if (_worksheet._threadedCommentsStore.Exists(threadedComment.CellAddress.Row, threadedComment.CellAddress.Column, ref i))
            {
                c = _threads[i];
            }

            if (threadedComment == c)
            {
                var address = threadedComment.CellAddress;
                _worksheet.Comments.Remove(_worksheet.Comments[address]); //Remove the underlaying comment.
                var nodes = threadedComment.Comments.Select(x => x.TopNode);
                foreach (var node in nodes)
                {
                    node.ParentNode.RemoveChild(node); //Remove xml node
                }
                _worksheet._threadedCommentsStore.Delete(threadedComment.CellAddress.Row, threadedComment.CellAddress.Column, 1, 1, false);
                _threads[i] = null;
                _threadsIndex.Remove(i);
            }
            else
            {
                throw (new ArgumentException("Comment does not exist in the worksheet"));
            }
        }
 internal ExcelThreadedComment(XmlNode topNode, XmlNamespaceManager namespaceManager, ExcelWorkbook workbook, ExcelThreadedCommentThread thread)
     : base(namespaceManager, topNode)
 {
     SchemaNodeOrder = new string[] { "text", "mentions" };
     _workbook       = workbook;
     _thread         = thread;
 }
        public ExcelThreadedCommentThread Add(ExcelCellAddress cellAddress)
        {
            Require.Argument(cellAddress).IsNotNull("cellAddress");
            if (_worksheet._threadedCommentsStore.Exists(cellAddress.Row, cellAddress.Column))
            {
                throw new ArgumentException("There is an existing threaded comment thread in cell " + cellAddress.Address);
            }
            if (_worksheet.Comments[cellAddress] != null)
            {
                throw new InvalidOperationException("There is an existing legacy comment/Note in this cell (" + cellAddress + "). See the Worksheet.Comments property. Legacy comments and threaded comments cannot reside in the same cell.");
            }
            if (ThreadedCommentsXml == null)
            {
                ThreadedCommentsXml = new XmlDocument();
                ThreadedCommentsXml.PreserveWhitespace = true;
                ThreadedCommentsXml.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><ThreadedComments xmlns=\"http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments\" xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"/>");
            }
            var thread = new ExcelThreadedCommentThread(cellAddress, ThreadedCommentsXml, _worksheet);

            _worksheet._threadedCommentsStore.SetValue(cellAddress.Row, cellAddress.Column, _threads.Count);
            _threadsIndex.Add(_threads.Count);
            _threads.Add(thread);
            return(thread);
        }