]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Fix bug #10153: There's a mechanism in XHTML output that defers the
[lyx.git] / src / insets / InsetTabular.cpp
index be2e00fa376ec34fd1104956c6aab37fa0c54c4e..7ad86633dae7116666655750b6d5a6c426b6f0c9 100644 (file)
@@ -61,8 +61,7 @@
 #include "support/gettext.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
-
-#include <boost/scoped_ptr.hpp>
+#include "support/unique_ptr.h"
 
 #include <cstring>
 #include <iostream>
@@ -96,7 +95,7 @@ int const WIDTH_OF_LINE = 5; // space between double lines
 
 
 ///
-boost::scoped_ptr<Tabular> paste_tabular;
+unique_ptr<Tabular> paste_tabular;
 
 
 struct TabularFeature {
@@ -1103,7 +1102,7 @@ void Tabular::setAlignment(idx_type cell, LyXAlignment align,
                        dpoint = from_utf8(lyxrc.default_decimal_point);
        } else {
                cellInfo(cell).alignment = align;
-               cellInset(cell).get()->setContentAlignment(align);
+               cellInset(cell)->setContentAlignment(align);
        }
 }
 
@@ -2606,7 +2605,7 @@ void Tabular::TeXRow(otexstream & os, row_type row,
 
                if (getAlignment(cell) == LYX_ALIGN_DECIMAL) {
                        // copy cell and split in 2
-                       InsetTableCell head = InsetTableCell(*cellInset(cell).get());
+                       InsetTableCell head = InsetTableCell(*cellInset(cell));
                        head.setBuffer(buffer());
                        DocIterator dit = cellInset(cell)->getText(0)->macrocontextPosition();
                        dit.pop_back();
@@ -3019,7 +3018,7 @@ docstring Tabular::xhtmlRow(XHTMLStream & xs, row_type row,
                else if (isMultiRow(cell))
                        attr << " rowspan='" << rowSpan(cell) << "'";
 
-               xs << html::StartTag(celltag, attr.str()) << html::CR();
+               xs << html::StartTag(celltag, attr.str(), true) << html::CR();
                ret += cellInset(cell)->xhtml(xs, runparams);
                xs << html::EndTag(celltag) << html::CR();
                ++cell;
@@ -3413,13 +3412,6 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd,
 {
        bool enabled = true;
        switch (cmd.action()) {
-       case LFUN_LAYOUT:
-               enabled = !forcePlainLayout();
-               break;
-       case LFUN_LAYOUT_PARAGRAPH:
-               enabled = allowParagraphCustomization();
-               break;
-
        case LFUN_MATH_DISPLAY:
                if (!hasFixedWidth()) {
                        enabled = false;
@@ -3482,7 +3474,8 @@ InsetTabular::InsetTabular(Buffer * buf, row_type rows,
 
 
 InsetTabular::InsetTabular(InsetTabular const & tab)
-       : Inset(tab), tabular(tab.tabular)
+       : Inset(tab), tabular(tab.tabular),
+         first_visible_cell_(0), offset_valign_(0), rowselect_(false), colselect_(false)
 {
 }
 
@@ -3521,7 +3514,7 @@ bool InsetTabular::insetAllowed(InsetCode code) const
 bool InsetTabular::allowsCaptionVariation(std::string const & newtype) const
 {
        return tabular.is_long_tabular &&
-               (newtype == "Standard" || newtype == "LongTableNoNumber");
+               (newtype == "Standard" || newtype == "Unnumbered");
 }
 
 
@@ -3623,7 +3616,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).get());
+                               InsetTableCell tail = InsetTableCell(*tabular.cellInset(cell));
                                tail.setBuffer(tabular.buffer());
                                // we need to set macrocontext position everywhere
                                // otherwise we crash with nested insets (e.g. footnotes)
@@ -3951,6 +3944,29 @@ void InsetTabular::addToToc(DocIterator const & cpit, bool output_active,
 }
 
 
+bool InsetTabular::hitSelectRow(BufferView const & bv, int x) const
+{
+       int const x0 = xo(bv) + ADD_TO_TABULAR_WIDTH;
+       return x < x0 || x > x0 + tabular.width();
+}
+
+
+bool InsetTabular::hitSelectColumn(BufferView const & bv, int y) const
+{
+       int const y0 = yo(bv) - tabular.rowAscent(0) + offset_valign_;
+       // FIXME: using ADD_TO_TABULAR_WIDTH is not really correct since
+       // there is no margin added vertically to tabular insets.
+       // However, it works for now.
+       return y < y0 + ADD_TO_TABULAR_WIDTH || y > y0 + tabular.height() - ADD_TO_TABULAR_WIDTH;
+}
+
+
+bool InsetTabular::clickable(BufferView const & bv, int x, int y) const
+{
+       return hitSelectRow(bv, x) || hitSelectColumn(bv, y);
+}
+
+
 void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
        LYXERR(Debug::DEBUG, "# InsetTabular::doDispatch: cmd: " << cmd
@@ -3965,30 +3981,31 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MOUSE_PRESS: {
                //lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl;
                // select row
-               if (cmd.x() < xo(cur.bv()) + ADD_TO_TABULAR_WIDTH
-                       || cmd.x() > xo(cur.bv()) + tabular.width()) {
+               if (hitSelectRow(cur.bv(), cmd.x())) {
                        row_type r = rowFromY(cur, cmd.y());
                        cur.idx() = tabular.getFirstCellInRow(r);
+                       cur.pit() = 0;
                        cur.pos() = 0;
                        cur.resetAnchor();
                        cur.idx() = tabular.getLastCellInRow(r);
+                       cur.pit() = cur.lastpit();
                        cur.pos() = cur.lastpos();
-                       cur.setSelection(true);
+                       cur.selection(true);
                        bvcur = cur;
                        rowselect_ = true;
                        break;
                }
                // select column
-               int const y0 = yo(cur.bv()) - tabular.rowAscent(0) + offset_valign_;
-               if (cmd.y() < y0 + ADD_TO_TABULAR_WIDTH
-                       || cmd.y() > y0 + tabular.height()) {
+               if (hitSelectColumn(cur.bv(), cmd.y())) {
                        col_type c = columnFromX(cur, cmd.x());
                        cur.idx() = tabular.cellIndex(0, c);
+                       cur.pit() = 0;
                        cur.pos() = 0;
                        cur.resetAnchor();
                        cur.idx() = tabular.cellIndex(tabular.nrows() - 1, c);
+                       cur.pit() = cur.lastpit();
                        cur.pos() = cur.lastpos();
-                       cur.setSelection(true);
+                       cur.selection(true);
                        bvcur = cur;
                        colselect_ = true;
                        break;
@@ -4021,7 +4038,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                cur.pit() = 0;
                                cur.pos() = 0;
                                bvcur.setCursor(cur);
-                               bvcur.setSelection(true);
+                               bvcur.selection(true);
                                break;
                        }
                        // select (additional) column
@@ -4033,7 +4050,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                cur.pit() = 0;
                                cur.pos() = 0;
                                bvcur.setCursor(cur);
-                               bvcur.setSelection(true);
+                               bvcur.selection(true);
                                break;
                        }
                        // only update if selection changes
@@ -4042,7 +4059,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                cur.noScreenUpdate();
                        setCursorFromCoordinates(cur, cmd.x(), cmd.y());
                        bvcur.setCursor(cur);
-                       bvcur.setSelection(true);
+                       bvcur.selection(true);
                        // if this is a multicell selection, we just set the cursor to
                        // the beginning of the cell's text.
                        if (bvcur.selIsMultiCell()) {
@@ -4059,12 +4076,12 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_CELL_BACKWARD:
                movePrevCell(cur);
-               cur.setSelection(false);
+               cur.selection(false);
                break;
 
        case LFUN_CELL_FORWARD:
                moveNextCell(cur);
-               cur.setSelection(false);
+               cur.selection(false);
                break;
 
        case LFUN_CHAR_FORWARD_SELECT:
@@ -4918,7 +4935,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()).get());
+               InsetTableCell itc = InsetTableCell(*tabular.cellInset(cur.idx()));
                ParagraphList::const_iterator pit = itc.paragraphs().begin();
                ParagraphList::const_iterator pend = itc.paragraphs().end();
                for (; pit != pend; ++pit) {
@@ -5162,7 +5179,7 @@ int InsetTabular::dist(BufferView & bv, idx_type const cell, int x, int y) const
 Inset * InsetTabular::editXY(Cursor & cur, int x, int y)
 {
        //lyxerr << "InsetTabular::editXY: " << this << endl;
-       cur.setSelection(false);
+       cur.selection(false);
        cur.push(*this);
        cur.idx() = getNearestCell(cur.bv(), x, y);
        return cur.bv().textMetrics(&cell(cur.idx())->text()).editXY(cur, x, y);
@@ -5331,6 +5348,8 @@ void InsetTabular::movePrevCell(Cursor & cur, EntryDirection entry_from)
 
 void InsetTabular::tabularFeatures(Cursor & cur, string const & argument)
 {
+       cur.recordUndoInset(this);
+
        istringstream is(argument);
        string s;
        // Safe guard.
@@ -5457,8 +5476,6 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                break;
        }
 
-       cur.recordUndoInset(this);
-
        getSelection(cur, sel_row_start, sel_row_end, sel_col_start, sel_col_end);
        row_type const row = tabular.cellRow(cur.idx());
        col_type const column = tabular.cellColumn(cur.idx());
@@ -5521,7 +5538,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                cur.idx() = tabular.cellIndex(sel_row_start, column);
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                break;
 
        case Tabular::DELETE_COLUMN:
@@ -5544,7 +5561,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                cur.idx() = tabular.cellIndex(row, sel_col_start);
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                break;
 
        case Tabular::COPY_ROW:
@@ -5660,7 +5677,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                                                   tabular.rightLine(cur.selEnd().idx()));
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                break;
        }
 
@@ -5717,7 +5734,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                                                tabular.getAlignment(cur.selEnd().idx()));
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                break;
        }
 
@@ -5922,7 +5939,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                cur.idx() = tabular.setLTCaption(row, true);
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                // If a row is set as caption, then also insert
                // a caption. Otherwise the LaTeX output is broken.
                // Select cell if it is non-empty
@@ -5938,7 +5955,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                cur.idx() = tabular.setLTCaption(row, false);
                cur.pit() = 0;
                cur.pos() = 0;
-               cur.setSelection(false);
+               cur.selection(false);
                FuncRequest fr(LFUN_INSET_DISSOLVE, "caption");
                if (lyx::getStatus(fr).enabled())
                        lyx::dispatch(fr);