]> git.lyx.org Git - features.git/commitdiff
Amend e5c79a43ee781
authorJuergen Spitzmueller <spitz@lyx.org>
Mon, 2 Jul 2018 17:16:22 +0000 (19:16 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Mon, 2 Jul 2018 17:16:22 +0000 (19:16 +0200)
Consider some tabularx specifics for the display of tabular/column widths
in the workarea.

src/insets/InsetTabular.cpp

index 7cb486f606e6128004f102a931a934388f2fa33a..bab4b591934f75709865fa6c861417dcdc46af3f 100644 (file)
@@ -1036,7 +1036,9 @@ bool Tabular::updateColumnWidths(MetricsInfo & mi)
        map<col_type, int> max_pwidth;
        // collect max. variable width of column
        map<col_type, int> max_width;
-       
+       // collect max. variable width of xcolumn
+       map<col_type, int> 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);
                        }
                }