Another attempt at 2178. This is a "minimal" patch designed to fix the bug with the minimum amount of new code. A better fix, suggested by Andre, would merge InsetTableCell and CellData into one class, in which case InsetTableCell::cell_data_ can be removed. A definite plus. I'll do that later if this works. But let's get it right first.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23879 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2008-03-21 17:45:14 +00:00
parent d5ad3f6d7a
commit b922cfd3b3
7 changed files with 120 additions and 66 deletions

View File

@ -48,8 +48,6 @@
#include "insets/InsetBibitem.h" #include "insets/InsetBibitem.h"
#include "insets/InsetLabel.h" #include "insets/InsetLabel.h"
// needed only for inTableCell()
#include "insets/InsetText.h"
#include "support/convert.h" #include "support/convert.h"
#include "support/debug.h" #include "support/debug.h"
@ -1621,7 +1619,6 @@ bool Paragraph::forceEmptyLayout() const
Inset const * const inset = inInset(); Inset const * const inset = inInset();
if (!inset) if (!inset)
return true; return true;
// FIXME At present, this is wrong for table cells
return inset->forceEmptyLayout(); return inset->forceEmptyLayout();
} }
@ -1631,36 +1628,16 @@ bool Paragraph::allowParagraphCustomization() const
Inset const * const inset = inInset(); Inset const * const inset = inInset();
if (!inset) if (!inset)
return true; return true;
// FIXME At present, this is wrong for table cells
return inset->allowParagraphCustomization(); 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 bool Paragraph::useEmptyLayout() const
{ {
Inset const * const inset = inInset(); Inset const * const inset = inInset();
return inset && if (!inset)
(inTableCell(inset) || inset->useEmptyLayout()); return false;
return inset->useEmptyLayout();
} }

View File

@ -105,6 +105,7 @@ static TranslatorMap const build_translator()
InsetName("info", INFO_CODE), InsetName("info", INFO_CODE),
InsetName("collapsable", COLLAPSABLE_CODE), InsetName("collapsable", COLLAPSABLE_CODE),
InsetName("newpage", NEWPAGE_CODE), InsetName("newpage", NEWPAGE_CODE),
InsetName("tablecell", CELL_CODE)
}; };
size_t const insetnames_size = size_t const insetnames_size =

View File

@ -112,6 +112,8 @@ enum InsetCode {
INFO_CODE, // 45 INFO_CODE, // 45
/// ///
COLLAPSABLE_CODE, COLLAPSABLE_CODE,
///
CELL_CODE,
#if 0 #if 0
/// ///
THEOREM_CODE, THEOREM_CODE,

View File

@ -3,7 +3,6 @@
* This file is part of LyX, the document processor. * This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING. * Licence details can be found in the file COPYING.
* *
* \author Jürgen Vigna
* \author Lars Gullik Bjønnes * \author Lars Gullik Bjønnes
* \author Matthias Ettrich * \author Matthias Ettrich
* \author José Matos * \author José Matos
@ -470,7 +469,7 @@ string const featureAsString(Tabular::Feature feature)
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
Tabular::CellData::CellData(Buffer const & buf) Tabular::CellData::CellData(Buffer const & buf, Tabular const & table)
: cellno(0), : cellno(0),
width(0), width(0),
multicolumn(Tabular::CELL_NORMAL), multicolumn(Tabular::CELL_NORMAL),
@ -482,7 +481,7 @@ Tabular::CellData::CellData(Buffer const & buf)
right_line(false), right_line(false),
usebox(BOX_NONE), usebox(BOX_NONE),
rotate(false), rotate(false),
inset(new InsetTableCell(buf)) inset(new InsetTableCell(buf, this, &table))
{ {
inset->setBuffer(const_cast<Buffer &>(buf)); inset->setBuffer(const_cast<Buffer &>(buf));
inset->paragraphs().back().setLayout(buf.params().documentClass().emptyLayout()); inset->paragraphs().back().setLayout(buf.params().documentClass().emptyLayout());
@ -503,8 +502,10 @@ Tabular::CellData::CellData(CellData const & cs)
rotate(cs.rotate), rotate(cs.rotate),
align_special(cs.align_special), align_special(cs.align_special),
p_width(cs.p_width), 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) Tabular::CellData & Tabular::CellData::operator=(CellData cs)
@ -581,7 +582,7 @@ void Tabular::init(Buffer const & buf, row_type rows_arg,
buffer_ = &buf; buffer_ = &buf;
row_info = row_vector(rows_arg); row_info = row_vector(rows_arg);
column_info = column_vector(columns_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); row_info.reserve(10);
column_info.reserve(10); column_info.reserve(10);
cell_info.reserve(100); cell_info.reserve(100);
@ -628,7 +629,7 @@ void Tabular::appendRow(idx_type const cell)
for (row_type i = 0; i < nrows - 1; ++i) for (row_type i = 0; i < nrows - 1; ++i)
swap(cell_info[i], old[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) for (row_type i = 0; i <= row; ++i)
swap(cell_info[i], old[i]); swap(cell_info[i], old[i]);
@ -678,7 +679,7 @@ void Tabular::appendColumn(idx_type const cell)
column_info[column + 1] = column_info[column]; column_info[column + 1] = column_info[column];
for (row_type i = 0; i < rowCount(); ++i) { 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; col_type c = column + 2;
while (c < ncols while (c < ncols
&& cell_info[i][c].multicolumn == CELL_PART_OF_MULTICOLUMN) { && cell_info[i][c].multicolumn == CELL_PART_OF_MULTICOLUMN) {
@ -2739,7 +2740,11 @@ shared_ptr<InsetTableCell> Tabular::getCellInset(row_type row,
void Tabular::setCellInset(row_type row, col_type column, void Tabular::setCellInset(row_type row, col_type column,
shared_ptr<InsetTableCell> ins) const 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);
} }
@ -2801,6 +2806,50 @@ Tabular::BoxType Tabular::useParbox(idx_type cell) const
} }
/////////////////////////////////////////////////////////////////////
//
// 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 // InsetTabular
@ -4534,6 +4583,15 @@ bool InsetTabular::copySelection(Cursor & cur)
while (paste_tabular->columnCount() > columns) while (paste_tabular->columnCount() > columns)
paste_tabular->deleteColumn(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; odocstringstream os;
OutputParams const runparams(0); OutputParams const runparams(0);
paste_tabular->plaintext(os, runparams, 0, true, '\t'); paste_tabular->plaintext(os, runparams, 0, true, '\t');
@ -4575,6 +4633,8 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
} }
shared_ptr<InsetTableCell> inset( shared_ptr<InsetTableCell> inset(
new InsetTableCell(*paste_tabular->getCellInset(r1, c1))); new InsetTableCell(*paste_tabular->getCellInset(r1, c1)));
// note that setCellInset will call InsetTableCell::setCellData()
// and InsetTableCell::setTabular()
tabular.setCellInset(r2, c2, inset); tabular.setCellInset(r2, c2, inset);
// FIXME: change tracking (MG) // FIXME: change tracking (MG)
inset->setChange(Change(cur.buffer().params().trackChanges ? inset->setChange(Change(cur.buffer().params().trackChanges ?

View File

@ -4,7 +4,6 @@
* This file is part of LyX, the document processor. * This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING. * Licence details can be found in the file COPYING.
* *
* \author Jürgen Vigna
* \author Lars Gullik Bjønnes * \author Lars Gullik Bjønnes
* \author Matthias Ettrich * \author Matthias Ettrich
* \author André Pönitz * \author André Pönitz
@ -49,14 +48,15 @@
namespace lyx { namespace lyx {
class FuncStatus;
class Lexer;
class BufferView;
class Buffer; class Buffer;
class BufferParams; class BufferParams;
class Paragraph; class BufferView;
class CompletionList; class CompletionList;
class CursorSlice; class CursorSlice;
class InsetTableCell;
class FuncStatus;
class Lexer;
class Paragraph;
namespace frontend { class Painter; } namespace frontend { class Painter; }
@ -65,8 +65,6 @@ class InsetTabular;
class Cursor; class Cursor;
class OutputParams; class OutputParams;
typedef InsetText InsetTableCell;
// //
// A helper struct for tables // A helper struct for tables
// //
@ -463,7 +461,7 @@ public:
class CellData { class CellData {
public: public:
/// ///
CellData(Buffer const &); CellData(Buffer const &, Tabular const &);
/// ///
CellData(CellData const &); CellData(CellData const &);
/// ///
@ -658,9 +656,45 @@ private:
/// renumber cells after structural changes /// renumber cells after structural changes
void fixCellNums(); 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 { class InsetTabular : public Inset {
public: public:

View File

@ -412,22 +412,6 @@ void InsetText::addPreview(PreviewLoader & loader) const
} }
// FIXME: instead of this hack, which only works by chance,
// cells should have their own insetcell type, which returns CELL_CODE!
bool InsetText::isTableCell() const
{
// this is only true for tabular cells
return !text_.isMainText(buffer()) && lyxCode() == TEXT_CODE;
}
bool InsetText::neverIndent() const
{
return isTableCell();
}
ParagraphList const & InsetText::paragraphs() const ParagraphList const & InsetText::paragraphs() const
{ {
return text_.paragraphs(); return text_.paragraphs();

View File

@ -130,10 +130,6 @@ public:
/// ///
bool allowSpellCheck() const { return true; } bool allowSpellCheck() const { return true; }
/// ///
bool isTableCell() const;
/// should paragraph indendation be ommitted in any case?
bool neverIndent() const;
///
virtual bool isMacroScope() const { return false; } virtual bool isMacroScope() const { return false; }
/// ///
virtual bool allowMultiPar() const { return true; } virtual bool allowMultiPar() const { return true; }