]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Do not output deleted rows columns if show changes in output is false
[lyx.git] / src / insets / InsetTabular.cpp
index 5622e0e7031959d8b5fa3cab3d0efa25e3c28b2e..f6897d617052bfccda3cbecf39b151136e0e635b 100644 (file)
@@ -807,9 +807,6 @@ void Tabular::deleteRow(row_type const row, bool const force)
        bool const ct = force ? false : buffer().params().track_changes;
 
        for (col_type c = 0; c < ncols(); ++c) {
-               // mark track changes
-               if (ct)
-                       cell_info[row][c].inset->setChange(Change(Change::DELETED));
                // Care about multirow cells
                if (row + 1 < nrows() &&
                    cell_info[row][c].multirow == CELL_BEGIN_OF_MULTIROW &&
@@ -848,8 +845,6 @@ void Tabular::insertRow(row_type const row, bool copy)
        for (col_type c = 0; c < ncols(); ++c) {
                cell_info[row + 1].insert(cell_info[row + 1].begin() + c,
                        copy ? CellData(cell_info[row][c]) : CellData(buffer_));
-               if (buffer().params().track_changes)
-                       cell_info[row + 1][c].inset->setChange(Change(Change::INSERTED));
                if (cell_info[row][c].multirow == CELL_BEGIN_OF_MULTIROW)
                        cell_info[row + 1][c].multirow = CELL_PART_OF_MULTIROW;
        }
@@ -868,12 +863,11 @@ void Tabular::insertRow(row_type const row, bool copy)
                        setBottomLine(i, true);
                        setBottomLine(j, false);
                }
-               // mark track changes
-               if (buffer().params().track_changes)
-                       cellInfo(i).inset->setChange(Change(Change::INSERTED));
        }
-       if (buffer().params().track_changes)
+       if (buffer().params().track_changes) {
                row_info[row + 1].change.setInserted();
+               updateIndexes();
+       }
 }
 
 
@@ -932,9 +926,6 @@ void Tabular::deleteColumn(col_type const col, bool const force)
        bool const ct = force ? false : buffer().params().track_changes;
 
        for (row_type r = 0; r < nrows(); ++r) {
-               // mark track changes
-               if (ct)
-                       cell_info[r][col].inset->setChange(Change(Change::DELETED));
                // Care about multicolumn cells
                if (col + 1 < ncols() &&
                    cell_info[r][col].multicolumn == CELL_BEGIN_OF_MULTICOLUMN &&
@@ -972,8 +963,6 @@ void Tabular::insertColumn(col_type const col, bool copy)
        for (row_type r = 0; r < nrows(); ++r) {
                cell_info[r].insert(cell_info[r].begin() + col + 1,
                        copy ? CellData(cell_info[r][col]) : CellData(buffer_));
-               if (ct)
-                       cell_info[r][col + 1].inset->setChange(Change(Change::INSERTED));
                if (cell_info[r][col].multicolumn == CELL_BEGIN_OF_MULTICOLUMN)
                        cell_info[r][col + 1].multicolumn = CELL_PART_OF_MULTICOLUMN;
        }
@@ -989,11 +978,11 @@ void Tabular::insertColumn(col_type const col, bool copy)
                if (rightLine(i) && rightLine(j)) {
                        setRightLine(j, false);
                }
-               if (ct)
-                       cellInfo(i).inset->setChange(Change(Change::INSERTED));
        }
-       if (ct)
+       if (ct) {
                column_info[col + 1].change.setInserted();
+               updateIndexes();
+       }
 }
 
 
@@ -1016,8 +1005,8 @@ void Tabular::updateIndexes()
        rowofcell.resize(numberofcells);
        columnofcell.resize(numberofcells);
        idx_type i = 0;
-       // reset column and row of cells and update their width and alignment
-       for (row_type row = 0; row < nrows(); ++row)
+       // reset column and row of cells and update their width, alignment and ct status
+       for (row_type row = 0; row < nrows(); ++row) {
                for (col_type column = 0; column < ncols(); ++column) {
                        if (isPartOfMultiColumn(row, column)) {
                                cell_info[row][column].inset->toggleMultiCol(true);
@@ -1038,8 +1027,15 @@ void Tabular::updateIndexes()
                        cell_info[row][column].inset->toggleMultiRow(false);
                        cell_info[row][column].inset->setContentAlignment(
                                getAlignment(cellIndex(row, column)));
+                       if (buffer().params().track_changes) {
+                               if (row_info[row].change.changed())
+                                       cell_info[row][column].inset->setChange(row_info[row].change);
+                               if (column_info[column].change.changed())
+                                       cell_info[row][column].inset->setChange(column_info[column].change);
+                       }
                        ++i;
                }
+       }
 }
 
 
@@ -1651,7 +1647,7 @@ int Tabular::textVOffset(idx_type cell) const
 }
 
 
-Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const
+Tabular::idx_type Tabular::getFirstCellInRow(row_type row, bool const ct) const
 {
        col_type c = 0;
        idx_type const numcells = numberOfCellsInRow(row);
@@ -1660,26 +1656,52 @@ Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const
        // is really invalid, i.e., it is NOT the first cell in the row. but
        // i do not know what to do here. (rgh)
        while (c < numcells - 1
-              && cell_info[row][c].multirow == CELL_PART_OF_MULTIROW)
+              && (cell_info[row][c].multirow == CELL_PART_OF_MULTIROW
+                  || (ct && column_info[c].change.deleted())))
                ++c;
        return cell_info[row][c].cellno;
 }
 
 
-Tabular::idx_type Tabular::getLastCellInRow(row_type row) const
+Tabular::idx_type Tabular::getLastCellInRow(row_type row, bool const ct) const
 {
        col_type c = ncols() - 1;
        // of course we check against 0 so we don't crash. but we have the same
        // problem as in the previous routine: if all the cells are part of a
        // multirow or part of a multi column, then our return value is invalid.
        while (c > 0
-              && (cell_info[row][c].multirow == CELL_PART_OF_MULTIROW
-                  || cell_info[row][c].multicolumn == CELL_PART_OF_MULTICOLUMN))
+              && ((cell_info[row][c].multirow == CELL_PART_OF_MULTIROW
+                  || cell_info[row][c].multicolumn == CELL_PART_OF_MULTICOLUMN)
+                 || (ct && column_info[c].change.deleted())))
                --c;
        return cell_info[row][c].cellno;
 }
 
 
+Tabular::row_type Tabular::getFirstRow(bool const ct) const
+{
+       row_type r = 0;
+       if (!ct)
+               return r;
+       // exclude deleted rows if ct == true
+       while (r < nrows() && row_info[r].change.deleted())
+               ++r;
+       return r;
+}
+
+
+Tabular::row_type Tabular::getLastRow(bool const ct) const
+{
+       row_type r = nrows() - 1;
+       if (!ct)
+               return r;
+       // exclude deleted rows if ct == true
+       while (r > 0 && row_info[r].change.deleted())
+               --r;
+       return r;
+}
+
+
 Tabular::row_type Tabular::cellRow(idx_type cell) const
 {
        if (cell >= numberofcells)
@@ -2501,15 +2523,16 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, list<col_type> columns)
        }
 
        // do nothing if empty first row, or incomplete row line after
-       if ((row == 0 && nset == 0) || (row > 0 && nset != ncols()))
+       row_type first = getFirstRow(!buffer().params().output_changes);
+       if ((row == first && nset == 0) || (row > first && nset != columns.size()))
                return;
 
        // Is this the actual first row (excluding longtable caption row)?
-       bool const realfirstrow = (row == 0
-                                  || (is_long_tabular && row == 1 && ltCaption(0)));
+       bool const realfirstrow = (row == first
+                                  || (is_long_tabular && row == first + 1 && ltCaption(first)));
 
        // only output complete row lines and the 1st row's clines
-       if (nset == ncols() && !have_trims) {
+       if (nset == columns.size() && !have_trims) {
                if (use_booktabs) {
                        os << (realfirstrow ? "\\toprule " : "\\midrule ");
                } else {
@@ -2561,7 +2584,7 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, list<col_type> columns)
                                if (!trim.empty())
                                        os << "(" << trim << ")";
                                os << "{" << firstcol << '-' << lastcol << "}";
-                               if (c == ncols() - 1)
+                               if (c == columns.size() - 1)
                                        break;
                                ++c;
                        }
@@ -2577,7 +2600,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
        // if the latter do not span the whole tabular
 
        // get the bottomlines of row r, and toplines in next row
-       bool lastrow = row == nrows() - 1;
+       bool lastrow = row == getLastRow(!buffer().params().output_changes);
        map<col_type, bool> bottomline, topline, topltrims, toprtrims, bottomltrims, bottomrtrims;
        bool nextrowset = true;
        for (auto const & c : columns) {
@@ -2630,10 +2653,10 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
        }
 
        // do nothing if empty, OR incomplete row line with a topline in next row
-       if (nset == 0 || (nextrowset && nset != ncols()))
+       if (nset == 0 || (nextrowset && nset != columns.size()))
                return;
 
-       if (nset == ncols() && !have_trims) {
+       if (nset == columns.size() && !have_trims) {
                if (use_booktabs)
                        os << (lastrow ? "\\bottomrule" : "\\midrule");
                else
@@ -2686,7 +2709,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
                                if (!trim.empty())
                                        os << "(" << trim << ")";
                                os << "{" << firstcol << '-' << lastcol << "}";
-                               if (c == ncols() - 1)
+                               if (c == columns.size() - 1)
                                        break;
                                ++c;
                        }
@@ -3007,8 +3030,9 @@ void Tabular::TeXRow(otexstream & os, row_type row,
        bool const bidi_rtl =
                runparams.local_font->isRightToLeft()
                && runparams.useBidiPackage();
+       bool const ct = !buffer().params().output_changes;
        idx_type lastcell =
-               bidi_rtl ? getFirstCellInRow(row) : getLastCellInRow(row);
+               bidi_rtl ? getFirstCellInRow(row, ct) : getLastCellInRow(row, ct);
 
        for (auto const & c : columns) {
                if (isPartOfMultiColumn(row, c))
@@ -3179,6 +3203,8 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
                && runparams.useBidiPackage();
        list<col_type> columns;
        for (col_type cl = 0; cl < ncols(); ++cl) {
+               if (!buffer().params().output_changes && column_info[cl].change.deleted())
+                       continue;
                if (bidi_rtl)
                        columns.push_front(cl);
                else
@@ -3404,6 +3430,8 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
        //+---------------------------------------------------------------------
 
        for (row_type r = 0; r < nrows(); ++r) {
+               if (!buffer().params().output_changes && row_info[r].change.deleted())
+                       continue;
                if (isValidRow(r)) {
                        TeXRow(os, r, runparams, columns);
                        if (is_long_tabular && row_info[r].newpage)
@@ -5217,8 +5245,12 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                }
                        }
                        if (ct) {
+                               tabular.updateIndexes();
                                // cursor might be invalid
                                cur.fixIfBroken();
+                               // change bar might need to be redrawn
+                               cur.screenUpdateFlags(Update::Force);
+                               cur.forceBufferUpdate();
                        }
                        break;
                } else {
@@ -7194,6 +7226,7 @@ void InsetTabular::acceptChanges()
                else if (tabular.column_info[col].change.deleted())
                        tabular.deleteColumn(col, true);
        }
+       tabular.updateIndexes();
 }
 
 
@@ -7213,6 +7246,7 @@ void InsetTabular::rejectChanges()
                else if (tabular.column_info[col].change.inserted())
                        tabular.deleteColumn(col, true);
        }
+       tabular.updateIndexes();
 }