// 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;
}
-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;
}
-bool string2type(string const str, Tabular::VAlignment & num)
+bool string2type(string const & str, Tabular::VAlignment & num)
{
if (str == "top")
num = Tabular::LYX_VALIGN_TOP;
}
-bool string2type(string const str, Tabular::BoxType & num)
+bool string2type(string const & str, Tabular::BoxType & num)
{
if (str == "none")
num = Tabular::BOX_NONE;
}
-bool string2type(string const str, bool & num)
+bool string2type(string const & str, bool & num)
{
if (str == "true")
num = true;
}
-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);
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);
}
{
}
-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<InsetTableCell *>(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),
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 (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))
void Tabular::appendColumn(col_type col)
-{
+{
insertColumn(col, false);
}
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);
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);
}
}
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)
{
if (!onlycolumn && (isMultiColumn(cell) || isMultiRow(cell)))
return cellInfo(cell).alignment;
-
+
return column_info[cellColumn(cell)].alignment;
}
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;
}
<< ">\n";
// global longtable options
os << "<features"
- << write_attribute("rotate", convert<string>(rotate))
+ << write_attribute("rotate", rotate)
<< write_attribute("booktabs", use_booktabs)
<< write_attribute("islongtable", is_long_tabular)
<< write_attribute("firstHeadTopDL", endfirsthead.topDL)
cell_info[r][c].inset->write(os);
os << "\n\\end_inset\n"
<< "</cell>\n";
+ // FIXME This can be removed again once the mystery
+ // crash has been resolved.
+ os << flush;
}
os << "</row>\n";
}
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);
}
col_type row = cellRow(cell) + 1;
while (row < nrows() && isPartOfMultiRow(row, column))
++row;
-
+
return row - cellRow(cell);
}
{
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)
}
-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(...)
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 << "} ";
}
}
}
-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
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")
<< "\\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 << "} ";
}
}
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;
if (isPartOfMultiRow(row, c)
&& column_info[c].alignment != LYX_ALIGN_DECIMAL) {
if (cell != getLastCellInRow(row))
- os << " & ";
+ os << " & ";
continue;
}
break;
}
}
-
+
os << "{";
if (is_tabular_star)
return true;
}
-docstring InsetTableCell::asString(bool intoInsets)
+docstring InsetTableCell::asString(bool intoInsets)
{
docstring retval;
if (paragraphs().empty())
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),
- rowselect_(false), colselect_(false)
+ : Inset(buf), tabular(buf, max(rows, row_type(1)), max(columns, col_type(1))),
+ rowselect_(false), colselect_(false)
{
}
InsetTabular::InsetTabular(InsetTabular const & tab)
- : Inset(tab), tabular(tab.tabular), scx_(0)
+ : Inset(tab), tabular(tab.tabular)
{
}
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)
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;
}
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()) {
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();
void InsetTabular::draw(PainterInfo & pi, int x, int y) const
{
- x += scx_ + ADD_TO_TABULAR_WIDTH;
+ x += ADD_TO_TABULAR_WIDTH;
BufferView * bv = pi.base.bv;
Cursor & cur = pi.base.bv->cursor();
- resetPos(cur);
// FIXME: As the full background is painted in drawBackground(),
// we have no choice but to do a full repaint for the Text cells.
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;
}
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);
}
}
void InsetTabular::drawBackground(PainterInfo & pi, int x, int y) const
{
- x += scx_ + ADD_TO_TABULAR_WIDTH;
+ x += ADD_TO_TABULAR_WIDTH;
y += offset_valign_ - tabular.rowAscent(0);
pi.pain.fillRectangle(x, y, tabular.width(), tabular.height(),
pi.backgroundColor(this));
void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const
{
Cursor & cur = pi.base.bv->cursor();
- resetPos(cur);
- x += scx_ + ADD_TO_TABULAR_WIDTH;
+ x += ADD_TO_TABULAR_WIDTH;
if (!cur.selection())
return;
+ tabular.interRowSpace(r + 1);
}
- }
+ }
// FIXME: This code has no effect because InsetTableCell does not handle
// drawSelection other than the trivial implementation in Inset.
//else {
// 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)
{
//lyxerr << "InsetTabular::edit: " << this << endl;
cur.finishUndo();
- cur.setSelection(false);
cur.push(*this);
if (front) {
if (isRightToLeft(cur))
}
cur.setCurrentFont();
// FIXME: this accesses the position cache before it is initialized
- //resetPos(cur);
//cur.bv().fitCursor();
}
Cursor & bvcur = cur.bv().cursor();
FuncCode const act = cmd.action();
-
+
switch (act) {
case LFUN_MOUSE_PRESS: {
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);
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
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:
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) {
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
|| 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
|| 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));
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)
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);
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
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
case LFUN_CUT:
if (cur.selIsMultiCell()) {
if (copySelection(cur)) {
- cur.recordUndoInset(DELETE_UNDO);
+ cur.recordUndoInset();
cutSelection(cur);
}
} else
case LFUN_SELF_INSERT:
if (cur.selIsMultiCell()) {
- cur.recordUndoInset(DELETE_UNDO);
+ cur.recordUndoInset();
cutSelection(cur);
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
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);
// 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
break;
}
if (theClipboard().isInternal()) {
- cur.recordUndoInset(INSERT_UNDO);
+ cur.recordUndoInset();
pasteClipboard(cur);
}
break;
{
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...
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;
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;
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;
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;
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."));
x += cellXPos(sl.idx());
x += tabular.textHOffset(sl.idx());
x += ADD_TO_TABULAR_WIDTH;
- x += scx_;
}
cur.setSelection(false);
cur.push(*this);
cur.idx() = getNearestCell(cur.bv(), x, y);
- resetPos(cur);
return cur.bv().textMetrics(&cell(cur.idx())->text()).editXY(cur, x, y);
}
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;
}
}
-void InsetTabular::resetPos(Cursor & cur) const
-{
- BufferView & bv = cur.bv();
- int const maxwidth = bv.workWidth();
-
- int const scx_old = scx_;
- int const i = cur.find(this);
- if (i == -1) {
- scx_ = 0;
- } else {
- int const X1 = 0;
- int const X2 = maxwidth;
- int const offset = ADD_TO_TABULAR_WIDTH + 2;
- int const x1 = xo(cur.bv()) + cellXPos(cur[i].idx()) + offset;
- int const x2 = x1 + tabular.cellWidth(cur[i].idx());
-
- if (x1 < X1)
- scx_ = X1 + 20 - x1;
- else if (x2 > X2)
- scx_ = X2 - 20 - x2;
- else
- scx_ = 0;
- }
-
- // only update if offset changed
- if (scx_ != scx_old)
- cur.screenUpdateFlags(Update::Force | Update::FitCursor);
-}
-
-
void InsetTabular::moveNextCell(Cursor & cur, EntryDirection entry_from)
{
row_type const row = tabular.cellRow(cur.idx());
if (cur.selIsMultiCell()) {
cur.pit() = cur.lastpit();
cur.pos() = cur.lastpos();
- resetPos(cur);
return;
}
cur.pos() = 0;
// in visual mode, place cursor at extreme left or right
-
+
switch(entry_from) {
case ENTRY_DIRECTION_RIGHT:
}
cur.setCurrentFont();
- resetPos(cur);
}
if (cur.selIsMultiCell()) {
cur.pit() = cur.lastpit();
cur.pos() = cur.lastpos();
- resetPos(cur);
return;
}
cur.pos() = cur.lastpos();
// in visual mode, place cursor at extreme left or right
-
+
switch(entry_from) {
case ENTRY_DIRECTION_RIGHT:
}
cur.setCurrentFont();
- resetPos(cur);
}
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)
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)
lyx::dispatch(FuncRequest(LFUN_CAPTION_INSERT));
break;
}
-
+
case Tabular::UNSET_LTCAPTION: {
if (!tabular.ltCaption(row))
break;
}
-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());
}
-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());
}
+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