예제 #1
0
        private void RenderListItem(ListItemLayout layout, IContentContainer container)
        {
            //	A list item, which is based on a single design layout, can
            //	include any number of design paragraphs introduced by embedded
            //	HTML <p> tags. To render these as a single item in the Word
            //	list, they must all be rendered as a single Word paragraph.
            //	We achieve this by concatenating all the design paragraphs
            //	together, with double line break separators. The first line
            //	break starts a new line, and the second inserts some whitespace.
            //
            //	A nested list is introduced by a group layout, which is a single
            //	item in the current list and which contains its own list.
            //
            //	We only support text content in list items - no photos.
            //
            //	So the list item layout's content sublayout is always either
            //	a text layout or a group layout. And the list item is always
            //	a single Word paragraph.

            //	The item style is to be found in the item's list's style
            s.ListStyle listStyle           = (s.ListStyle)layout.Style;
            s.TextStyle itemStyle           = listStyle.ItemStyle;
            IParagraph  paragraph           = container.AddParagraph(itemStyle, layout.TrackingInfo);
            int         numberingInstanceId = _numberingInstances.Peek();     // stack guaranteed not to be empty

            paragraph.SetNumbering(numberingInstanceId, _numberingLevel);

            switch (layout.ContentLayout.LayoutType)
            {
            case LayoutType.Text:
            {
                TextLayout   contentLayout = (TextLayout)layout.ContentLayout;
                List <Verse> verses        = contentLayout.GetFormattedText();
                if (verses == null)
                {
                    break;
                }
                if (verses.Count == 0)
                {
                    break;
                }
                foreach (Verse verse in verses)
                {
                    if (verse is ParagraphVerse)
                    {
                        //	Two line breaks to look like a new paragraph without actually
                        //	being a new Word paragraph. But don't do this if it's the first
                        //	verse.
                        if (verse == verses[0])
                        {
                            continue;
                        }
                        paragraph.AddLineBreak();
                        paragraph.AddLineBreak();
                    }
                    else if (verse is LineBreakVerse)
                    {
                        paragraph.AddLineBreak();
                    }
                    else
                    {
                        paragraph.AddRun(verse.Text, verse.Format.Font, verse.Format.Color);
                    }
                }
                break;
            }

            case LayoutType.Group:
            {
                foreach (Layout sublayout in layout.ContentLayout.SubLayouts)
                {
                    Render(sublayout, container);
                }
                break;
            }

            default:
            {
                break;
            }
            }
        }