]> git.lyx.org Git - features.git/commitdiff
Fix multicolumn regression (bug #9788)
authorGeorg Baum <baum@lyx.org>
Sat, 10 Oct 2015 16:58:18 +0000 (18:58 +0200)
committerGeorg Baum <baum@lyx.org>
Sat, 10 Oct 2015 16:58:18 +0000 (18:58 +0200)
The test case did show several problems:
- The alignment argument was not parsed correctly if it was not in braces
- There one column too much created, since I did not take into account that
  the current cell must bge replaced by the multicolumn cell
- If the last line of an array contained only an empty multicolumn cell, then
  the complete multicolumn was swallowed
- The decision whether to output the column separator & was sometimes wrong
  for multicolumns

src/mathed/InsetMathGrid.cpp
src/mathed/MathParser.cpp

index ae325583617d165e3c4cf4181b91a353a6ec5759..a9970f440efeb959b6b7a4e80d9516c9e4390e5c 100644 (file)
@@ -1256,12 +1256,11 @@ void InsetMathGrid::write(WriteStream & os,
                bool last_eoln = true;
                for (col_type col = beg_col; col < end_col; ++col) {
                        idx_type const idx = index(row, col);
-                       if (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN)
-                               continue;
                        bool const empty_cell = cell(idx).empty();
-                       if (!empty_cell)
+                       if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL)
                                last_eoln = false;
-                       if (!empty_cell || colinfo_[col + 1].lines_) {
+                       if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL ||
+                           colinfo_[col + 1].lines_) {
                                lastcol = col + 1;
                                emptyline = false;
                        }
@@ -1284,7 +1283,7 @@ void InsetMathGrid::write(WriteStream & os,
                                ModeSpecifier specifier(os, TEXT_MODE);
                        if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN)
                                os << '}';
-                       os << eocString(col, lastcol);
+                       os << eocString(col + nccols - 1, lastcol);
                        col += nccols;
                }
                eol = eolString(row, os.fragile(), os.latex(), last_eoln);
index 0f10aa5ed75c7104c38d94e18e72b7c8dee8d8bd..2849b0f80b79c46ca36269c68f413ee8b46c6a34 100644 (file)
@@ -229,6 +229,8 @@ bool addCol(InsetMathGrid & grid, InsetMathGrid::col_type & cellcol)
  * \endverbatim
  * will result in a grid with 3 rows (+ the dummy row that is always present),
  * because the last '\\' opens a new row.
+ * Do never delete a row that contains a multicolumn, even if all cells empty,
+ * since the multicolumn information would get lost otherwise.
  * Note that this is only needed for inner-hull grid types, such as array
  * or aligned, but not for outer-hull grid types, such as eqnarray or align.
  */
@@ -236,7 +238,9 @@ void delEmptyLastRow(InsetMathGrid & grid)
 {
        InsetMathGrid::row_type const row = grid.nrows() - 1;
        for (InsetMathGrid::col_type col = 0; col < grid.ncols(); ++col) {
-               if (!grid.cell(grid.index(row, col)).empty())
+               InsetMathGrid::idx_type const idx = grid.index(row, col);
+               if (!grid.cell(idx).empty() ||
+                   grid.cellinfo(idx).multi_ != InsetMathGrid::CELL_NORMAL)
                        return;
        }
        // Copy the row information of the empty row (which would contain the
@@ -1385,12 +1389,10 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                                error("can't extract number of multicolumn cells");
                        }
                        // resize the table if necessary
-                       size_t first = 0;
-                       for (int i = 0; i < cols; ++i) {
+                       size_t first = grid.index(cellrow, cellcol);
+                       for (int i = 1; i < cols; ++i) {
                                if (addCol(grid, cellcol)) {
                                        size_t const idx = grid.index(cellrow, cellcol);
-                                       if (i == 0)
-                                               first = idx;
                                        grid.cellinfo(idx).multi_ =
                                                InsetMathGrid::CELL_PART_OF_MULTICOLUMN;
                                }
@@ -1401,7 +1403,9 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                        grid.cellinfo(first).multi_ = InsetMathGrid::CELL_BEGIN_OF_MULTICOLUMN;
 
                        // read special alignment
-                       grid.cellinfo(first).align_ = parse_verbatim_item();
+                       MathData align;
+                       parse(align, FLAG_ITEM, mode);
+                       grid.cellinfo(first).align_ = asString(align);
 
                        // parse the remaining contents into the "real" cell
                        parse(*cell, FLAG_ITEM, mode);