]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetTabular.cpp
DocBook: add a TODO for a newly discovered bug.
[features.git] / src / insets / InsetTabular.cpp
index ded3d3af96a7eac3ebc05863a88a28488399e0c9..24bde65c5c51012a322c22e5f33adcc2323d7ef8 100644 (file)
@@ -57,6 +57,7 @@
 #include "frontends/Painter.h"
 #include "frontends/Selection.h"
 
+#include "support/Changer.h"
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
@@ -616,7 +617,7 @@ DocIterator separatorPos(InsetTableCell const * cell, docstring const & align_d)
 
 InsetTableCell splitCell(InsetTableCell & head, docstring const & align_d, bool & hassep)
 {
-       InsetTableCell tail = InsetTableCell(head);
+       InsetTableCell tail = head;
        DocIterator const dit = separatorPos(&head, align_d);
        hassep = static_cast<bool>(dit);
        if (hassep) {
@@ -811,7 +812,7 @@ void Tabular::deleteRow(row_type const row, bool const force)
                if (row + 1 < nrows() &&
                    cell_info[row][c].multirow == CELL_BEGIN_OF_MULTIROW &&
                    cell_info[row + 1][c].multirow == CELL_PART_OF_MULTIROW) {
-                               cell_info[row + 1][c].multirow = CELL_BEGIN_OF_MULTIROW;
+                               cell_info[row + 1][c] = cell_info[row][c];
                }
        }
        if (ct)
@@ -838,13 +839,13 @@ void Tabular::appendRow(row_type row)
 
 void Tabular::insertRow(row_type const row, bool copy)
 {
-       row_info.insert(row_info.begin() + row + 1, RowData(row_info[row]));
+       row_info.insert(row_info.begin() + row + 1, row_info[row]);
        cell_info.insert(cell_info.begin() + row + 1,
                cell_vector(0, CellData(buffer_)));
 
        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_));
+                       copy ? cell_info[row][c] : CellData(buffer_));
                if (cell_info[row][c].multirow == CELL_BEGIN_OF_MULTIROW)
                        cell_info[row + 1][c].multirow = CELL_PART_OF_MULTIROW;
        }
@@ -973,7 +974,7 @@ void Tabular::deleteColumn(col_type const col, bool const force)
                if (col + 1 < ncols() &&
                    cell_info[r][col].multicolumn == CELL_BEGIN_OF_MULTICOLUMN &&
                    cell_info[r][col + 1].multicolumn == CELL_PART_OF_MULTICOLUMN) {
-                               cell_info[r][col + 1].multicolumn = CELL_BEGIN_OF_MULTICOLUMN;
+                               cell_info[r][col + 1] = cell_info[r][col]; 
                }
                if (!ct)
                        cell_info[r].erase(cell_info[r].begin() + col);
@@ -1001,11 +1002,11 @@ void Tabular::appendColumn(col_type col)
 void Tabular::insertColumn(col_type const col, bool copy)
 {
        bool const ct = buffer().params().track_changes;
-       column_info.insert(column_info.begin() + col + 1, ColumnData(column_info[col]));
+       column_info.insert(column_info.begin() + col + 1, column_info[col]);
 
        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_));
+                       copy ? cell_info[r][col] : CellData(buffer_));
                if (cell_info[r][col].multicolumn == CELL_BEGIN_OF_MULTICOLUMN)
                        cell_info[r][col + 1].multicolumn = CELL_PART_OF_MULTICOLUMN;
        }
@@ -2604,7 +2605,7 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, list<col_type> columns,
                                                break;
                                }
 
-                               for (col_type j = cstart ; j < c ; ++j)
+                               for (col_type j = cstart ; j <= c ; ++j)
                                        if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
                                                ++offset;
                                col_type lastcol = (*it1 == *it2) ? c + 1 + offset : columns.size() - c + offset;
@@ -2740,7 +2741,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, list<col_type> colum
                                                break;
                                }
 
-                               for (col_type j = cstart ; j < c ; ++j)
+                               for (col_type j = cstart ; j <= c ; ++j)
                                        if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
                                                ++offset;
                                col_type lastcol = (*it1 == *it2) ? c + 1 + offset : columns.size() - c + offset;
@@ -3198,7 +3199,7 @@ void Tabular::TeXRow(otexstream & os, row_type row,
                } else if (!isPartOfMultiRow(row, c)) {
                        if (!runparams.nice)
                                os.texrow().start(par.id(), 0);
-                       if (isMultiRow(cell))
+                       if (isMultiRow(cell) && !LaTeXFeatures::isAvailable("multirow-2021/01/29"))
                                newrp.isNonLong = true;
                        inset->latex(os, newrp);
                }
@@ -3569,7 +3570,7 @@ void Tabular::docbookRowAsHTML(XMLStream & xs, row_type row,
                Length const cwidth = column_info[c].p_width;
                if (!cwidth.zero()) {
                        string const hwidth = cwidth.asHTMLString();
-                       attr << "style =\"width: " << hwidth << ";\" ";
+                       attr << "style=\"width: " << hwidth << ";\" ";
                }
 
                attr << "align='";
@@ -3611,8 +3612,11 @@ void Tabular::docbookRowAsHTML(XMLStream & xs, row_type row,
                else if (isMultiRow(cell))
                        attr << " rowspan='" << rowSpan(cell) << "'";
 
+               OutputParams rp = runparams;
+               rp.docbook_in_par = false;
+               rp.docbook_force_pars = true;
                xs << xml::StartTag(celltag, attr.str(), true);
-               cellInset(cell)->docbook(xs, runparams);
+               cellInset(cell)->docbook(xs, rp);
                xs << xml::EndTag(celltag);
                xs << xml::CR();
                ++cell;
@@ -3745,7 +3749,7 @@ void Tabular::docbook(XMLStream & xs, OutputParams const & runparams) const
                        if (((havefirsthead && row_info[r].endfirsthead) ||
                             (havehead && row_info[r].endhead)) &&
                            !row_info[r].caption) {
-                               docbookRow(xs, r, runparams, true); // TODO: HTML vs CALS
+                               docbookRow(xs, r, runparams, true);
                        }
                }
                xs << xml::EndTag("thead");
@@ -3805,7 +3809,7 @@ docstring Tabular::xhtmlRow(XMLStream & xs, row_type row,
                Length const cwidth = column_info[c].p_width;
                if (!cwidth.zero()) {
                        string const hwidth = cwidth.asHTMLString();
-                       attr << "style =\"width: " << hwidth << ";\" ";
+                       attr << "style=\"width: " << hwidth << ";\" ";
                }
 
                attr << "align='";
@@ -4338,10 +4342,11 @@ void InsetTableCell::metrics(MetricsInfo & mi, Dimension & dim) const
 
        // We tell metrics here not to expand on multiple pars
        // This is the difference to InsetText::Metrics
-       if (hasFixedWidth() || isVarwidth)
-               tm.metrics(mi, dim, mi.base.textwidth, false);
+       Changer changetight = changeVar(mi.tight_insets, true);
+       if (hasFixedWidth())
+               tm.metrics(mi, dim, mi.base.textwidth);
        else
-               tm.metrics(mi, dim, 0, false);
+               tm.metrics(mi, dim, 0);
        mi.base.textwidth += horiz_offset;
        dim.asc += topOffset(mi.base.bv);
        dim.des += bottomOffset(mi.base.bv);
@@ -4520,7 +4525,7 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
                        // determine horizontal offset because of decimal align (if necessary)
                        int decimal_width = 0;
                        if (tabular.getAlignment(cell) == LYX_ALIGN_DECIMAL) {
-                               InsetTableCell tail = InsetTableCell(*tabular.cellInset(cell));
+                               InsetTableCell tail = *tabular.cellInset(cell);
                                tail.setBuffer(tabular.buffer());
                                // we need to set macrocontext position everywhere
                                // otherwise we crash with nested insets (e.g. footnotes)
@@ -4773,7 +4778,7 @@ void InsetTabular::drawCellLines(PainterInfo & pi, int x, int y,
        Color colour = Color_tabularline;
        if (tabular.column_info[col].change.changed()
            || tabular.row_info[row].change.changed())
-               colour = InsetTableCell(*tabular.cellInset(cell)).paragraphs().front().lookupChange(0).color();
+               colour = tabular.cellInset(cell)->paragraphs().front().lookupChange(0).color();
 
        // Top
        bool drawline = tabular.topLine(cell)
@@ -5259,6 +5264,13 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
 
+       case LFUN_COPY:
+               if (cur.selIsMultiCell())
+                       copySelection(cur);
+               else
+                       cell(cur.idx())->dispatch(cur, cmd);
+               break;
+
        case LFUN_CUT:
                if (cur.selIsMultiCell()) {
                        if (copySelection(cur)) {
@@ -5308,8 +5320,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        if (insertPlaintextString(cur.bv(), clip, false)) {
                                // content has been replaced,
                                // so cursor might be invalid
-                               cur.pos() = cur.lastpos();
-                               cur.pit() = cur.lastpit();
+                               cur.fixIfBroken();
                                bvcur.setCursor(cur);
                                break;
                        }
@@ -5333,7 +5344,8 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                        break;
                                }
                        }
-                       else if (theClipboard().hasTextContents(Clipboard::LyXTextType)) {
+                       else if (!theClipboard().isInternal()
+                                && theClipboard().hasTextContents(Clipboard::LyXTextType)) {
                                // This might be tabular data from another LyX instance. Check!
                                docstring const clip =
                                        theClipboard().getAsText(Clipboard::PlainTextType);
@@ -5536,8 +5548,6 @@ bool InsetTabular::getFeatureStatus(Cursor & cur, string const & s,
                case Tabular::SET_SPECIAL_MULTICOLUMN:
                case Tabular::APPEND_ROW:
                case Tabular::APPEND_COLUMN:
-               case Tabular::DELETE_ROW:
-               case Tabular::DELETE_COLUMN:
                case Tabular::COPY_ROW:
                case Tabular::COPY_COLUMN:
                case Tabular::SET_TOP_SPACE:
@@ -5546,6 +5556,13 @@ bool InsetTabular::getFeatureStatus(Cursor & cur, string const & s,
                        status.clear();
                        return true;
 
+               case Tabular::DELETE_ROW:
+                       status.setEnabled(tabular.nrows() > 1);
+                       break;
+               case Tabular::DELETE_COLUMN:
+                       status.setEnabled(tabular.ncols() > 1);
+                       break;
+
                case Tabular::SET_TABULAR_WIDTH:
                        status.setEnabled(!tabular.rotate
                                && tabular.tabular_valignment == Tabular::LYX_VALIGN_MIDDLE);
@@ -6006,7 +6023,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                }
                // check if there is already a caption
                bool have_caption = false;
-               InsetTableCell itc = InsetTableCell(*tabular.cellInset(cur.idx()));
+               InsetTableCell itc = *tabular.cellInset(cur.idx());
                ParagraphList::const_iterator pit = itc.paragraphs().begin();
                ParagraphList::const_iterator pend = itc.paragraphs().end();
                for (; pit != pend; ++pit) {
@@ -6127,21 +6144,21 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
-Inset::RowFlags InsetTabular::rowFlags() const
+int InsetTabular::rowFlags() const
 {
-               if (tabular.is_long_tabular) {
-                       switch (tabular.longtabular_alignment) {
-                       case Tabular::LYX_LONGTABULAR_ALIGN_LEFT:
-                               return Display | AlignLeft;
-                       case Tabular::LYX_LONGTABULAR_ALIGN_CENTER:
-                               return Display;
-                       case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT:
-                               return Display | AlignRight;
-                       default:
-                               return Display;
-                       }
-               } else
-                       return Inline;
+       if (tabular.is_long_tabular) {
+               switch (tabular.longtabular_alignment) {
+               case Tabular::LYX_LONGTABULAR_ALIGN_LEFT:
+                       return Display | AlignLeft;
+               case Tabular::LYX_LONGTABULAR_ALIGN_CENTER:
+                       return Display;
+               case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT:
+                       return Display | AlignRight;
+               default:
+                       return Display;
+               }
+       } else
+               return Inline;
 }
 
 
@@ -7301,12 +7318,15 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
                        // FIXME?: why do we need to do this explicitly? (EL)
                        tabular.cellInset(r2, c2)->setBuffer(tabular.buffer());
 
-                       if (!lyxrc.ct_markup_copied) {
-                               // do not paste deleted text
-                               inset->acceptChanges();
+                       if (lyxrc.ct_markup_copied) {
+                               // Only change to inserted if ct is active,
+                               // otherwise leave markup as is
+                               if (buffer().params().track_changes)
+                                       inset->setChange(Change(Change::INSERTED));
+                       } else
+                               // Resolve all markup to inserted or unchanged
                                inset->setChange(Change(buffer().params().track_changes ?
-                                               Change::INSERTED : Change::UNCHANGED));
-                       }
+                                                        Change::INSERTED : Change::UNCHANGED));
                        cur.pos() = 0;
                        cur.pit() = 0;
                }
@@ -7638,7 +7658,8 @@ bool InsetTabular::automaticPopupCompletion() const
 
 bool InsetTabular::showCompletionCursor() const
 {
-       return lyxrc.completion_cursor_text;
+       return lyxrc.completion_cursor_text &&
+               (lyxrc.completion_inline_text || lyxrc.completion_popup_text);
 }