Improved calculation of spanning column widths.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76154 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -10132,6 +10132,11 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
wxArrayInt minColWidthsNoWrap;
|
wxArrayInt minColWidthsNoWrap;
|
||||||
minColWidthsNoWrap.Add(0, m_colCount);
|
minColWidthsNoWrap.Add(0, m_colCount);
|
||||||
|
|
||||||
|
// Record the maximum spanning widths
|
||||||
|
wxArrayInt spanningWidths, spanningWidthsSpanLengths;
|
||||||
|
spanningWidths.Add(0, m_colCount);
|
||||||
|
spanningWidthsSpanLengths.Add(0, m_colCount);
|
||||||
|
|
||||||
wxSize tableSize(tableWidth, 0);
|
wxSize tableSize(tableWidth, 0);
|
||||||
|
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
@@ -10323,11 +10328,7 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
// (3) Process absolute or proportional widths of spanning columns,
|
// (3) Process absolute or proportional widths of spanning columns,
|
||||||
// now that we know what our fixed column widths are going to be.
|
// now that we know what our fixed column widths are going to be.
|
||||||
// Spanned cells will try to adjust columns so the span will fit.
|
// Spanned cells will try to adjust columns so the span will fit.
|
||||||
// Even existing fixed column widths can be expanded if necessary.
|
// Currently fixed columns widths aren't adjusted.
|
||||||
// Actually, currently fixed columns widths aren't adjusted; instead,
|
|
||||||
// the algorithm favours earlier rows and adjusts unspecified column widths
|
|
||||||
// the first time only. After that, we can't know whether the column has been
|
|
||||||
// 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++)
|
||||||
{
|
{
|
||||||
int visibleCellCount = 0;
|
int visibleCellCount = 0;
|
||||||
@@ -10367,15 +10368,6 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Do we want to do this? It's the only chance we get to
|
|
||||||
// use the cell's min/max sizes, so we need to work out
|
|
||||||
// how we're going to balance the unspecified spanning cell
|
|
||||||
// width with the possibility more-constrained constituent cell widths.
|
|
||||||
// Say there's a tiny bitmap giving it a max width of 10 pixels. We
|
|
||||||
// don't want to constraint all the spanned columns to fit into this cell.
|
|
||||||
// OK, let's say that if any of the constituent columns don't fit,
|
|
||||||
// then we simply stop constraining the columns; instead, we'll just fit the spanning
|
|
||||||
// cells to the columns later.
|
|
||||||
cellWidth = cell->GetMinSize().x;
|
cellWidth = cell->GetMinSize().x;
|
||||||
|
|
||||||
if (cell->GetMaxSize().x > cellWidth)
|
if (cell->GetMaxSize().x > cellWidth)
|
||||||
@@ -10388,42 +10380,12 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
|
|
||||||
if (spanningWidth > 0)
|
if (spanningWidth > 0)
|
||||||
{
|
{
|
||||||
// Now share the spanning width between columns within that span
|
if (spanningWidth > spanningWidths[i])
|
||||||
int spanningWidthLeft = spanningWidth;
|
|
||||||
int stretchColCount = 0;
|
|
||||||
for (k = i; k < (i+spans); k++)
|
|
||||||
{
|
{
|
||||||
int minColWidth = wxMax(minColWidths[k], minColWidthsNoWrap[k]);
|
// Remember the largest spanning cell for this column,
|
||||||
|
// so we can adjust the spanned columns in the next step.
|
||||||
if (colWidths[k] > 0) // absolute or proportional width has been specified
|
spanningWidths[i] = spanningWidth;
|
||||||
spanningWidthLeft -= colWidths[k];
|
spanningWidthsSpanLengths[i] = spans;
|
||||||
else if (minColWidth > 0)
|
|
||||||
spanningWidthLeft -= minColWidth;
|
|
||||||
else
|
|
||||||
stretchColCount ++;
|
|
||||||
}
|
|
||||||
// Now divide what's left between the remaining columns
|
|
||||||
int colShare = 0;
|
|
||||||
if (stretchColCount > 0)
|
|
||||||
colShare = spanningWidthLeft / stretchColCount;
|
|
||||||
int colShareRemainder = spanningWidthLeft - (colShare * stretchColCount);
|
|
||||||
|
|
||||||
// If fixed-width columns are currently too big, then we'll later
|
|
||||||
// stretch the spanned cell to fit.
|
|
||||||
|
|
||||||
if (spanningWidthLeft > 0)
|
|
||||||
{
|
|
||||||
for (k = i; k < (i+spans); k++)
|
|
||||||
{
|
|
||||||
int minColWidth = wxMax(minColWidths[k], minColWidthsNoWrap[k]);
|
|
||||||
if (colWidths[k] <= 0 && minColWidth <= 0) // absolute or proportional width has not been specified
|
|
||||||
{
|
|
||||||
int newWidth = colShare;
|
|
||||||
if (k == (i+spans-1))
|
|
||||||
newWidth += colShareRemainder; // ensure all pixels are filled
|
|
||||||
colWidths[k] = newWidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10432,6 +10394,61 @@ bool wxRichTextTable::Layout(wxDC& dc, wxRichTextDrawingContext& context, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Complete the spanning width calculation, now we have the maximum spanning size
|
||||||
|
// for each spanning cell
|
||||||
|
for (i = 0; i < m_colCount; i++)
|
||||||
|
{
|
||||||
|
int spanningWidth = spanningWidths[i];
|
||||||
|
int spans = spanningWidthsSpanLengths[i];
|
||||||
|
if (spanningWidth > 0)
|
||||||
|
{
|
||||||
|
// Now share the spanning width between columns within that span
|
||||||
|
int spanningWidthLeft = spanningWidth;
|
||||||
|
int stretchColCount = 0;
|
||||||
|
for (k = i; k < (i+spans); k++)
|
||||||
|
{
|
||||||
|
int minColWidth = wxMax(minColWidths[k], minColWidthsNoWrap[k]);
|
||||||
|
|
||||||
|
if (colWidths[k] > 0) // absolute or proportional width has been specified
|
||||||
|
spanningWidthLeft -= colWidths[k];
|
||||||
|
else if (minColWidth > 0)
|
||||||
|
{
|
||||||
|
spanningWidthLeft -= minColWidth;
|
||||||
|
// Allow this to stretch, otherwise we're likely to not allow
|
||||||
|
// any stretching and the spanned column will end up tiny.
|
||||||
|
stretchColCount ++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
stretchColCount ++;
|
||||||
|
}
|
||||||
|
// Now divide what's left between the remaining columns
|
||||||
|
int colShare = 0;
|
||||||
|
if (stretchColCount > 0)
|
||||||
|
colShare = spanningWidthLeft / stretchColCount;
|
||||||
|
int colShareRemainder = spanningWidthLeft - (colShare * stretchColCount);
|
||||||
|
|
||||||
|
// If fixed-width columns are currently too big, then we'll later
|
||||||
|
// stretch the spanned cell to fit.
|
||||||
|
if (spanningWidthLeft > 0)
|
||||||
|
{
|
||||||
|
for (k = i; k < (i+spans); k++)
|
||||||
|
{
|
||||||
|
int minColWidth = wxMax(minColWidths[k], minColWidthsNoWrap[k]);
|
||||||
|
if (colWidths[k] <= 0) // absolute or proportional width has not been specified
|
||||||
|
{
|
||||||
|
int newWidth = colShare;
|
||||||
|
if (minColWidth > 0)
|
||||||
|
newWidth += minColWidth;
|
||||||
|
|
||||||
|
if (k == (i+spans-1))
|
||||||
|
newWidth += colShareRemainder; // ensure all pixels are filled
|
||||||
|
minColWidths[k] = newWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// (4) Next, share any remaining space out between columns that have not yet been calculated.
|
// (4) Next, share any remaining space out between columns that have not yet been calculated.
|
||||||
// TODO: take into account min widths of columns within the span
|
// TODO: take into account min widths of columns within the span
|
||||||
int tableWidthMinusPadding = internalTableWidth - (m_colCount-1)*paddingX;
|
int tableWidthMinusPadding = internalTableWidth - (m_colCount-1)*paddingX;
|
||||||
|
Reference in New Issue
Block a user