]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Fix bug #253 (Incorrect protection of closing quotation marks)
[lyx.git] / src / insets / InsetTabular.cpp
index fe33dbeef013b866feceacfd29467787ee9b5c41..4a267e9d47e0f367d1a6fc232bde362f6bb8f3a7 100644 (file)
@@ -516,19 +516,25 @@ string const featureAsString(Tabular::Feature action)
 }
 
 
-InsetTableCell splitCell(InsetTableCell & head, docstring const align_d, bool & hassep)
+DocIterator separatorPos(InsetTableCell * cell, docstring const & align_d)
 {
-       InsetTableCell tail = InsetTableCell(head);
-
-       DocIterator dit = doc_iterator_begin(&head.buffer(), &head);
+       DocIterator dit = doc_iterator_begin(&(cell->buffer()), cell);
        for (; dit; dit.forwardChar())
                if (dit.inTexted() && dit.depth() == 1
                        && dit.paragraph().find(align_d, false, false, dit.pos()))
                        break;
 
-       pit_type const psize = head.paragraphs().front().size();
+       return dit;
+}
+
+
+InsetTableCell splitCell(InsetTableCell & head, docstring const align_d, bool & hassep)
+{
+       InsetTableCell tail = InsetTableCell(head);
+       DocIterator const dit = separatorPos(&head, align_d);
        hassep = dit;
        if (hassep) {
+               pit_type const psize = head.paragraphs().front().size();
                head.paragraphs().front().eraseChars(dit.pos(), psize, false);
                tail.paragraphs().front().eraseChars(0, 
                        dit.pos() < psize ? dit.pos() + 1 : psize, false);
@@ -2190,8 +2196,11 @@ void Tabular::TeXCellPreamble(otexstream & os, idx_type cell,
                || (coldouble != celldouble);
 
        // we center in multicol when no decimal point
-       ismulticol |= ((column_info[c].alignment == LYX_ALIGN_DECIMAL)
-               && (cellInfo(cell).decimal_width == 0));
+       if (column_info[c].alignment == LYX_ALIGN_DECIMAL) {
+               docstring const align_d = column_info[c].decimal_point;
+               DocIterator const dit = separatorPos(cellInset(cell).get(), align_d);
+               ismulticol |= !dit;
+       }
 
        // up counter by 1 for each decimally aligned col since they use 2 latex cols
        int latexcolspan = columnSpan(cell);
@@ -2480,8 +2489,7 @@ void Tabular::TeXRow(otexstream & os, row_type row,
                                    ? OutputParams::PLAIN
                                    : OutputParams::ALIGNED;
 
-               if (getAlignment(cell) == LYX_ALIGN_DECIMAL
-                       && cellInfo(cell).decimal_width != 0) {
+               if (getAlignment(cell) == LYX_ALIGN_DECIMAL) {
                        // copy cell and split in 2
                        InsetTableCell head = InsetTableCell(*cellInset(cell).get());
                        head.setBuffer(buffer());
@@ -2491,13 +2499,15 @@ void Tabular::TeXRow(otexstream & os, row_type row,
                        head.setMacrocontextPositionRecursive(dit);
                        bool hassep = false;
                        InsetTableCell tail = splitCell(head, column_info[c].decimal_point, hassep);
-                       tail.setBuffer(head.buffer());
-                       dit.pop_back();
-                       dit.push_back(CursorSlice(tail));
-                       tail.setMacrocontextPositionRecursive(dit);
                        head.latex(os, newrp);
-                       os << '&';
-                       tail.latex(os, newrp);
+                       if (hassep) {
+                               os << '&';
+                               tail.setBuffer(head.buffer());
+                               dit.pop_back();
+                               dit.push_back(CursorSlice(tail));
+                               tail.setMacrocontextPositionRecursive(dit);
+                               tail.latex(os, newrp);
+                       }
                } else if (!isPartOfMultiRow(row, c)) {
                        if (!runparams.nice)
                                os.texrow().start(par.id(), 0);
@@ -2857,7 +2867,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;
@@ -2889,6 +2899,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);
@@ -3167,7 +3179,7 @@ void Tabular::plaintext(odocstream & os,
                if (!onlydata && plaintextTopHLine(os, r, clen))
                        os << docstring(depth * 2, ' ');
                for (col_type c = 0; c < ncols(); ++c) {
-                       if (isPartOfMultiColumn(r, c))
+                       if (isPartOfMultiColumn(r, c) || isPartOfMultiRow(r,c))
                                continue;
                        if (onlydata && c > 0)
                                // we don't use operator<< for single UCS4 character.
@@ -3482,11 +3494,7 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
 
                                // remove text leading decimal point
                                docstring const align_d = tabular.column_info[c].decimal_point;
-                               dit = doc_iterator_begin(&tail.buffer(), &tail);
-                               for (; dit; dit.forwardChar())
-                                       if (dit.inTexted() && dit.depth()==1
-                                               && dit.paragraph().find(align_d, false, false, dit.pos()))
-                                               break;
+                               dit = separatorPos(&tail, align_d);
 
                                pit_type const psize = tail.paragraphs().front().size();
                                if (dit) {
@@ -4036,11 +4044,15 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        // setting also the right targetX.
                        cur.selHandle(act == LFUN_DOWN_SELECT);
                        if (tabular.cellRow(cur.idx()) != tabular.nrows() - 1) {
+                               int const xtarget = cur.targetX();
+                               // WARNING: Once cur.idx() has been reset, the cursor is in
+                               // an inconsistent state until pos() has been set. Be careful
+                               // what you do with it!
                                cur.idx() = tabular.cellBelow(cur.idx());
                                cur.pit() = 0;
                                TextMetrics const & tm =
                                        cur.bv().textMetrics(cell(cur.idx())->getText(0));
-                               cur.pos() = tm.x2pos(cur.pit(), 0, cur.targetX());
+                               cur.pos() = tm.x2pos(cur.pit(), 0, xtarget);
                                cur.setCurrentFont();
                        }
                }
@@ -4070,13 +4082,17 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        // setting also the right targetX.
                        cur.selHandle(act == LFUN_UP_SELECT);
                        if (tabular.cellRow(cur.idx()) != 0) {
+                               int const xtarget = cur.targetX();
+                               // WARNING: Once cur.idx() has been reset, the cursor is in
+                               // an inconsistent state until pos() has been set. Be careful
+                               // what you do with it!
                                cur.idx() = tabular.cellAbove(cur.idx());
                                cur.pit() = cur.lastpit();
                                Text const * text = cell(cur.idx())->getText(0);
                                TextMetrics const & tm = cur.bv().textMetrics(text);
                                ParagraphMetrics const & pm =
                                        tm.parMetrics(cur.lastpit());
-                               cur.pos() = tm.x2pos(cur.pit(), pm.rows().size()-1, cur.targetX());
+                               cur.pos() = tm.x2pos(cur.pit(), pm.rows().size()-1, xtarget);
                                cur.setCurrentFont();
                        }
                }