Skip to content

Commit

Permalink
fixing nested table column calculation
Browse files Browse the repository at this point in the history
[patch][fix]
Tables did not act as expected when nested in either another table or another control (eg. <border>). This is fixed by this commit, by now correctly using remaining size for calculations and recalculating once on arrange with the correct sizes.
  • Loading branch information
X39 committed Nov 22, 2023
1 parent ddb1572 commit 24f3cd7
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 8 deletions.
4 changes: 2 additions & 2 deletions source/X39.Solutions.PdfTemplate/Controls/TableCellControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ protected override Size DoMeasure(
var height = 0F;
foreach (var control in Children)
{
var size = control.Measure(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
width = Math.Max(width, size.Width);
height += size.Height;
}
Expand All @@ -50,7 +50,7 @@ protected override Size DoArrange(
var height = 0F;
foreach (var control in Children)
{
var size = control.Arrange(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
width = Math.Max(width, size.Width);
height += size.Height;
_heights.Add(size.Height);
Expand Down
21 changes: 17 additions & 4 deletions source/X39.Solutions.PdfTemplate/Controls/TableControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ protected override Size DoMeasure(
var totalHeight = 0F;
foreach (var control in Children.OfType<TableHeaderControl>())
{
var size = control.Measure(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
totalHeaderHeight += size.Height;
maxWidth = Math.Max(maxWidth, size.Width);
}

var currentHeight = remainingSize.Height;
foreach (var control in Children.OfType<TableRowControl>())
{
var size = control.Measure(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
maxWidth = Math.Max(maxWidth, size.Width);
if (currentHeight + size.Height >= remainingSize.Height)
{
Expand Down Expand Up @@ -192,20 +192,33 @@ protected override Size DoArrange(
in Size remainingSize,
CultureInfo cultureInfo)
{
var outWidths = CalculateWidths(
framedPageSize.Width,
CellWidths.Values
.Select((q) => (q.columnLength, q.desiredWitdth))
.ToArray());
for (var i = 0; i < CellWidths.Count; i++)
{
var key = CellWidths.Keys.ElementAt(i);
var (_, columnLength) = CellWidths[key];
var newValue = (outWidths.ElementAt(i), columnLength);
CellWidths[key] = newValue;
}

var totalHeaderHeight = 0F;
var maxWidth = 0F;
var totalHeight = 0F;
foreach (var control in Children.OfType<TableHeaderControl>())
{
var size = control.Arrange(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
totalHeaderHeight += size.Height;
maxWidth = Math.Max(maxWidth, size.Width);
}

var currentHeight = remainingSize.Height;
foreach (var control in Children.OfType<TableRowControl>())
{
var size = control.Arrange(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
maxWidth = Math.Max(maxWidth, size.Width);
if (currentHeight + size.Height >= remainingSize.Height)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected override Size DoMeasure(
var height = 0F;
foreach (var (control, index) in Children.Cast<TableCellControl>().Indexed())
{
var size = control.Measure(fullPageSize, framedPageSize, remainingSize, cultureInfo);
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
width += size.Width;
height = Math.Max(height, size.Height);
if (Table.CellWidths.TryGetValue(index, out var tuple))
Expand Down Expand Up @@ -67,7 +67,7 @@ protected override Size DoArrange(
Width = cellWidth,
Height = MeasurementInner.Height,
};
var size = control.Arrange(fullPageSize, framedPageSize, remainingCellSize, cultureInfo);
var size = control.Arrange(fullPageSize, remainingCellSize, remainingCellSize, cultureInfo);
width += cellWidth;
height = Math.Max(height, size.Height);
}
Expand Down

0 comments on commit 24f3cd7

Please sign in to comment.