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"); }
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); }
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); }
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; } } } } }
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); }
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; } } }
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); }
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); }
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()); }