mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-24 21:55:29 +00:00
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:
parent
d5ad3f6d7a
commit
b922cfd3b3
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 =
|
||||||
|
@ -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,
|
||||||
|
@ -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 ?
|
||||||
|
@ -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:
|
||||||
|
@ -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();
|
||||||
|
@ -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; }
|
||||||
|
Loading…
Reference in New Issue
Block a user