/// <summary> /// Generate list /// </summary> /// <param name="items">List of items</param> /// <param name="shape">Text shape</param> /// <param name="level">Indentation level</param> /// <param name="type">Type of list (bulleted/numbered)</param> /// <returns>true if completed; false if paused</returns> private bool GenerateList(List<Node> items, PowerPoint.Shape shape, int level, MsoBulletType type) { Stack<Node> nodes = new Stack<Node>(); Node currentNode; // skip expanding of child nodes to stack bool skip; // show bullet in item bool show_bullet; int itemStartAt, realItemStartAt; int itemsCount = 0; int paragraphs; foreach (Node item in items) { show_bullet = true; realItemStartAt = itemStartAt = shape.TextFrame2.TextRange.Text.Length; paragraphs = 0; itemsCount++; _format.Invalidate(); // copy content to stack foreach (Node node in item.Children.Reverse<Node>()) { nodes.Push(node); } // process nodes on stack while (nodes.Count != 0) { currentNode = nodes.Pop(); skip = false; // process node depending on its type switch (currentNode.Type) { case "string": paragraphs += (int) Misc.CountLinesInString(currentNode.Content as string); _format.AppendText(shape, currentNode.Content as string); break; case "paragraph": paragraphs++; _format.AppendText(shape, "\r"); break; case "pause": if (Pause()) { FormatListItem(shape, type, itemStartAt, level, paragraphs, itemsCount, show_bullet); return false; } break; case "today": shape.TextFrame.TextRange.InsertDateTime(PowerPoint.PpDateTimeFormat.ppDateTimeFigureOut, MsoTriState.msoTrue); break; case "descriptionlist": case "table": case "image": if (!Settings.Instance.NestedAsText) { skip = true; _postProcessing.Enqueue(currentNode); } break; case "bulletlist": case "numberedlist": skip = true; FormatListItem(shape, type, itemStartAt, level, paragraphs, itemsCount, show_bullet); _format.AppendText(shape, "\r"); if (!GenerateList(currentNode.Children, shape, level + 1, currentNode.Type == "bulletlist" ? MsoBulletType.msoBulletUnnumbered : MsoBulletType.msoBulletNumbered)) return false; paragraphs = 0; itemStartAt = shape.TextFrame2.TextRange.Text.Length; show_bullet = false; break; default: // other -> check for simple formats SimpleTextFormat(nodes, currentNode); break; } if (currentNode.Children == null || skip) continue; // push child nodes to stack foreach (Node node in currentNode.Children.Reverse<Node>()) { nodes.Push(node); } } FormatListItem(shape, type, itemStartAt, level, paragraphs, itemsCount, show_bullet); if (!Misc.ShowOverlay(_passNumber, item.OverlayList, ref _maxPass)) { int balancer = shape.TextFrame2.TextRange.Text.EndsWith(" ") ? 1 : 0; shape.TextFrame2.TextRange.Characters[realItemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - realItemStartAt - balancer].Paragraphs.Font.Fill.Visible = MsoTriState.msoFalse; shape.TextFrame2.TextRange.Characters[realItemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - realItemStartAt - balancer].Paragraphs.ParagraphFormat.Bullet.Visible = MsoTriState.msoFalse; } if(!Misc.EndsWithNewLine(shape.TextFrame2.TextRange.Text)) _format.AppendText(shape, "\r"); } return true; }
/// <summary> /// Setup list item (even partial) type, indent etc. /// </summary> /// <param name="shape">List text shape</param> /// <param name="type">Type of bullets</param> /// <param name="itemStartAt">Item starts at character</param> /// <param name="level">Indent level</param> /// <param name="paragraphs">Number of paragraphs</param> /// <param name="itemsCount">Number of items</param> /// <param name="show_bullet">Show bullet</param> private void FormatListItem(PowerPoint.Shape shape, MsoBulletType type, int itemStartAt, int level, int paragraphs, int itemsCount, bool show_bullet) { if (shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1 <= 0) return; if (paragraphs == 0) { shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].ParagraphFormat.Bullet.StartValue = itemsCount; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].ParagraphFormat.Bullet.Type = type; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].ParagraphFormat.IndentLevel = level + 1; if (!show_bullet) { shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].ParagraphFormat.Bullet.Visible = MsoTriState.msoFalse; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].ParagraphFormat.IndentLevel = level + 2; } } else { shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[1, 1].ParagraphFormat.Bullet.StartValue = itemsCount; if (show_bullet) { shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[1, 1].ParagraphFormat.Bullet.Type = type; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[1, 1].ParagraphFormat.IndentLevel = level + 1; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[2, paragraphs].ParagraphFormat.Bullet.Type = type; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[2, paragraphs].ParagraphFormat.Bullet.Visible = MsoTriState.msoFalse; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs[2, paragraphs].ParagraphFormat.IndentLevel = level + 2; } else { shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs.ParagraphFormat.Bullet.Type = type; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs.ParagraphFormat.Bullet.Visible = MsoTriState.msoFalse; shape.TextFrame2.TextRange.Characters[itemStartAt + 1, shape.TextFrame2.TextRange.Text.Length - itemStartAt - 1].Paragraphs.ParagraphFormat.IndentLevel = level + 2; } } }