* \author John Levon
* \author André Pönitz
* \author Jürgen Vigna
+ * \author Uwe Stöhr
*
* Full author contact details are available in file CREDITS.
*/
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "OutputParams.h"
-#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
/////////////////////////////////////////////////////////////////////
-Tabular::CellData::CellData(Buffer & buf)
+Tabular::CellData::CellData(Buffer * buf)
: cellno(0),
width(0),
multicolumn(Tabular::CELL_NORMAL),
rotate(false),
inset(new InsetTableCell(buf))
{
- inset->setBuffer(const_cast<Buffer &>(buf));
+ inset->setBuffer(*buf);
}
{}
-Tabular::Tabular(Buffer & buffer, row_type rows_arg, col_type columns_arg)
+Tabular::Tabular(Buffer * buffer, row_type rows_arg, col_type columns_arg)
{
init(buffer, rows_arg, columns_arg);
}
// activates all lines and sets all widths to 0
-void Tabular::init(Buffer & buf, row_type rows_arg,
+void Tabular::init(Buffer * buf, row_type rows_arg,
col_type columns_arg)
{
- buffer_ = &buf;
+ buffer_ = buf;
row_info = row_vector(rows_arg);
column_info = column_vector(columns_arg);
cell_info = cell_vvector(rows_arg, cell_vector(columns_arg, CellData(buf)));
void Tabular::appendRow(idx_type const cell)
{
- BufferParams const & bp = buffer().params();
+ BufferParams const & bp = buffer_->params();
row_type const row = cellRow(cell);
row_vector::iterator rit = row_info.begin() + row;
for (row_type i = 0; i < nrows - 1; ++i)
swap(cell_info[i], old[i]);
- cell_info = cell_vvector(nrows, cell_vector(ncols, CellData(buffer())));
+ cell_info = cell_vvector(nrows, cell_vector(ncols, CellData(buffer_)));
for (row_type i = 0; i <= row; ++i)
swap(cell_info[i], old[i]);
for (row_type r = 0; r < nrows; ++r) {
cell_info[r].insert(cell_info[r].begin() + c + 1,
- CellData(buffer()));
+ CellData(buffer_));
#if 0
// FIXME: This code does not work. It deletes the cell's content and
// it triggers an assertion if the cursor is at pos > 0.
void Tabular::updateIndexes()
{
+ setBuffer(buffer());
col_type ncols = column_info.size();
row_type nrows = row_info.size();
numberofcells = 0;
// reset layout
cur.push(*inset);
// undo information has already been recorded
- inset->getText(0)->setLayout(cur.bv().buffer(), 0, cur.lastpit() + 1,
+ inset->getText(0)->setLayout(0, cur.lastpit() + 1,
bp.documentClass().plainLayoutName());
cur.pop();
}
os << "<features"
<< write_attribute("rotate", rotate)
<< write_attribute("booktabs", use_booktabs)
- << write_attribute("islongtable", is_long_tabular);
- // longtables cannot be aligned vertically
- if (!is_long_tabular)
- os << write_attribute("tabularvalignment", tabular_valignment);
- if (is_long_tabular)
- os << write_attribute("longtabularalignment",
- longtabular_alignment);
- os << write_attribute("firstHeadTopDL", endfirsthead.topDL)
+ << write_attribute("islongtable", is_long_tabular)
+ << write_attribute("firstHeadTopDL", endfirsthead.topDL)
<< write_attribute("firstHeadBottomDL", endfirsthead.bottomDL)
<< write_attribute("firstHeadEmpty", endfirsthead.empty)
<< write_attribute("headTopDL", endhead.topDL)
<< write_attribute("footBottomDL", endfoot.bottomDL)
<< write_attribute("lastFootTopDL", endlastfoot.topDL)
<< write_attribute("lastFootBottomDL", endlastfoot.bottomDL)
- << write_attribute("lastFootEmpty", endlastfoot.empty)
- << ">\n";
+ << write_attribute("lastFootEmpty", endlastfoot.empty);
+ // longtables cannot be aligned vertically
+ if (!is_long_tabular)
+ os << write_attribute("tabularvalignment", tabular_valignment);
+ if (is_long_tabular)
+ os << write_attribute("longtabularalignment",
+ longtabular_alignment);
+ os << ">\n";
for (col_type j = 0; j < column_info.size(); ++j) {
os << "<column"
<< write_attribute("alignment", column_info[j].alignment)
int columns_arg;
if (!getTokenValue(line, "columns", columns_arg))
return;
- init(buffer(), rows_arg, columns_arg);
+ init(buffer_, rows_arg, columns_arg);
l_getline(is, line);
if (!prefixIs(line, "<features")) {
lyxerr << "Wrong tabular format (expected <features ...> got"
setRightLine(i, false);
} else {
unsetMultiColumn(i);
- // FIXME: when unsetting a caption row, also all existing captions
- // in this row must be dissolved, see (bug 5754)
- // dispatch(FuncRequest(LFUN_INSET_DISSOLVE, "caption-insert"));
+ // When unsetting a caption row, also all existing
+ // captions in this row must be dissolved.
}
row_info[row].caption = what;
return i;
int ret = 0;
// caption handling
- // the caption must be output befrore the headers
+ // the caption must be output before the headers
if (haveLTCaption()) {
for (row_type i = 0; i < row_info.size(); ++i) {
if (row_info[i].caption) {
}
++cell;
}
- os << "\\tabularnewline";
+ if (row_info[i].caption && !endfirsthead.empty && !haveLTFirstHead())
+ // if no first header and no empty first header is used,
+ // the caption needs to be terminated by \endfirsthead
+ // (bug 6057)
+ os << "\\endfirsthead";
+ else
+ os << "\\tabularnewline";
if (row_info[i].bottom_space_default) {
if (use_booktabs)
os << "\\addlinespace";
//
/////////////////////////////////////////////////////////////////////
-InsetTableCell::InsetTableCell(Buffer & buf)
+InsetTableCell::InsetTableCell(Buffer * buf)
: InsetText(buf, InsetText::PlainLayout), isFixedWidth(false),
contentAlign(LYX_ALIGN_CENTER)
{}
//
/////////////////////////////////////////////////////////////////////
-InsetTabular::InsetTabular(Buffer & buf, row_type rows,
+InsetTabular::InsetTabular(Buffer * buf, row_type rows,
col_type columns)
- : 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)
{
- setBuffer(buf); // FIXME: remove later
}
}
-docstring InsetTabular::editMessage() const
-{
- return _("Opened table");
-}
-
-
void InsetTabular::edit(Cursor & cur, bool front, EntryDirection)
{
//lyxerr << "InsetTabular::edit: " << this << endl;
&& cur.pos() == cur.lastpos())
|| (!next_cell && cur.pit() == 0 && cur.pos() == 0));
+ bool const empty_cell = cur.lastpos() == 0 && cur.lastpit() == 0;
+
// ...try to dispatch to the cell's inset.
cell(cur.idx())->dispatch(cur, cmd);
- bool const empty_cell = cur.lastpos() == 0 && cur.lastpit() == 0;
-
// When we already have a selection we want to select the whole cell
// before going to the next cell.
if (select_whole && !empty_cell){
if (cur.selIsMultiCell()) {
cur.recordUndoInset(DELETE_UNDO);
cutSelection(cur);
- }
- else
+ } else
cell(cur.idx())->dispatch(cur, cmd);
break;
break;
case Tabular::TOGGLE_LTCAPTION: {
- bool set = !tabular.ltCaption(row);
+ bool const set = !tabular.ltCaption(row);
cur.idx() = tabular.setLTCaption(row, set);
cur.pit() = 0;
cur.pos() = 0;
cur.setSelection(false);
- // When a row is set as caption, then also insert a caption. Otherwise
- // the LaTeX output is broken, when the user doesn't add a caption.
+
if (set)
+ // When a row is set as caption, then also insert
+ // a caption. Otherwise the LaTeX output is broken.
lyx::dispatch(FuncRequest(LFUN_CAPTION_INSERT));
+ else {
+ FuncRequest fr(LFUN_INSET_DISSOLVE, "caption");
+ if (lyx::getStatus(fr).enabled())
+ lyx::dispatch(fr);
+ }
break;
}
}
-void InsetTabular::acceptChanges(BufferParams const & bparams)
+void InsetTabular::acceptChanges()
{
for (idx_type idx = 0; idx < nargs(); ++idx)
- cell(idx)->acceptChanges(bparams);
+ cell(idx)->acceptChanges();
}
-void InsetTabular::rejectChanges(BufferParams const & bparams)
+void InsetTabular::rejectChanges()
{
for (idx_type idx = 0; idx < nargs(); ++idx)
- cell(idx)->rejectChanges(bparams);
+ cell(idx)->rejectChanges();
}
col_type ocol = 0;
row_type row = 0;
if (usePaste) {
- paste_tabular.reset(new Tabular(buffer(), rows, maxCols));
+ paste_tabular.reset(new Tabular(buffer_, rows, maxCols));
loctab = paste_tabular.get();
cols = 0;
dirtyTabularStack(true);