]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Yet another unused variable.
[lyx.git] / src / insets / InsetTabular.cpp
index 4686862826697d1a2d0c471f80eb8b19b524f378..680ce1b1af885aa3b161376e753403ba81be7a00 100644 (file)
@@ -1339,7 +1339,13 @@ int Tabular::textVOffset(idx_type cell) const
 Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const
 {
        col_type c = 0;
-       while (cell_info[row][c].multirow == CELL_PART_OF_MULTIROW)
+       idx_type const numcells = numberOfCellsInRow(row);
+       // we check against numcells to make sure we do not crash if all the
+       // cells are multirow (bug #7535), but in that case our return value
+       // 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)
                ++c;
        return cell_info[row][c].cellno;
 }
@@ -1348,6 +1354,9 @@ Tabular::idx_type Tabular::getFirstCellInRow(row_type row) const
 Tabular::idx_type Tabular::getLastCellInRow(row_type row) 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))
@@ -1640,7 +1649,8 @@ bool Tabular::isMultiRow(idx_type cell) const
 }
 
 
-Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number)
+Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number,
+                                      bool const bottom_border)
 {
        idx_type const col = cellColumn(cell);
        idx_type const row = cellRow(cell);
@@ -1661,8 +1671,8 @@ Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number)
        // cells: left
        cs.alignment = LYX_ALIGN_LEFT; 
 
-       // set the bottom row of the last selected cell
-       setBottomLine(cell, bottomLine(cell + (number - 1)*ncols()));
+       // set the bottom line of the last selected cell
+       setBottomLine(cell, bottom_border);
 
        for (idx_type i = 1; i < number; ++i) {
                CellData & cs1 = cell_info[row + i][col];
@@ -2048,8 +2058,8 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, string const lang) cons
                // multirow, no line must be drawn.
                if (row != 0)
                        if (isMultiRow(cellIndex(row, c))
-                               && isMultiRow(cellIndex(row - 1, c)))
-                                       topline[c] = false;
+                           && cell_info[row][c].multirow != CELL_BEGIN_OF_MULTIROW)
+                               topline[c] = false;
                if (topline[c])
                        ++nset;
        }
@@ -2108,13 +2118,14 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, string const lang) c
        for (col_type c = 0; c < ncols(); ++c) {
                bottomline.push_back(bottomLine(cellIndex(row, c)));
                topline.push_back(!lastrow && topLine(cellIndex(row + 1, c)));
-               // If cell is part of a multirow and not the last or first cell of the
+               // If cell is part of a multirow and not the last cell of the
                // multirow, no line must be drawn.
                if (!lastrow)
                        if (isMultiRow(cellIndex(row, c))
-                               && isMultiRow(cellIndex(row + 1, c))) {
-                                       bottomline[c] = false;
-                                       topline[c] = false;
+                           && isMultiRow(cellIndex(row + 1, c))
+                           && cell_info[row + 1][c].multirow != CELL_BEGIN_OF_MULTIROW) {
+                               bottomline[c] = false;
+                               topline[c] = false;
                                }
                nextrowset &= topline[c];
        }
@@ -2867,7 +2878,7 @@ docstring Tabular::xhtmlRow(XHTMLStream & xs, row_type row,
 
        xs << html::StartTag("tr");
        for (col_type c = 0; c < ncols(); ++c) {
-               if (isPartOfMultiColumn(row, c))
+               if (isPartOfMultiColumn(row, c) || isPartOfMultiRow(row, c))
                        continue;
 
                stringstream attr;
@@ -2899,6 +2910,8 @@ docstring Tabular::xhtmlRow(XHTMLStream & xs, row_type row,
 
                if (isMultiColumn(cell))
                        attr << " colspan='" << columnSpan(cell) << "'";
+               else if (isMultiRow(cell))
+                       attr << " rowspan='" << rowSpan(cell) << "'";
 
                xs << html::StartTag(celltag, attr.str()) << html::CR();
                ret += cellInset(cell)->xhtml(xs, runparams);
@@ -5387,7 +5400,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                        // just multirow for one single cell
                        // check whether we are completely in a multirow
                        if (!tabular.isMultiRow(cur.idx()))
-                               tabular.setMultiRow(cur.idx(), 1);
+                               tabular.setMultiRow(cur.idx(), 1,
+                                                   tabular.bottomLine(cur.idx()));
                        break;
                }
                // we have a selection so this means we just add all this
@@ -5395,7 +5409,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                idx_type const s_start = cur.selBegin().idx();
                row_type const row_start = tabular.cellRow(s_start);
                row_type const row_end = tabular.cellRow(cur.selEnd().idx());
-               cur.idx() = tabular.setMultiRow(s_start, row_end - row_start + 1);
+               cur.idx() = tabular.setMultiRow(s_start, row_end - row_start + 1,
+                                               tabular.bottomLine(cur.selEnd().idx()));
                cur.pit() = 0;
                cur.pos() = 0;
                cur.setSelection(false);