private static void CreateTableColumns(PrintElementBuildContext buildContext, PrintElementTable table, dynamic columns)
        {
            if (columns != null)
            {
                var autoWidthAvailable = BuildHelper.CalcContentWidth(buildContext.ElementWidth, table.Margin, table.Padding, table.Border.Thickness);
                var autoWidthColumns   = 0;

                // Генерация столбцов
                foreach (var column in columns)
                {
                    var tableColumn = new PrintElementTableColumn();

                    double sizeInPixels;

                    // Если указан абсолютный размер
                    if (BuildHelper.TryToSizeInPixels(column.Size, column.SizeUnit, out sizeInPixels))
                    {
                        // Если размер не превышает доступный остаток
                        if (autoWidthAvailable > sizeInPixels)
                        {
                            autoWidthAvailable -= sizeInPixels;
                        }
                        else
                        {
                            sizeInPixels = autoWidthAvailable;

                            autoWidthAvailable = 0;
                        }

                        tableColumn.Size = sizeInPixels;
                    }
                    // Если размер не указан, он высчитывается автоматически
                    else
                    {
                        ++autoWidthColumns;

                        tableColumn.Size = null;
                    }

                    table.Columns.Add(tableColumn);

                    buildContext.MapElement(tableColumn, column);
                }

                if (autoWidthColumns > 0)
                {
                    var autoWidth = Math.Max(autoWidthAvailable, 0) / autoWidthColumns;

                    foreach (var tableColumn in table.Columns)
                    {
                        if (tableColumn.Size == null)
                        {
                            tableColumn.Size = autoWidth;
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void ShouldBuildTable()
        {
            //Given
            var context = HtmlBuilderTestHelper.CreateHtmlBuilderContext();
            var element = new PrintElementTable();
            var result  = new TextWriterWrapper();

            var text1 = new PrintElementRun {
                Text = "Text11, colspan = 2"
            };
            var cell1 = new PrintElementTableCell
            {
                ColumnSpan = 2,
                Border     = new PrintElementBorder
                {
                    Thickness = new PrintElementThickness(1),
                    Color     = "black"
                }
            };
            var par1 = new PrintElementParagraph();

            par1.Inlines.Add(text1);
            cell1.Block = par1;
            var row1 = new PrintElementTableRow();

            row1.Cells.Add(cell1);

            var text21 = new PrintElementRun {
                Text = "Text21"
            };
            var cell21 = new PrintElementTableCell
            {
                Border = new PrintElementBorder
                {
                    Thickness = new PrintElementThickness(1),
                    Color     = "black"
                }
            };
            var par21 = new PrintElementParagraph();

            par21.Inlines.Add(text21);
            cell21.Block = par21;
            var row2 = new PrintElementTableRow();

            row2.Cells.Add(cell21);

            var text22 = new PrintElementRun {
                Text = "Text22"
            };
            var cell22 = new PrintElementTableCell
            {
                Border = new PrintElementBorder
                {
                    Thickness = new PrintElementThickness(1),
                    Color     = "black"
                }
            };
            var par22 = new PrintElementParagraph();

            par22.Inlines.Add(text22);
            cell22.Block = par22;
            row2.Cells.Add(cell22);

            var column1 = new PrintElementTableColumn {
                Size = 100
            };
            var column2 = new PrintElementTableColumn {
                Size = 200
            };

            element.Columns.Add(column1);
            element.Columns.Add(column2);

            element.Rows.Add(row1);
            element.Rows.Add(row2);

            //When
            context.Build(element, result.Writer);

            //Then
            Assert.AreEqual(Resources.ResultTestShouldBuildTable, result.GetText());
        }