Exemple #1
0
        /// <summary>
        /// Adds folds to the text editor around each start-end element pair.
        /// </summary>
        /// <remarks>
        /// <para>If the xml is not well formed then no folds are created.</para>
        /// <para>Note that the xml text reader lines and positions start
        /// from 1 and the SharpDevelop text editor line information starts from 0.</para>
        /// </remarks>
        public List <FoldMarker> GenerateFoldMarkers(IDocument document, string fileName, object parseInformation)
        {
            _foldingErrors = new List <string>();
            //showAttributesWhenFolded = XmlEditorAddInOptions.ShowAttributesWhenFolded;

            var foldMarkers = new List <FoldMarker>();
            var stack       = new Stack();

            try
            {
                string xml    = document.TextContent;
                var    reader = new XmlTextReader(new StringReader(xml));
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                        if (!reader.IsEmptyElement)
                        {
                            XmlFoldStart newFoldStart = CreateElementFoldStart(reader);
                            stack.Push(newFoldStart);
                        }
                        break;

                    case XmlNodeType.EndElement:
                        var foldStart = (XmlFoldStart)stack.Pop();
                        CreateElementFold(document, foldMarkers, reader, foldStart);
                        break;

                    case XmlNodeType.Comment:
                        CreateCommentFold(document, foldMarkers, reader);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                _foldingErrors.Add(ex.Message);

                // If the xml is not well formed keep the foldings that already exist in the document.
                return(new List <FoldMarker>(document.FoldingManager.FoldMarker));
            }

            return(foldMarkers);
        }
Exemple #2
0
        /// <summary>
        /// Creates an XmlFoldStart for the start tag of an element.
        /// </summary>
        XmlFoldStart CreateElementFoldStart(XmlTextReader reader)
        {
            // Take off 2 from the line position returned
            // from the xml since it points to the start
            // of the element name and not the beginning
            // tag.
            var newFoldStart = new XmlFoldStart(reader.Prefix, reader.LocalName, reader.LineNumber - 1, reader.LinePosition - 2);

            if (ShowAttributesWhenFolded && reader.HasAttributes)
            {
                newFoldStart.FoldText = String.Concat("<", newFoldStart.Name, " ", GetAttributeFoldText(reader), ">");
            }
            else
            {
                newFoldStart.FoldText = String.Concat("<", newFoldStart.Name, ">");
            }

            return(newFoldStart);
        }
Exemple #3
0
        /// <summary>
        /// Create an element fold if the start and end tag are on
        /// different lines.
        /// </summary>
        void CreateElementFold(IDocument document, List <FoldMarker> foldMarkers, XmlTextReader reader, XmlFoldStart foldStart)
        {
            int endLine = reader.LineNumber - 1;

            if (endLine > foldStart.Line)
            {
                int endCol     = reader.LinePosition + foldStart.Name.Length;
                var foldMarker = new FoldMarker(document, foldStart.Line, foldStart.Column, endLine, endCol, FoldType.TypeBody, foldStart.FoldText);
                foldMarkers.Add(foldMarker);
            }
        }