X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.cpp;h=de9f862576e09290ccb1afd392f1fe7c7025ec6c;hb=e15d3d35cba7266d8a1a22c7e4cd92d12599e103;hp=c7f77fa816f2421e693d41eac90a6cc791f5aaae;hpb=418d4c02d2c0e9635920ed95fcdebac17540f35d;p=lyx.git diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index c7f77fa816..de9f862576 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -262,7 +262,7 @@ string const tostr(Tabular::BoxType const & num) // I would have liked a fromstr template a lot better. (Lgb) -bool string2type(string const str, LyXAlignment & num) +bool string2type(string const & str, LyXAlignment & num) { if (str == "none") num = LYX_ALIGN_NONE; @@ -282,7 +282,7 @@ bool string2type(string const str, LyXAlignment & num) } -bool string2type(string const str, Tabular::HAlignment & num) +bool string2type(string const & str, Tabular::HAlignment & num) { if (str == "left") num = Tabular::LYX_LONGTABULAR_ALIGN_LEFT; @@ -296,7 +296,7 @@ bool string2type(string const str, Tabular::HAlignment & num) } -bool string2type(string const str, Tabular::VAlignment & num) +bool string2type(string const & str, Tabular::VAlignment & num) { if (str == "top") num = Tabular::LYX_VALIGN_TOP; @@ -310,7 +310,7 @@ bool string2type(string const str, Tabular::VAlignment & num) } -bool string2type(string const str, Tabular::BoxType & num) +bool string2type(string const & str, Tabular::BoxType & num) { if (str == "none") num = Tabular::BOX_NONE; @@ -324,7 +324,7 @@ bool string2type(string const str, Tabular::BoxType & num) } -bool string2type(string const str, bool & num) +bool string2type(string const & str, bool & num) { if (str == "true") num = true; @@ -534,7 +534,7 @@ DocIterator separatorPos(InsetTableCell * cell, docstring const & align_d) } -InsetTableCell splitCell(InsetTableCell & head, docstring const align_d, bool & hassep) +InsetTableCell splitCell(InsetTableCell & head, docstring const & align_d, bool & hassep) { InsetTableCell tail = InsetTableCell(head); DocIterator const dit = separatorPos(&head, align_d); @@ -542,7 +542,7 @@ InsetTableCell splitCell(InsetTableCell & head, docstring const align_d, bool & if (hassep) { pit_type const psize = head.paragraphs().front().size(); head.paragraphs().front().eraseChars(dit.pos(), psize, false); - tail.paragraphs().front().eraseChars(0, + tail.paragraphs().front().eraseChars(0, dit.pos() < psize ? dit.pos() + 1 : psize, false); } @@ -602,36 +602,32 @@ Tabular::CellData::CellData(CellData const & cs) { } -Tabular::CellData & Tabular::CellData::operator=(CellData cs) -{ - swap(cs); +Tabular::CellData & Tabular::CellData::operator=(CellData const & cs) +{ + if (&cs == this) + return *this; + cellno = cs.cellno; + width = cs.width; + multicolumn = cs.multicolumn; + multirow = cs.multirow; + mroffset = cs.mroffset; + alignment = cs.alignment; + valignment = cs.valignment; + decimal_hoffset = cs.decimal_hoffset; + decimal_width = cs.decimal_width; + voffset = cs.voffset; + top_line = cs.top_line; + bottom_line = cs.bottom_line; + left_line = cs.left_line; + right_line = cs.right_line; + usebox = cs.usebox; + rotate = cs.rotate; + align_special = cs.align_special; + p_width = cs.p_width; + inset.reset(static_cast(cs.inset->clone())); return *this; } -void Tabular::CellData::swap(CellData & rhs) -{ - std::swap(cellno, rhs.cellno); - std::swap(width, rhs.width); - std::swap(multicolumn, rhs.multicolumn); - std::swap(multirow, rhs.multirow); - std::swap(mroffset, rhs.mroffset); - std::swap(alignment, rhs.alignment); - std::swap(valignment, rhs.valignment); - std::swap(decimal_hoffset, rhs.decimal_hoffset); - std::swap(decimal_width, rhs.decimal_width); - std::swap(voffset, rhs.voffset); - std::swap(top_line, rhs.top_line); - std::swap(bottom_line, rhs.bottom_line); - std::swap(left_line, rhs.left_line); - std::swap(right_line, rhs.right_line); - std::swap(usebox, rhs.usebox); - std::swap(rotate, rhs.rotate); - std::swap(align_special, rhs.align_special); - p_width.swap(rhs.p_width); - inset.swap(rhs.inset); -} - - Tabular::RowData::RowData() : ascent(0), descent(0), @@ -742,18 +738,18 @@ 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])); - cell_info.insert(cell_info.begin() + row + 1, + 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_)); - if (buffer().params().trackChanges) + 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; } - + updateIndexes(); for (col_type c = 0; c < ncols(); ++c) { if (isPartOfMultiRow(row, c)) @@ -769,7 +765,7 @@ void Tabular::insertRow(row_type const row, bool copy) setBottomLine(j, false); } // mark track changes - if (buffer().params().trackChanges) + if (buffer().params().track_changes) cellInfo(i).inset->setChange(Change(Change::INSERTED)); } } @@ -790,7 +786,7 @@ void Tabular::moveColumn(col_type col, ColDirection direction) // FIXME track changes is broken for tabular features (#8469) idx_type const i = cellIndex(r, col); idx_type const j = cellIndex(r, col + 1); - if (buffer().params().trackChanges) { + if (buffer().params().track_changes) { cellInfo(i).inset->setChange(Change(Change::INSERTED)); cellInfo(j).inset->setChange(Change(Change::INSERTED)); } @@ -814,7 +810,7 @@ void Tabular::moveRow(row_type row, RowDirection direction) // FIXME track changes is broken for tabular features (#8469) idx_type const i = cellIndex(row, c); idx_type const j = cellIndex(row + 1, c); - if (buffer().params().trackChanges) { + if (buffer().params().track_changes) { cellInfo(i).inset->setChange(Change(Change::INSERTED)); cellInfo(j).inset->setChange(Change(Change::INSERTED)); } @@ -850,7 +846,7 @@ void Tabular::copyColumn(col_type const col) void Tabular::appendColumn(col_type col) -{ +{ insertColumn(col, false); } @@ -863,7 +859,7 @@ 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 (bp.trackChanges) + if (bp.track_changes) 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; @@ -876,11 +872,11 @@ void Tabular::insertColumn(col_type const col, bool copy) setBottomLine(i, bottomLine(j)); setTopLine(i, topLine(j)); setLeftLine(i, leftLine(j)); - if (rightLine(j) && rightLine(j)) { + if (rightLine(i) && rightLine(j)) { setRightLine(i, true); setRightLine(j, false); } - if (buffer().params().trackChanges) + if (buffer().params().track_changes) cellInfo(i).inset->setChange(Change(Change::INSERTED)); } } @@ -1033,7 +1029,7 @@ bool Tabular::updateColumnWidths() if (columnSpan(i) == 1) { if (getAlignment(i) == LYX_ALIGN_DECIMAL && cell_info[r][c].decimal_width!=0) - new_width = max(new_width, cellInfo(i).width + new_width = max(new_width, cellInfo(i).width + max_dwidth[c] - cellInfo(i).decimal_width); else new_width = max(new_width, cellInfo(i).width); @@ -1102,8 +1098,8 @@ void Tabular::setAlignment(idx_type cell, LyXAlignment align, if (align == LYX_ALIGN_DECIMAL && dpoint.empty()) dpoint = from_utf8(lyxrc.default_decimal_point); } else { - cellInfo(cell).alignment = align; - cellInset(cell).get()->setContentAlignment(align); + cellInfo(cell).alignment = align; + cellInset(cell).get()->setContentAlignment(align); } } @@ -1154,7 +1150,7 @@ void Tabular::setColumnPWidth(Cursor & cur, idx_type cell, col_type const c = cellColumn(cell); column_info[c].p_width = width; - // reset the vertical alignment to top if the fixed with + // reset the vertical alignment to top if the fixed width // is removed or zero because only fixed width columns can // have a vertical alignment if (column_info[c].p_width.zero()) @@ -1164,6 +1160,8 @@ void Tabular::setColumnPWidth(Cursor & cur, idx_type cell, // because of multicolumns toggleFixedWidth(cur, cellInset(cell).get(), !getPWidth(cell).zero()); + if (isMultiRow(cell)) + setAlignment(cell, LYX_ALIGN_LEFT, false); } // cur paragraph can become invalid after paragraphs were merged if (cur.pit() > cur.lastpit()) @@ -1291,7 +1289,7 @@ bool Tabular::columnRightLine(col_type c) const idx_type i = cellIndex(r, c); if (c == cellColumn(i) + columnSpan(i) - 1) { ++total; - bool left = (c + 1 < ncols() + bool left = (c + 1 < ncols() && cellInfo(cellIndex(r, c + 1)).left_line) || c + 1 == ncols(); if (cellInfo(i).right_line && left) @@ -1306,7 +1304,7 @@ LyXAlignment Tabular::getAlignment(idx_type cell, bool onlycolumn) const { if (!onlycolumn && (isMultiColumn(cell) || isMultiRow(cell))) return cellInfo(cell).alignment; - + return column_info[cellColumn(cell)].alignment; } @@ -1378,7 +1376,7 @@ int Tabular::textVOffset(idx_type cell) const int voffset = cellInfo(cell).voffset; if (isMultiRow(cell)) { row_type const row = cellRow(cell); - voffset += (cellHeight(cell) - rowAscent(row) - rowDescent(row))/2; + voffset += (cellHeight(cell) - rowAscent(row) - rowDescent(row))/2; } return voffset; } @@ -1443,7 +1441,7 @@ void Tabular::write(ostream & os) const << ">\n"; // global longtable options os << "(rotate)) + << write_attribute("rotate", rotate) << write_attribute("booktabs", use_booktabs) << write_attribute("islongtable", is_long_tabular) << write_attribute("firstHeadTopDL", endfirsthead.topDL) @@ -1458,12 +1456,11 @@ void Tabular::write(ostream & os) const << write_attribute("lastFootEmpty", endlastfoot.empty); // longtables cannot be aligned vertically if (!is_long_tabular) { - os << write_attribute("tabularvalignment", tabular_valignment); - os << write_attribute("tabularwidth", tabular_width); + os << write_attribute("tabularvalignment", tabular_valignment); + os << write_attribute("tabularwidth", tabular_width); } if (is_long_tabular) - os << write_attribute("longtabularalignment", - longtabular_alignment); + os << write_attribute("longtabularalignment", longtabular_alignment); os << ">\n"; for (col_type c = 0; c < ncols(); ++c) { os << "write(os); os << "\n\\end_inset\n" << "\n"; + // FIXME This can be removed again once the mystery + // crash has been resolved. + os << flush; } os << "\n"; } @@ -1651,7 +1651,7 @@ void Tabular::read(Lexer & lex) bool Tabular::isMultiColumn(idx_type cell) const { - return (cellInfo(cell).multicolumn == CELL_BEGIN_OF_MULTICOLUMN + return (cellInfo(cell).multicolumn == CELL_BEGIN_OF_MULTICOLUMN || cellInfo(cell).multicolumn == CELL_PART_OF_MULTICOLUMN); } @@ -1715,7 +1715,8 @@ bool Tabular::hasMultiRow(row_type r) const } Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number, - bool const bottom_border) + bool const bottom_border, + LyXAlignment const halign) { idx_type const col = cellColumn(cell); idx_type const row = cellRow(cell); @@ -1731,10 +1732,10 @@ Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number, // be changed for the whole table row, // support changing this only for the multirow cell can be done via // \multirowsetup - // this feature would be a fileformat change - // until LyX supports this, use the deault alignment of multirow - // cells: left - cs.alignment = LYX_ALIGN_LEFT; + if (getPWidth(cell).zero()) + cs.alignment = halign; + else + cs.alignment = LYX_ALIGN_LEFT; // set the bottom line of the last selected cell setBottomLine(cell, bottom_border); @@ -1768,7 +1769,7 @@ Tabular::idx_type Tabular::rowSpan(idx_type cell) const col_type row = cellRow(cell) + 1; while (row < nrows() && isPartOfMultiRow(row, column)) ++row; - + return row - cellRow(cell); } @@ -1848,7 +1849,7 @@ Tabular::idx_type Tabular::cellAbove(idx_type cell) const { if (cellRow(cell) == 0) return cell; - + col_type const col = cellColumn(cell); row_type r = cellRow(cell) - 1; while (r > 0 && cell_info[r][col].multirow == CELL_PART_OF_MULTIROW) @@ -2139,7 +2140,7 @@ bool Tabular::isPartOfMultiRow(row_type row, col_type column) const } -void Tabular::TeXTopHLine(otexstream & os, row_type row, string const lang) const +void Tabular::TeXTopHLine(otexstream & os, row_type row, string const & lang) const { // we only output complete row lines and the 1st row here, the rest // is done in Tabular::TeXBottomHLine(...) @@ -2177,22 +2178,22 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, string const lang) cons for (col_type j = 0 ; j < c; ++j) if (column_info[j].alignment == LYX_ALIGN_DECIMAL) ++offset; - + //babel makes the "-" character an active one, so we have to suppress this here //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289# if (lang == "slovak" || lang == "czech") - os << "\\expandafter" << (use_booktabs ? "\\cmidrule" : "\\cline") + os << "\\expandafter" << (use_booktabs ? "\\cmidrule" : "\\cline") << "\\expandafter{\\expandafter" << c + 1 + offset << "\\string-"; else os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 + offset << '-'; - + col_type cstart = c; for ( ; c < ncols() && topline[c]; ++c) {} - + for (col_type j = cstart ; j < c ; ++j) if (column_info[j].alignment == LYX_ALIGN_DECIMAL) ++offset; - + os << c + offset << "} "; } } @@ -2201,7 +2202,7 @@ void Tabular::TeXTopHLine(otexstream & os, row_type row, string const lang) cons } -void Tabular::TeXBottomHLine(otexstream & os, row_type row, string const lang) const +void Tabular::TeXBottomHLine(otexstream & os, row_type row, string const & lang) const { // we output bottomlines of row r and the toplines of row r+1 // if the latter do not span the whole tabular @@ -2250,7 +2251,7 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, string const lang) c for (col_type j = 0 ; j < c; ++j) if (column_info[j].alignment == LYX_ALIGN_DECIMAL) ++offset; - + //babel makes the "-" character an active one, so we have to suppress this here //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289# if (lang == "slovak" || lang == "czech") @@ -2258,14 +2259,14 @@ void Tabular::TeXBottomHLine(otexstream & os, row_type row, string const lang) c << "\\expandafter{\\expandafter" << c + 1 + offset << "\\string-"; else os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 + offset << '-'; - + col_type cstart = c; for ( ; c < ncols() && bottomline[c]; ++c) {} - + for (col_type j = cstart ; j < c ; ++j) if (column_info[j].alignment == LYX_ALIGN_DECIMAL) ++offset; - + os << c + offset << "} "; } } @@ -2290,7 +2291,7 @@ void Tabular::TeXCellPreamble(otexstream & os, idx_type cell, bool colright = columnRightLine(c); bool colleft = columnLeftLine(c); bool nextcolleft = nextcol < ncols() && columnLeftLine(nextcol); - bool nextcellleft = nextcol < ncols() + bool nextcellleft = nextcol < ncols() && leftLine(cellIndex(r, nextcol)); bool coldouble = colright && nextcolleft; bool celldouble = rightLine(cell) && nextcellleft; @@ -2563,7 +2564,7 @@ void Tabular::TeXRow(otexstream & os, row_type row, if (isPartOfMultiRow(row, c) && column_info[c].alignment != LYX_ALIGN_DECIMAL) { if (cell != getLastCellInRow(row)) - os << " & "; + os << " & "; continue; } @@ -2712,7 +2713,7 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const break; } } - + os << "{"; if (is_tabular_star) @@ -3413,7 +3414,7 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd, return true; } -docstring InsetTableCell::asString(bool intoInsets) +docstring InsetTableCell::asString(bool intoInsets) { docstring retval; if (paragraphs().empty()) @@ -3432,6 +3433,12 @@ docstring InsetTableCell::asString(bool intoInsets) } +void InsetTableCell::addToToc(DocIterator const & di, bool output_active) const +{ + InsetText::iterateForToc(di, output_active); +} + + docstring InsetTableCell::xhtml(XHTMLStream & xs, OutputParams const & rp) const { if (!isFixedWidth) @@ -3449,7 +3456,7 @@ docstring InsetTableCell::xhtml(XHTMLStream & xs, OutputParams const & rp) const InsetTabular::InsetTabular(Buffer * buf, row_type rows, col_type columns) - : Inset(buf), tabular(buf, max(rows, row_type(1)), max(columns, col_type(1))), scx_(0), + : Inset(buf), tabular(buf, max(rows, row_type(1)), max(columns, col_type(1))), scx_(0), rowselect_(false), colselect_(false) { } @@ -3587,11 +3594,11 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const tabular.cellInset(cell)->metrics(m, dim); if (!p_width.zero()) dim.wid = m.base.textwidth; - tabular.cellInfo(cell).width = dim.wid + 2 * WIDTH_OF_LINE + tabular.cellInfo(cell).width = dim.wid + 2 * WIDTH_OF_LINE + tabular.interColumnSpace(cell); // FIXME(?): do we need a second metrics call? - TextMetrics const & tm = + TextMetrics const & tm = mi.base.bv->textMetrics(tabular.cellInset(cell)->getText(0)); // determine horizontal offset because of decimal align (if necessary) @@ -3628,14 +3635,14 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const int const lastpardes = tm.last().second->descent() + TEXT_TO_INSET_OFFSET; int offset = 0; - switch (tabular.getVAlignment(cell)) { + switch (tabular.getVAlignment(cell)) { case Tabular::LYX_VALIGN_TOP: - break; + break; case Tabular::LYX_VALIGN_MIDDLE: - offset = -(dim.des - lastpardes)/2; - break; + offset = -(dim.des - lastpardes)/2; + break; case Tabular::LYX_VALIGN_BOTTOM: - offset = -(dim.des - lastpardes); + offset = -(dim.des - lastpardes); break; } tabular.cell_info[r][c].voffset = offset; @@ -3668,13 +3675,13 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const } tabular.updateColumnWidths(); - dim.asc = tabular.rowAscent(0) - offset_valign_; + dim.asc = tabular.rowAscent(0) - offset_valign_; dim.des = tabular.height() - dim.asc; dim.wid = tabular.width() + 2 * ADD_TO_TABULAR_WIDTH; } -bool InsetTabular::isCellSelected(Cursor & cur, row_type row, col_type col) +bool InsetTabular::isCellSelected(Cursor & cur, row_type row, col_type col) const { if (&cur.inset() == this && cur.selection()) { @@ -3682,15 +3689,15 @@ bool InsetTabular::isCellSelected(Cursor & cur, row_type row, col_type col) row_type rs, re; col_type cs, ce; getSelection(cur, rs, re, cs, ce); - + idx_type const cell = tabular.cellIndex(row, col); col_type const cspan = tabular.columnSpan(cell); row_type const rspan = tabular.rowSpan(cell); - if (col + cspan - 1 >= cs && col <= ce + if (col + cspan - 1 >= cs && col <= ce && row + rspan - 1 >= rs && row <= re) return true; - } else - if (col == tabular.cellColumn(cur.idx()) + } else + if (col == tabular.cellColumn(cur.idx()) && row == tabular.cellRow(cur.idx())) { CursorSlice const & beg = cur.selBegin(); CursorSlice const & end = cur.selEnd(); @@ -3728,9 +3735,9 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const for (col_type c = 0; c < tabular.ncols(); ++c) { if (tabular.isPartOfMultiColumn(r, c)) continue; - + idx = tabular.cellIndex(r, c); - + if (tabular.isPartOfMultiRow(r, c)) { nx += tabular.cellWidth(idx); continue; @@ -3751,7 +3758,7 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const } if (r + 1 < tabular.nrows()) - yy += tabular.rowDescent(r) + tabular.rowAscent(r + 1) + yy += tabular.rowDescent(r) + tabular.rowAscent(r + 1) + tabular.interRowSpace(r + 1); } } @@ -3808,7 +3815,7 @@ void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const + tabular.interRowSpace(r + 1); } - } + } // FIXME: This code has no effect because InsetTableCell does not handle // drawSelection other than the trivial implementation in Inset. //else { @@ -3852,7 +3859,7 @@ void InsetTabular::drawCellLines(PainterInfo & pi, int x, int y, // Right x -= tabular.interColumnSpace(cell); col_type next_cell_col = col + 1; - while (next_cell_col < tabular.ncols() + while (next_cell_col < tabular.ncols() && tabular.isMultiColumn(tabular.cellIndex(row, next_cell_col))) next_cell_col++; drawline = tabular.rightLine(cell) @@ -3868,7 +3875,7 @@ void InsetTabular::edit(Cursor & cur, bool front, EntryDirection) { //lyxerr << "InsetTabular::edit: " << this << endl; cur.finishUndo(); - cur.setSelection(false); + //cur.setSelection(false); cur.push(*this); if (front) { if (isRightToLeft(cur)) @@ -3897,8 +3904,12 @@ void InsetTabular::updateBuffer(ParIterator const & it, UpdateType utype) // In a longtable, tell captions what the current float is Counters & cnts = buffer().masterBuffer()->params().documentClass().counters(); string const saveflt = cnts.current_float(); - if (tabular.is_long_tabular) + if (tabular.is_long_tabular) { cnts.current_float("table"); + // in longtables, we only step the counter once + cnts.step(from_ascii("table"), utype); + cnts.isLongtable(true); + } ParIterator it2 = it; it2.forwardPos(); @@ -3907,8 +3918,10 @@ void InsetTabular::updateBuffer(ParIterator const & it, UpdateType utype) buffer().updateBuffer(it2, utype); //reset afterwards - if (tabular.is_long_tabular) + if (tabular.is_long_tabular) { cnts.current_float(saveflt); + cnts.isLongtable(false); + } } @@ -3930,7 +3943,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) Cursor & bvcur = cur.bv().cursor(); FuncCode const act = cmd.action(); - + switch (act) { case LFUN_MOUSE_PRESS: { @@ -3945,13 +3958,13 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = tabular.getLastCellInRow(r); cur.pos() = cur.lastpos(); cur.setSelection(true); - bvcur = cur; + 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 + if (cmd.y() < y0 + ADD_TO_TABULAR_WIDTH || cmd.y() > y0 + tabular.height()) { col_type c = columnFromX(cur, cmd.x()); cur.idx() = tabular.cellIndex(0, c); @@ -3960,15 +3973,15 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = tabular.cellIndex(tabular.nrows() - 1, c); cur.pos() = cur.lastpos(); cur.setSelection(true); - bvcur = cur; + bvcur = cur; colselect_ = true; break; } // do not reset cursor/selection if we have selected // some cells (bug 2715). if (cmd.button() == mouse_button::button3 - && &bvcur.selBegin().inset() == this - && bvcur.selIsMultiCell()) + && &bvcur.selBegin().inset() == this + && bvcur.selIsMultiCell()) ; else // Let InsetTableCell do it @@ -4045,7 +4058,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CHAR_RIGHT_SELECT: case LFUN_CHAR_RIGHT: case LFUN_CHAR_LEFT_SELECT: - case LFUN_CHAR_LEFT: + case LFUN_CHAR_LEFT: case LFUN_WORD_FORWARD: case LFUN_WORD_FORWARD_SELECT: case LFUN_WORD_BACKWARD: @@ -4054,14 +4067,14 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_WORD_RIGHT_SELECT: case LFUN_WORD_LEFT: case LFUN_WORD_LEFT_SELECT: { - // determine whether we move to next or previous cell, where to enter + // determine whether we move to next or previous cell, where to enter // the new cell from, and which command to "finish" (i.e., exit the // inset) with: bool next_cell; EntryDirection entry_from = ENTRY_DIRECTION_IGNORE; FuncCode finish_lfun; - if (act == LFUN_CHAR_FORWARD + if (act == LFUN_CHAR_FORWARD || act == LFUN_CHAR_FORWARD_SELECT || act == LFUN_WORD_FORWARD || act == LFUN_WORD_FORWARD_SELECT) { @@ -4075,7 +4088,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) next_cell = false; finish_lfun = LFUN_FINISHED_BACKWARD; } - // LEFT or RIGHT commands --- the interpretation will depend on the + // LEFT or RIGHT commands --- the interpretation will depend on the // table's direction. else { bool const right = act == LFUN_CHAR_RIGHT @@ -4083,14 +4096,14 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) || act == LFUN_WORD_RIGHT || act == LFUN_WORD_RIGHT_SELECT; next_cell = isRightToLeft(cur) != right; - + if (lyxrc.visual_cursor) entry_from = right ? ENTRY_DIRECTION_LEFT:ENTRY_DIRECTION_RIGHT; finish_lfun = right ? LFUN_FINISHED_RIGHT : LFUN_FINISHED_LEFT; } - bool const select = act == LFUN_CHAR_FORWARD_SELECT + bool const select = act == LFUN_CHAR_FORWARD_SELECT || act == LFUN_CHAR_BACKWARD_SELECT || act == LFUN_CHAR_RIGHT_SELECT || act == LFUN_CHAR_LEFT_SELECT @@ -4099,15 +4112,15 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) || act == LFUN_WORD_BACKWARD_SELECT || act == LFUN_WORD_LEFT_SELECT; - // If we have a multicell selection or we're + // If we have a multicell selection or we're // not doing some LFUN_*_SELECT thing anyway... if (!cur.selIsMultiCell() || !select) { col_type const c = tabular.cellColumn(cur.idx()); row_type const r = tabular.cellRow(cur.idx()); - // Are we trying to select the whole cell and is the whole cell + // Are we trying to select the whole cell and is the whole cell // not yet selected? bool const select_whole = select && !isCellSelected(cur, r, c) && - ((next_cell && cur.pit() == cur.lastpit() + ((next_cell && cur.pit() == cur.lastpit() && cur.pos() == cur.lastpos()) || (!next_cell && cur.pit() == 0 && cur.pos() == 0)); @@ -4125,7 +4138,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) break; } - // FIXME: When we support the selection of an empty cell, remove + // FIXME: When we support the selection of an empty cell, remove // the !empty_cell from this condition. For now we jump to the next // cell if the current cell is empty. if (cur.result().dispatched() && !empty_cell) @@ -4142,9 +4155,10 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) else movePrevCell(cur, entry_from); // if we're exiting the table, call the appropriate FINISHED lfun - if (sl == cur.top()) + if (sl == cur.top()) { cmd = FuncRequest(finish_lfun); - else + cur.undispatched(); + } else cur.dispatched(); cur.screenUpdateFlags(Update::Force | Update::FitCursor); @@ -4156,7 +4170,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_DOWN: if (!(cur.selection() && cur.selIsMultiCell())) cell(cur.idx())->dispatch(cur, cmd); - + cur.dispatched(); // override the cell's decision if (sl == cur.top()) { // if our Text didn't do anything to the cursor @@ -4290,7 +4304,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) FileName(to_utf8(cmd.argument()))); if (tmpstr.empty()) break; - cur.recordUndoInset(INSERT_UNDO); + cur.recordUndoInset(); if (insertPlaintextString(cur.bv(), tmpstr, false)) { // content has been replaced, // so cursor might be invalid @@ -4305,7 +4319,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CUT: if (cur.selIsMultiCell()) { if (copySelection(cur)) { - cur.recordUndoInset(DELETE_UNDO); + cur.recordUndoInset(); cutSelection(cur); } } else @@ -4314,16 +4328,24 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_SELF_INSERT: if (cur.selIsMultiCell()) { - cur.recordUndoInset(DELETE_UNDO); + cur.recordUndoInset(); cutSelection(cur); - } - cell(cur.idx())->dispatch(cur, cmd); + BufferView * bv = &cur.bv(); + docstring::const_iterator cit = cmd.argument().begin(); + docstring::const_iterator const end = cmd.argument().end(); + for (; cit != end; ++cit) + bv->translateAndInsert(*cit, getText(cur.idx()), cur); + + cur.resetAnchor(); + bv->bookmarkEditPosition(); + } else + cell(cur.idx())->dispatch(cur, cmd); break; case LFUN_CHAR_DELETE_BACKWARD: case LFUN_CHAR_DELETE_FORWARD: if (cur.selIsMultiCell()) { - cur.recordUndoInset(DELETE_UNDO); + cur.recordUndoInset(); cutSelection(cur); } else cell(cur.idx())->dispatch(cur, cmd); @@ -4349,7 +4371,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) // pass to InsertPlaintextString, but // only if we have multi-cell content if (clip.find_first_of(from_ascii("\t\n")) != docstring::npos) { - cur.recordUndoInset(INSERT_UNDO); + cur.recordUndoInset(); if (insertPlaintextString(cur.bv(), clip, false)) { // content has been replaced, // so cursor might be invalid @@ -4371,7 +4393,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) break; } if (theClipboard().isInternal()) { - cur.recordUndoInset(INSERT_UNDO); + cur.recordUndoInset(); pasteClipboard(cur); } break; @@ -4445,7 +4467,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, { switch (cmd.action()) { case LFUN_INSET_MODIFY: { - if (&cur.inset() != this || cmd.getArg(0) != "tabular") + if (&cur.inset() != this || cmd.getArg(0) != "tabular") break; // FIXME: We only check for the very first argument... @@ -4625,7 +4647,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, case Tabular::M_ALIGN_RIGHT: flag = false; case Tabular::ALIGN_RIGHT: - status.setEnabled(!(tabular.isMultiRow(cur.idx()) + status.setEnabled(!(tabular.isMultiRow(cur.idx()) && !tabular.getPWidth(cur.idx()).zero())); status.setOnOff(tabular.getAlignment(cur.idx(), flag) == LYX_ALIGN_RIGHT); break; @@ -4633,7 +4655,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, case Tabular::M_ALIGN_CENTER: flag = false; case Tabular::ALIGN_CENTER: - status.setEnabled(!(tabular.isMultiRow(cur.idx()) + status.setEnabled(!(tabular.isMultiRow(cur.idx()) && !tabular.getPWidth(cur.idx()).zero())); status.setOnOff(tabular.getAlignment(cur.idx(), flag) == LYX_ALIGN_CENTER); break; @@ -4645,7 +4667,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::ALIGN_DECIMAL: - status.setEnabled(!tabular.isMultiRow(cur.idx()) + status.setEnabled(!tabular.isMultiRow(cur.idx()) && !tabular.isMultiColumn(cur.idx())); status.setOnOff(tabular.getAlignment(cur.idx(), true) == LYX_ALIGN_DECIMAL); break; @@ -4698,30 +4720,30 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, case Tabular::TABULAR_VALIGN_TOP: status.setEnabled(tabular.tabular_width.zero()); - status.setOnOff(tabular.tabular_valignment + status.setOnOff(tabular.tabular_valignment == Tabular::LYX_VALIGN_TOP); break; case Tabular::TABULAR_VALIGN_MIDDLE: status.setEnabled(tabular.tabular_width.zero()); - status.setOnOff(tabular.tabular_valignment + status.setOnOff(tabular.tabular_valignment == Tabular::LYX_VALIGN_MIDDLE); break; case Tabular::TABULAR_VALIGN_BOTTOM: status.setEnabled(tabular.tabular_width.zero()); - status.setOnOff(tabular.tabular_valignment + status.setOnOff(tabular.tabular_valignment == Tabular::LYX_VALIGN_BOTTOM); break; case Tabular::LONGTABULAR_ALIGN_LEFT: - status.setOnOff(tabular.longtabular_alignment + status.setOnOff(tabular.longtabular_alignment == Tabular::LYX_LONGTABULAR_ALIGN_LEFT); break; case Tabular::LONGTABULAR_ALIGN_CENTER: - status.setOnOff(tabular.longtabular_alignment + status.setOnOff(tabular.longtabular_alignment == Tabular::LYX_LONGTABULAR_ALIGN_CENTER); break; case Tabular::LONGTABULAR_ALIGN_RIGHT: - status.setOnOff(tabular.longtabular_alignment + status.setOnOff(tabular.longtabular_alignment == Tabular::LYX_LONGTABULAR_ALIGN_RIGHT); break; @@ -4752,7 +4774,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::UNSET_LTFIRSTHEAD: - status.setEnabled(sel_row_start == sel_row_end && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(!tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)); break; @@ -4762,7 +4784,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::UNSET_LTHEAD: - status.setEnabled(sel_row_start == sel_row_end && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(!tabular.getRowOfLTHead(sel_row_start, dummyltt)); break; @@ -4772,7 +4794,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::UNSET_LTFOOT: - status.setEnabled(sel_row_start == sel_row_end && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(!tabular.getRowOfLTFoot(sel_row_start, dummyltt)); break; @@ -4782,7 +4804,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::UNSET_LTLASTFOOT: - status.setEnabled(sel_row_start == sel_row_end && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(!tabular.getRowOfLTLastFoot(sel_row_start, dummyltt)); break; @@ -4933,7 +4955,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, getSelection(cur, rs, re, cs, ce); if (paste_tabular && paste_tabular->ncols() == ce - cs + 1 && paste_tabular->nrows() == re - rs + 1) - status.setEnabled(true); + status.setEnabled(true); else { status.setEnabled(false); status.message(_("Selection size should match clipboard content.")); @@ -5137,7 +5159,7 @@ int InsetTabular::cellYPos(idx_type const cell) const row_type row = tabular.cellRow(cell); int ly = 0; for (row_type r = 0; r < row; ++r) - ly += tabular.rowDescent(r) + tabular.rowAscent(r + 1) + ly += tabular.rowDescent(r) + tabular.rowAscent(r + 1) + tabular.interRowSpace(r + 1); return ly; } @@ -5225,7 +5247,7 @@ void InsetTabular::moveNextCell(Cursor & cur, EntryDirection entry_from) cur.pos() = 0; // in visual mode, place cursor at extreme left or right - + switch(entry_from) { case ENTRY_DIRECTION_RIGHT: @@ -5283,7 +5305,7 @@ void InsetTabular::movePrevCell(Cursor & cur, EntryDirection entry_from) cur.pos() = cur.lastpos(); // in visual mode, place cursor at extreme left or right - + switch(entry_from) { case ENTRY_DIRECTION_RIGHT: @@ -5365,7 +5387,7 @@ static void checkLongtableSpecial(Tabular::ltType & ltt, bool InsetTabular::oneCellHasRotationState(bool rotated, row_type row_start, row_type row_end, - col_type col_start, col_type col_end) const + col_type col_start, col_type col_end) const { for (row_type r = row_start; r <= row_end; ++r) for (col_type c = col_start; c <= col_end; ++c) @@ -5684,7 +5706,8 @@ void InsetTabular::tabularFeatures(Cursor & cur, // check whether we are completely in a multirow if (!tabular.isMultiRow(cur.idx())) tabular.setMultiRow(cur.idx(), 1, - tabular.bottomLine(cur.idx())); + tabular.bottomLine(cur.idx()), + tabular.getAlignment(cur.idx())); break; } // we have a selection so this means we just add all this @@ -5693,7 +5716,8 @@ void InsetTabular::tabularFeatures(Cursor & cur, 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, - tabular.bottomLine(cur.selEnd().idx())); + tabular.bottomLine(cur.selEnd().idx()), + tabular.getAlignment(cur.selEnd().idx())); cur.pit() = 0; cur.pos() = 0; cur.setSelection(false); @@ -5810,7 +5834,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, tabular.longtabular_alignment = Tabular::LYX_LONGTABULAR_ALIGN_RIGHT; break; - + case Tabular::SET_ROTATE_CELL: for (row_type r = sel_row_start; r <= sel_row_end; ++r) @@ -5901,7 +5925,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, lyx::dispatch(FuncRequest(LFUN_CAPTION_INSERT)); break; } - + case Tabular::UNSET_LTCAPTION: { if (!tabular.ltCaption(row)) break; @@ -6077,7 +6101,7 @@ bool InsetTabular::pasteClipboard(Cursor & cur) tabular.cellInset(r2, c2)->setBuffer(tabular.buffer()); // FIXME: change tracking (MG) - inset->setChange(Change(buffer().params().trackChanges ? + inset->setChange(Change(buffer().params().track_changes ? Change::INSERTED : Change::UNCHANGED)); cur.pos() = 0; } @@ -6098,7 +6122,7 @@ void InsetTabular::cutSelection(Cursor & cur) for (col_type c = cs; c <= ce; ++c) { shared_ptr t = cell(tabular.cellIndex(r, c)); - if (buffer().params().trackChanges) + if (buffer().params().track_changes) // FIXME: Change tracking (MG) t->setChange(Change(Change::DELETED)); else @@ -6126,7 +6150,7 @@ bool InsetTabular::isRightToLeft(Cursor & cur) const } -docstring InsetTabular::asString(idx_type stidx, idx_type enidx, +docstring InsetTabular::asString(idx_type stidx, idx_type enidx, bool intoInsets) { LASSERT(stidx <= enidx, return docstring()); @@ -6268,7 +6292,7 @@ bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf, Font const font = bv.textMetrics(&inset->text()). displayFont(0, 0); inset->setText(buf.substr(op, p - op), font, - buffer().params().trackChanges); + buffer().params().track_changes); ++cols; ++cell; } @@ -6280,7 +6304,7 @@ bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf, Font const font = bv.textMetrics(&inset->text()). displayFont(0, 0); inset->setText(buf.substr(op, p - op), font, - buffer().params().trackChanges); + buffer().params().track_changes); } cols = ocol; ++row; @@ -6296,7 +6320,7 @@ bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf, shared_ptr inset = loctab->cellInset(cell); Font const font = bv.textMetrics(&inset->text()).displayFont(0, 0); inset->setText(buf.substr(op, len - op), font, - buffer().params().trackChanges); + buffer().params().track_changes); } return true; } @@ -6373,7 +6397,7 @@ bool InsetTabular::insertCompletion(Cursor & cur, docstring const & s, bool fini } -void InsetTabular::completionPosAndDim(Cursor const & cur, int & x, int & y, +void InsetTabular::completionPosAndDim(Cursor const & cur, int & x, int & y, Dimension & dim) const { TextMetrics const & tm = cur.bv().textMetrics(cur.text()); @@ -6419,4 +6443,22 @@ string InsetTabular::params2string(InsetTabular const & inset) } +void InsetTabular::setLayoutForHiddenCells(DocumentClass const & dc) +{ + for (Tabular::col_type c = 0; c < tabular.ncols(); ++c) { + for (Tabular::row_type r = 0; r < tabular.nrows(); ++r) { + if (!tabular.isPartOfMultiColumn(r,c) && + !tabular.isPartOfMultiRow(r,c)) + continue; + + ParagraphList & parlist = tabular.cellInset(r,c)->paragraphs(); + ParagraphList::iterator it = parlist.begin(); + ParagraphList::iterator const en = parlist.end(); + for (; it != en; ++it) + it->setLayout(dc.plainLayout()); + } + } +} + + } // namespace lyx