Fixed calculation when cell widths are percentages.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74991 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -9926,10 +9926,6 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
|
|
||||||
for (j = 0; j < m_rowCount; j++)
|
for (j = 0; j < m_rowCount; j++)
|
||||||
{
|
{
|
||||||
// First get the overall margins so we can calculate percentage widths based on
|
|
||||||
// the available content space for all cells on the row
|
|
||||||
|
|
||||||
int overallRowContentMargin = 0;
|
|
||||||
int visibleCellCount = 0;
|
int visibleCellCount = 0;
|
||||||
|
|
||||||
for (i = 0; i < m_colCount; i++)
|
for (i = 0; i < m_colCount; i++)
|
||||||
@@ -9937,22 +9933,14 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
wxRichTextBox* cell = GetCell(j, i);
|
wxRichTextBox* cell = GetCell(j, i);
|
||||||
if (cell->IsShown())
|
if (cell->IsShown())
|
||||||
{
|
{
|
||||||
int cellTotalLeftMargin = 0, cellTotalRightMargin = 0, cellTotalTopMargin = 0, cellTotalBottomMargin = 0;
|
|
||||||
wxRichTextAttr cellAttr(cell->GetAttributes());
|
|
||||||
cell->AdjustAttributes(cellAttr, context);
|
|
||||||
GetTotalMargin(dc, buffer, cellAttr, cellTotalLeftMargin, cellTotalRightMargin, cellTotalTopMargin, cellTotalBottomMargin);
|
|
||||||
|
|
||||||
overallRowContentMargin += (cellTotalLeftMargin + cellTotalRightMargin);
|
|
||||||
visibleCellCount ++;
|
visibleCellCount ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add in inter-cell padding
|
// Cell width percentages are for the overall cell width, so ignore margins and
|
||||||
overallRowContentMargin += ((visibleCellCount-1) * paddingX);
|
// only take into account table margins and inter-cell padding.
|
||||||
|
int availableWidthForPercentageCellWidths = internalTableWidth - ((visibleCellCount-1) * paddingX);
|
||||||
int rowContentWidth = internalTableWidth - overallRowContentMargin;
|
wxTextAttrDimensionConverter converter(dc, scale, wxSize(availableWidthForPercentageCellWidths, 0));
|
||||||
wxSize rowTableSize(rowContentWidth, 0);
|
|
||||||
wxTextAttrDimensionConverter converter(dc, scale, rowTableSize);
|
|
||||||
|
|
||||||
for (i = 0; i < m_colCount; i++)
|
for (i = 0; i < m_colCount; i++)
|
||||||
{
|
{
|
||||||
@@ -9970,22 +9958,6 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
int absoluteCellWidth = -1;
|
int absoluteCellWidth = -1;
|
||||||
int percentageCellWidth = -1;
|
int percentageCellWidth = -1;
|
||||||
|
|
||||||
// I think we need to calculate percentages from the internal table size,
|
|
||||||
// minus the padding between cells which we'll need to calculate from the
|
|
||||||
// (number of VISIBLE cells - 1)*paddingX. Then percentages that add up to 100%
|
|
||||||
// will add up to 100%. In CSS, the width specifies the cell's content rect width,
|
|
||||||
// so if we want to conform to that we'll need to add in the overall cell margins.
|
|
||||||
// However, this will make it difficult to specify percentages that add up to
|
|
||||||
// 100% and still fit within the table width.
|
|
||||||
// Let's say two cells have 50% width. They have 10 pixels of overall margin each.
|
|
||||||
// The table content rect is 500 pixels and the inter-cell padding is 20 pixels.
|
|
||||||
// If we're using internal content size for the width, we would calculate the
|
|
||||||
// the overall cell width for n cells as:
|
|
||||||
// (500 - 20*(n-1) - overallCellMargin1 - overallCellMargin2 - ...) * percentage / 100
|
|
||||||
// + thisOverallCellMargin
|
|
||||||
// = 500 - 20 - 10 - 10) * 0.5 + 10 = 240 pixels overall cell width.
|
|
||||||
// Adding this back, we get 240 + 240 + 20 = 500 pixels.
|
|
||||||
|
|
||||||
if (cell->GetAttributes().GetTextBoxAttr().GetWidth().IsValid())
|
if (cell->GetAttributes().GetTextBoxAttr().GetWidth().IsValid())
|
||||||
{
|
{
|
||||||
int w = converter.GetPixels(cell->GetAttributes().GetTextBoxAttr().GetWidth());
|
int w = converter.GetPixels(cell->GetAttributes().GetTextBoxAttr().GetWidth());
|
||||||
@@ -9998,7 +9970,7 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
absoluteCellWidth = w;
|
absoluteCellWidth = w;
|
||||||
}
|
}
|
||||||
// Override absolute width with minimum width if necessary
|
// Override absolute width with minimum width if necessary
|
||||||
if (cell->GetMinSize().x > 0 && absoluteCellWidth !=1 && cell->GetMinSize().x > absoluteCellWidth)
|
if (cell->GetMinSize().x > 0 && absoluteCellWidth != -1 && cell->GetMinSize().x > absoluteCellWidth)
|
||||||
absoluteCellWidth = cell->GetMinSize().x;
|
absoluteCellWidth = cell->GetMinSize().x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -10018,6 +9990,7 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
|
|
||||||
if (colSpan == 1 && cell->GetMinSize().x && cell->GetMinSize().x > minColWidths[i])
|
if (colSpan == 1 && cell->GetMinSize().x && cell->GetMinSize().x > minColWidths[i])
|
||||||
minColWidths[i] = cell->GetMinSize().x;
|
minColWidths[i] = cell->GetMinSize().x;
|
||||||
|
|
||||||
if (colSpan == 1 && cell->GetMaxSize().x && cell->GetMaxSize().x > maxColWidths[i])
|
if (colSpan == 1 && cell->GetMaxSize().x && cell->GetMaxSize().x > maxColWidths[i])
|
||||||
maxColWidths[i] = cell->GetMaxSize().x;
|
maxColWidths[i] = cell->GetMaxSize().x;
|
||||||
}
|
}
|
||||||
@@ -10050,10 +10023,6 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
// specified explicitly or not. (We could make a note if necessary.)
|
// specified explicitly or not. (We could make a note if necessary.)
|
||||||
for (j = 0; j < m_rowCount; j++)
|
for (j = 0; j < m_rowCount; j++)
|
||||||
{
|
{
|
||||||
// First get the overall margins so we can calculate percentage widths based on
|
|
||||||
// the available content space for all cells on the row
|
|
||||||
|
|
||||||
int overallRowContentMargin = 0;
|
|
||||||
int visibleCellCount = 0;
|
int visibleCellCount = 0;
|
||||||
|
|
||||||
for (i = 0; i < m_colCount; i++)
|
for (i = 0; i < m_colCount; i++)
|
||||||
@@ -10061,22 +10030,14 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
wxRichTextBox* cell = GetCell(j, i);
|
wxRichTextBox* cell = GetCell(j, i);
|
||||||
if (cell->IsShown())
|
if (cell->IsShown())
|
||||||
{
|
{
|
||||||
int cellTotalLeftMargin = 0, cellTotalRightMargin = 0, cellTotalTopMargin = 0, cellTotalBottomMargin = 0;
|
|
||||||
wxRichTextAttr cellAttr(cell->GetAttributes());
|
|
||||||
cell->AdjustAttributes(cellAttr, context);
|
|
||||||
GetTotalMargin(dc, buffer, cellAttr, cellTotalLeftMargin, cellTotalRightMargin, cellTotalTopMargin, cellTotalBottomMargin);
|
|
||||||
|
|
||||||
overallRowContentMargin += (cellTotalLeftMargin + cellTotalRightMargin);
|
|
||||||
visibleCellCount ++;
|
visibleCellCount ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add in inter-cell padding
|
// Cell width percentages are for the overall cell width, so ignore margins and
|
||||||
overallRowContentMargin += ((visibleCellCount-1) * paddingX);
|
// only take into account table margins and inter-cell padding.
|
||||||
|
int availableWidthForPercentageCellWidths = internalTableWidth - ((visibleCellCount-1) * paddingX);
|
||||||
int rowContentWidth = internalTableWidth - overallRowContentMargin;
|
wxTextAttrDimensionConverter converter(dc, scale, wxSize(availableWidthForPercentageCellWidths, 0));
|
||||||
wxSize rowTableSize(rowContentWidth, 0);
|
|
||||||
wxTextAttrDimensionConverter converter(dc, scale, rowTableSize);
|
|
||||||
|
|
||||||
for (i = 0; i < m_colCount; i++)
|
for (i = 0; i < m_colCount; i++)
|
||||||
{
|
{
|
||||||
@@ -10094,7 +10055,7 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
{
|
{
|
||||||
cellWidth = converter.GetPixels(cell->GetAttributes().GetTextBoxAttr().GetWidth());
|
cellWidth = converter.GetPixels(cell->GetAttributes().GetTextBoxAttr().GetWidth());
|
||||||
// Override absolute width with minimum width if necessary
|
// Override absolute width with minimum width if necessary
|
||||||
if (cell->GetMinSize().x > 0 && cellWidth !=1 && cell->GetMinSize().x > cellWidth)
|
if (cell->GetMinSize().x > 0 && cellWidth != -1 && cell->GetMinSize().x > cellWidth)
|
||||||
cellWidth = cell->GetMinSize().x;
|
cellWidth = cell->GetMinSize().x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user