コード例 #1
0
        public void ShouldBuildTable()
        {
            // Given

            dynamic tableColumn1 = new DynamicWrapper();
            dynamic tableColumn2 = new DynamicWrapper();
            dynamic tableColumn3 = new DynamicWrapper();

            dynamic tableRow1   = new DynamicWrapper();
            dynamic tableCell11 = CreateTableCellByText("11");
            dynamic tableCell12 = CreateTableCellByText("12");
            dynamic tableCell13 = CreateTableCellByText("13");

            tableRow1.Cells = new[] { tableCell11, tableCell12, tableCell13 };

            dynamic tableRow2   = new DynamicWrapper();
            dynamic tableCell21 = CreateTableCellByText("21");
            dynamic tableCell22 = CreateTableCellByText("22");
            dynamic tableCell23 = CreateTableCellByText("23");

            tableRow2.Cells = new[] { tableCell21, tableCell22, tableCell23 };

            dynamic tableRow3   = new DynamicWrapper();
            dynamic tableCell31 = CreateTableCellByText("31");
            dynamic tableCell32 = CreateTableCellByText("32");
            dynamic tableCell33 = CreateTableCellByText("33");

            tableRow3.Cells = new[] { tableCell31, tableCell32, tableCell33 };

            dynamic elementMetadata = new DynamicWrapper();

            elementMetadata.ShowHeader = false;
            elementMetadata.Columns    = new[] { tableColumn1, tableColumn2, tableColumn3 };
            elementMetadata.Rows       = new[] { tableRow1, tableRow2, tableRow3 };

            // When
            PrintElementTable element = BuildTestHelper.BuildTable(elementMetadata);

            // Then

            Assert.IsNotNull(element);

            Assert.AreEqual(3, element.Columns.Count);
            Assert.AreEqual(3, element.Rows.Count);

            AssertTableCell(element, 0, 0, "11");
            AssertTableCell(element, 0, 1, "12");
            AssertTableCell(element, 0, 2, "13");

            AssertTableCell(element, 1, 0, "21");
            AssertTableCell(element, 1, 1, "22");
            AssertTableCell(element, 1, 2, "23");

            AssertTableCell(element, 2, 0, "31");
            AssertTableCell(element, 2, 1, "32");
            AssertTableCell(element, 2, 2, "33");
        }
コード例 #2
0
 private static void AssertTableCell(PrintElementTable table, int row, int column, string text)
 {
     Assert.AreEqual(text,
                     ((PrintElementRun)((PrintElementParagraph)table.Rows[row].Cells[column].Block).Inlines.First()).Text);
 }
コード例 #3
0
        private static PrintElementTableCell CreateTableCell(PrintElementBuildContext buildContext, PrintElementTable table, int columnIndex, dynamic cellMetadata, bool applySpan)
        {
            var tableCell = new PrintElementTableCell
            {
                ColumnSpan = 1,
                RowSpan    = 1,
                Border     = new PrintElementBorder
                {
                    Thickness = new PrintElementThickness(0, 0, 1, 1),
                    Color     = PrintElementColors.Black
                },
                Padding = BuildHelper.DefaultPadding
            };

            if (cellMetadata != null)
            {
                var cellStyle = buildContext.FindStyle(cellMetadata.Style);

                // Установка общих свойств для текста
                BuildHelper.ApplyTextProperties(tableCell, cellStyle);
                BuildHelper.ApplyTextProperties(tableCell, cellMetadata);

                // Установка общих свойств ячейки таблицы
                BuildHelper.ApplyTableCellProperties(tableCell, cellStyle);
                BuildHelper.ApplyTableCellProperties(tableCell, cellMetadata);

                // Объединение ячеек по горизонтали и вертикали
                if (applySpan)
                {
                    tableCell.ColumnSpan = GetCellSpan(cellMetadata.ColumnSpan);
                    tableCell.RowSpan    = GetCellSpan(cellMetadata.RowSpan);
                }

                // Вычисление ширины ячейки для размещения содержимого

                var cellWidth = 0.0;

                for (var i = columnIndex; (i < columnIndex + tableCell.ColumnSpan) && (i < table.Columns.Count); ++i)
                {
                    cellWidth += table.Columns[i].Size.Value;
                }

                cellWidth = BuildHelper.CalcContentWidth(cellWidth, tableCell.Padding, tableCell.Border.Thickness);

                // Создание содержимого и помещение его в ячейку

                var cellContext = buildContext.Create(cellWidth);
                var cellContent = buildContext.ElementBuilder.BuildElement(cellContext, cellMetadata.Block);

                if (cellContent is PrintElementBlock)
                {
                    tableCell.Block = cellContent;
                }

                // Пост-установка общих свойств для текста
                BuildHelper.PostApplyTextProperties(tableCell, cellStyle);
                BuildHelper.PostApplyTextProperties(tableCell, cellMetadata);
            }

            buildContext.MapElement(tableCell, cellMetadata);

            return(tableCell);
        }
コード例 #4
0
        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;
                        }
                    }
                }
            }
        }
コード例 #5
0
        private static PrintElementTableRow CreateDynamicTableRow(PrintElementBuildContext buildContext, PrintElementTable table, dynamic columns, object rowSource)
        {
            var tableRow = new PrintElementTableRow();

            if (columns != null)
            {
                var rowContext = buildContext.Create(buildContext.ElementWidth);
                rowContext.ElementSourceValue = rowSource;

                var columnIndex = 0;

                foreach (var column in columns)
                {
                    var cellMetadata = column.CellTemplate;
                    var tableCell    = CreateTableCell(rowContext, table, columnIndex, cellMetadata, false);
                    tableRow.Cells.Add(tableCell);

                    ++columnIndex;
                }
            }

            return(tableRow);
        }
コード例 #6
0
        private static void CreateStaticTableRows(PrintElementBuildContext buildContext, PrintElementTable table, dynamic rows)
        {
            if (rows != null)
            {
                var rowIndex     = 0;
                var columnCount  = table.Columns.Count;
                var skippedCells = new List <int>();

                foreach (var rowMetadata in rows)
                {
                    var tableRow = new PrintElementTableRow();

                    if (rowMetadata != null)
                    {
                        var rowStyle = buildContext.FindStyle(rowMetadata.Style);

                        // Установка общих свойств для текста
                        BuildHelper.ApplyTextProperties(tableRow, rowStyle);
                        BuildHelper.ApplyTextProperties(tableRow, rowMetadata);

                        for (var columnIndex = 0; columnIndex < columnCount; ++columnIndex)
                        {
                            var cellOffset = GetCellOffset(columnCount, rowIndex, columnIndex);

                            // Если ячейку не нужно отображать (из-за настроек RowSpan или ColumnSpan)
                            if (!skippedCells.Contains(cellOffset))
                            {
                                var cellMetadata = (rowMetadata.Cells != null) ? Enumerable.ElementAtOrDefault(rowMetadata.Cells, columnIndex) : null;
                                var tableCell    = CreateTableCell(buildContext, table, columnIndex, cellMetadata, true);
                                tableRow.Cells.Add(tableCell);

                                AddSkippedCells(skippedCells, columnCount, rowIndex, columnIndex, cellMetadata);
                            }
                        }

                        // Пост-установка общих свойств для текста
                        BuildHelper.PostApplyTextProperties(tableRow, rowStyle);
                        BuildHelper.PostApplyTextProperties(tableRow, rowMetadata);
                    }

                    buildContext.MapElement(tableRow, rowMetadata);

                    table.Rows.Add(tableRow);

                    ++rowIndex;
                }
            }
        }
コード例 #7
0
        private static PrintElementTableRow CreateHeaderTableRow(PrintElementBuildContext buildContext, PrintElementTable table, dynamic columns)
        {
            var tableRow = new PrintElementTableRow();

            if (columns != null)
            {
                var columnIndex = 0;

                foreach (var column in columns)
                {
                    var cellMetadata = column.Header;
                    var tableCell    = CreateTableCell(buildContext, table, columnIndex, cellMetadata, false);
                    tableRow.Cells.Add(tableCell);

                    ++columnIndex;
                }
            }

            return(tableRow);
        }
コード例 #8
0
        public object Create(PrintElementBuildContext buildContext, dynamic elementMetadata)
        {
            var element = new PrintElementTable
            {
                Border = new PrintElementBorder
                {
                    Thickness = new PrintElementThickness(1, 1, 0, 0),
                    Color     = PrintElementColors.Black
                },
                Margin  = BuildHelper.DefaultMargin,
                Padding = BuildHelper.DefaultPadding,
            };

            BuildHelper.ApplyTextProperties(element, buildContext.ElementStyle);
            BuildHelper.ApplyTextProperties(element, elementMetadata);

            BuildHelper.ApplyBlockProperties(element, buildContext.ElementStyle);
            BuildHelper.ApplyBlockProperties(element, elementMetadata);

            // Генерация стобцов таблицы

            CreateTableColumns(buildContext, element, elementMetadata.Columns);

            // Генерация заголовка таблицы

            bool showHeader;

            if (!ConvertHelper.TryToBool(elementMetadata.ShowHeader, out showHeader) || showHeader)
            {
                var tableRow = CreateHeaderTableRow(buildContext, element, elementMetadata.Columns);
                element.Rows.Add(tableRow);
            }

            // Генерация явно объявленных строк таблицы

            CreateStaticTableRows(buildContext, element, elementMetadata.Rows);

            // Генерация строк таблицы по данным источника

            var tableSource = buildContext.ElementSourceValue;

            if (ConvertHelper.ObjectIsCollection(tableSource))
            {
                if (HasCellTemplate(elementMetadata.Columns))
                {
                    foreach (var rowSource in (IEnumerable)tableSource)
                    {
                        var tableRow = CreateDynamicTableRow(buildContext, element, elementMetadata.Columns, rowSource);
                        element.Rows.Add(tableRow);
                    }
                }
            }
            else if (buildContext.IsDesignMode)
            {
                // Отображение шаблона строки в дизайнере

                if (HasCellTemplate(elementMetadata.Columns))
                {
                    var tableRow = CreateDynamicTableRow(buildContext, element, elementMetadata.Columns, null);
                    element.Rows.Add(tableRow);
                }
            }

            BuildHelper.PostApplyTextProperties(element, buildContext.ElementStyle);
            BuildHelper.PostApplyTextProperties(element, elementMetadata);

            return(element);
        }
コード例 #9
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());
        }