protected override void OnRefreshDocumentOutline()
        {
            base.OnRefreshDocumentOutline();
            // Show document headings
            var parser       = new WikitextParser();
            var documentText = TextBox.Text;

            Heading[] headings = null;
            if (!string.IsNullOrWhiteSpace(documentText))
            {
                var root = parser.Parse(documentText);
                headings = root.EnumDescendants().OfType <Heading>().ToArray();
            }
            Dispatcher.AutoInvoke(() =>
            {
                DocumentOutline.Clear();
                if (headings == null)
                {
                    return;
                }
                var levelStack = new Stack <Tuple <Heading, DocumentOutlineItem> >();
                foreach (var h in headings)
                {
                    var outline = new DocumentOutlineItem
                    {
                        Text           = string.Join(null, h.Inlines).Trim(),
                        OutlineContext = h
                    };
                    outline.DoubleClick += OutlineItem_DoubleClick;
                    while (levelStack.Count > 0)
                    {
                        var lastLevel = levelStack.Peek().Item1.Level;
                        if (lastLevel < h.Level)
                        {
                            // Append as child item.
                            levelStack.Peek().Item2.Children.Add(outline);
                            goto NEXT;
                        }
                        // Sibling or upper levels.
                        levelStack.Pop();
                    }
                    // levelStack.Count == 0
                    DocumentOutline.Add(outline);
                    levelStack.Push(Tuple.Create(h, outline));
                    NEXT:
                    ;
                }
            });
        }
Example #2
0
        /// <summary>
        /// Parses a DocumentOutline element.
        /// </summary>
        DocumentOutline ParseDocumentOutline()
        {
            Debug.Assert(reader.Name == "DocumentOutline");
            bool            isEmptyElement  = reader.IsEmptyElement;
            DocumentOutline documentOutline = new DocumentOutline();

            while (MoveToNextAttribute())
            {
                switch (reader.Name)
                {
                case "xml:lang":
                    documentOutline.lang = reader.Value;
                    break;

                default:
                    UnexpectedAttribute(reader.Name);
                    break;
                }
            }
            MoveToNextElement();
            return(documentOutline);
        }