From 25f274f2a08674b75cc50e579aa4b2592fd38a18 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 2 Jul 2018 19:16:22 +0200 Subject: [PATCH] Amend e5c79a43ee781 Consider some tabularx specifics for the display of tabular/column widths in the workarea. --- src/insets/InsetTabular.cpp | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 7cb486f606..bab4b59193 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -1036,7 +1036,9 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi) map max_pwidth; // collect max. variable width of column map max_width; - + // collect max. variable width of xcolumn + map max_xwidth; + for(col_type c = 0; c < ncols(); ++c) for(row_type r = 0; r < nrows(); ++r) { idx_type const i = cellIndex(r, c); @@ -1044,14 +1046,22 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi) max_dwidth[c] = max(max_dwidth[c], cell_info[r][c].decimal_width); if (!getPWidth(i).zero()) max_pwidth[c] = max(max_pwidth[c], cell_info[r][c].width); + else if (column_info[c].varwidth) + max_xwidth[c] = max(max_xwidth[c], cell_info[r][c].width); else max_width[c] = max(max_width[c], cell_info[r][c].width); } // If we have a fixed tabular width, we take this into account + Length tab_width = tabular_width; + bool const tabularx = hasVarwidthColumn(); + if (tabularx && tab_width.zero()) + // If no tabular width is specified with X columns, + // we use 100% colwidth + tab_width = Length(100, Length::PCW); int restwidth = -1; - if (!tabular_width.zero()) { - restwidth = mi.base.inPixels(tabular_width); + if (!tab_width.zero()) { + restwidth = mi.base.inPixels(tab_width); // Substract the fixed widths from the table width for (auto const w : max_pwidth) restwidth -= w.second; @@ -1065,9 +1075,19 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi) vcolwidth = restwidth / restcols; // Now consider that some variable width columns exceed the vcolwidth + // FIXME As opposed to tabular*, tabularx with X column do not exceed + // the overall table width. This is not yet represented, as it + // needs to include row breaking. if (vcolwidth > 0) { bool changed = false; for (auto const w : max_width) { + if (tabularx || w.second > vcolwidth) { + --restcols; + restwidth -= w.second; + changed = true; + } + } + for (auto const w : max_xwidth) { if (w.second > vcolwidth) { --restcols; restwidth -= w.second; @@ -1089,9 +1109,12 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi) && cell_info[r][c].decimal_width != 0) new_width = max(new_width, cellInfo(i).width + max_dwidth[c] - cellInfo(i).decimal_width); - else if (getPWidth(i).zero() && vcolwidth > 0) - new_width = max(vcolwidth, max(new_width, cellInfo(i).width)); - else + else if (getPWidth(i).zero() && vcolwidth > 0) { + if (tabularx && !column_info[c].varwidth) + new_width = max(new_width, cellInfo(i).width); + else + new_width = max(vcolwidth, max(new_width, cellInfo(i).width)); + } else new_width = max(new_width, cellInfo(i).width); } }