#include "insets/InsetBibitem.h"
#include "insets/InsetLabel.h"
-// needed only for inTableCell()
-#include "insets/InsetText.h"
#include "support/convert.h"
#include "support/debug.h"
Inset const * const inset = inInset();
if (!inset)
return true;
- // FIXME At present, this is wrong for table cells
return inset->forceEmptyLayout();
}
Inset const * const inset = inInset();
if (!inset)
return true;
- // FIXME At present, this is wrong for table cells
return inset->allowParagraphCustomization();
}
-namespace {
- // FIXME
- // This is a hack based upon one in InsetText::neverIndent().
- // When we have a real InsetTableCell, then we won't need this
- // method, because InsetTableCell will return the right values,
- // viz: InsetTableCell::useEmptyLayout() should return true, and
- // InsetTableCell::forceEmptyLayout() should still return true
- // unless the width has been set.
- //
- // The #include "insets/InsetText.h" can also be removed then.
- bool inTableCell(Inset const * inset)
- {
- InsetText const * txt = inset->asInsetText();
- if (!txt)
- return false;
- return txt->isTableCell();
- }
-}
-
-
bool Paragraph::useEmptyLayout() const
{
Inset const * const inset = inInset();
- return inset &&
- (inTableCell(inset) || inset->useEmptyLayout());
+ if (!inset)
+ return false;
+ return inset->useEmptyLayout();
}
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Jürgen Vigna
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
* \author José Matos
/////////////////////////////////////////////////////////////////////
-Tabular::CellData::CellData(Buffer const & buf)
+Tabular::CellData::CellData(Buffer const & buf, Tabular const & table)
: cellno(0),
width(0),
multicolumn(Tabular::CELL_NORMAL),
right_line(false),
usebox(BOX_NONE),
rotate(false),
- inset(new InsetTableCell(buf))
+ inset(new InsetTableCell(buf, this, &table))
{
inset->setBuffer(const_cast<Buffer &>(buf));
inset->paragraphs().back().setLayout(buf.params().documentClass().emptyLayout());
rotate(cs.rotate),
align_special(cs.align_special),
p_width(cs.p_width),
- inset(dynamic_cast<InsetTableCell*>(cs.inset->clone()))
-{}
+ inset(dynamic_cast<InsetTableCell *>(cs.inset->clone()))
+{
+ inset->setCellData(this);
+}
Tabular::CellData & Tabular::CellData::operator=(CellData cs)
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)));
+ cell_info = cell_vvector(rows_arg, cell_vector(columns_arg, CellData(buf, *this)));
row_info.reserve(10);
column_info.reserve(10);
cell_info.reserve(100);
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(), *this)));
for (row_type i = 0; i <= row; ++i)
swap(cell_info[i], old[i]);
column_info[column + 1] = column_info[column];
for (row_type i = 0; i < rowCount(); ++i) {
- cell_info[i].insert(cell_info[i].begin() + column + 1, CellData(buffer()));
+ cell_info[i].insert(cell_info[i].begin() + column + 1, CellData(buffer(), *this));
col_type c = column + 2;
while (c < ncols
&& cell_info[i][c].multicolumn == CELL_PART_OF_MULTICOLUMN) {
do {
++column;
} while (column < columnCount() &&
- cell_info[row][column].multicolumn
- == Tabular::CELL_PART_OF_MULTICOLUMN);
+ cell_info[row][column].multicolumn
+ == Tabular::CELL_PART_OF_MULTICOLUMN);
if (column == columnCount()) {
column = 0;
void Tabular::setCellInset(row_type row, col_type column,
shared_ptr<InsetTableCell> ins) const
{
- cell_info[row][column].inset = ins;
+ CellData & cd = cell_info[row][column];
+ cd.inset = ins;
+ // reset the InsetTableCell's pointers
+ ins->setCellData(&cd);
+ ins->setTabular(this);
}
}
+/////////////////////////////////////////////////////////////////////
+//
+// InsetTableCell
+//
+/////////////////////////////////////////////////////////////////////
+
+InsetTableCell::InsetTableCell(Buffer const & buf,
+ Tabular::CellData const * cell, Tabular const * table)
+ : InsetText(buf), cell_data_(cell), table_(table)
+{}
+
+
+bool InsetTableCell::forceEmptyLayout(idx_type) const
+{
+ BOOST_ASSERT(table_);
+ BOOST_ASSERT(cell_data_);
+ return table_->getPWidth(cell_data_->cellno).zero();
+}
+
+bool InsetTableCell::allowParagraphCustomization(idx_type) const
+{
+ BOOST_ASSERT(table_);
+ BOOST_ASSERT(cell_data_);
+ return !table_->getPWidth(cell_data_->cellno).zero();
+}
+
+bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd,
+ FuncStatus & status) const
+{
+ bool enabled;
+ switch (cmd.action) {
+ case LFUN_LAYOUT:
+ enabled = !forceEmptyLayout();
+ break;
+ case LFUN_LAYOUT_PARAGRAPH:
+ enabled = allowParagraphCustomization();
+ break;
+ default:
+ return InsetText::getStatus(cur, cmd, status);
+ }
+ status.enabled(enabled);
+ return true;
+}
+
/////////////////////////////////////////////////////////////////////
//
// InsetTabular
while (paste_tabular->columnCount() > columns)
paste_tabular->deleteColumn(columns);
+ // We clear all the InsetTableCell pointers, since they
+ // might now become invalid and there is no point in having
+ // them point to temporary things in paste_tabular.
+ for (row_type i = 0; i < paste_tabular->rowCount(); ++i)
+ for (col_type j = 0; j < paste_tabular->columnCount(); ++j) {
+ paste_tabular->getCellInset(i,j)->setCellData(0);
+ paste_tabular->getCellInset(i,j)->setTabular(0);
+ }
+
odocstringstream os;
OutputParams const runparams(0);
paste_tabular->plaintext(os, runparams, 0, true, '\t');
}
shared_ptr<InsetTableCell> inset(
new InsetTableCell(*paste_tabular->getCellInset(r1, c1)));
+ // note that setCellInset will call InsetTableCell::setCellData()
+ // and InsetTableCell::setTabular()
tabular.setCellInset(r2, c2, inset);
// FIXME: change tracking (MG)
inset->setChange(Change(cur.buffer().params().trackChanges ?
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Jürgen Vigna
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
* \author André Pönitz
namespace lyx {
-class FuncStatus;
-class Lexer;
-class BufferView;
class Buffer;
class BufferParams;
-class Paragraph;
+class BufferView;
class CompletionList;
class CursorSlice;
+class InsetTableCell;
+class FuncStatus;
+class Lexer;
+class Paragraph;
namespace frontend { class Painter; }
class Cursor;
class OutputParams;
-typedef InsetText InsetTableCell;
-
//
// A helper struct for tables
//
class CellData {
public:
///
- CellData(Buffer const &);
+ CellData(Buffer const &, Tabular const &);
///
CellData(CellData const &);
///
/// renumber cells after structural changes
void fixCellNums();
-};
+}; // Tabular
+
+///
+class InsetTableCell : public InsetText {
+public:
+ ///
+ explicit InsetTableCell(Buffer const & buf,
+ Tabular::CellData const * cd, Tabular const * t);
+ ///
+ virtual InsetCode lyxCode() const { return CELL_CODE; }
+ ///
+ Inset * clone() { return new InsetTableCell(*this); }
+ ///
+ virtual bool useEmptyLayout() const { return true; }
+ ///
+ virtual bool forceEmptyLayout(idx_type = 0) const;
+ ///
+ virtual bool allowParagraphCustomization(idx_type = 0) const;
+ ///
+ bool getStatus(Cursor & cur, FuncRequest const & cmd,
+ FuncStatus & status) const;
+ ///
+ virtual bool neverIndent() { return true; }
+ ///
+ void setCellData(Tabular::CellData const * cd) { cell_data_ = cd; }
+ ///
+ void setTabular(Tabular const * t) { table_ = t; }
+private:
+ ///
+ Tabular::CellData const * cell_data_;
+ ///
+ Tabular const * table_;
+ /// unimplemented
+ InsetTableCell();
+ /// unimplemented
+ void operator=(InsetTableCell const &);
+};
class InsetTabular : public Inset {