un-revert r30531, after Richard told me how to avoid the crash. Now, before

accepting changes in a clipboard copy (CutAndPaste.cpp), we set the buffer
of insets (and we reset them later).

Doing this makes sense because we know this is the only operation on these
out-of-document paragraphs that will require access to a buffer.

Also, this commit gets rid of one explicit test against ERT_CODE and 
LISTING_CODE.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30623 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jean-Marc Lasgouttes 2009-07-16 08:37:32 +00:00
parent 0dd2067a8f
commit 408b96bb92
11 changed files with 49 additions and 42 deletions

View File

@ -456,20 +456,33 @@ void copySelectionHelper(Buffer const & buf, ParagraphList const & pars,
ParagraphList::iterator it_end = copy_pars.end(); ParagraphList::iterator it_end = copy_pars.end();
for (; it != it_end; it++) { for (; it != it_end; it++) {
// ERT paragraphs have the Language latex_language. // Since we have a copy of the paragraphs, the insets
// This is invalid outside of ERT, so we need to change it // do not have a proper buffer reference. It makes
// to the buffer language. // sense to add them temporarily, because the
if (it->ownerCode() == ERT_CODE || it->ownerCode() == LISTINGS_CODE) // operations below depend on that (acceptChanges included).
it->changeLanguage(buf.params(), latex_language, buf.language()); it->setBuffer(const_cast<Buffer &>(buf));
// PassThru paragraphs have the Language
it->setInsetOwner(0); // latex_language. This is invalid for others, so we
// need to change it to the buffer language.
if (it->inInset().getLayout().isPassThru())
it->changeLanguage(buf.params(),
latex_language, buf.language());
} }
// do not copy text (also nested in insets) which is marked as deleted, // do not copy text (also nested in insets) which is marked as
// unless the whole selection was deleted // deleted, unless the whole selection was deleted
if (!isFullyDeleted(copy_pars)) if (!isFullyDeleted(copy_pars))
acceptChanges(copy_pars, buf.params()); acceptChanges(copy_pars, buf.params());
// do some final cleanup now, to make sure that the paragraphs
// are not linked to something else.
it = copy_pars.begin();
for (; it != it_end; it++) {
it->setBuffer(*static_cast<Buffer *>(0));
it->setInsetOwner(0);
}
DocumentClass * d = const_cast<DocumentClass *>(dc); DocumentClass * d = const_cast<DocumentClass *>(dc);
cutstack.push(make_pair(copy_pars, d)); cutstack.push(make_pair(copy_pars, d));
} }

View File

@ -362,8 +362,7 @@ Change const & Paragraph::lookupChange(pos_type pos) const
} }
void Paragraph::acceptChanges(BufferParams const & bparams, pos_type start, void Paragraph::acceptChanges(pos_type start, pos_type end)
pos_type end)
{ {
LASSERT(start >= 0 && start <= size(), /**/); LASSERT(start >= 0 && start <= size(), /**/);
LASSERT(end > start && end <= size() + 1, /**/); LASSERT(end > start && end <= size() + 1, /**/);
@ -373,14 +372,14 @@ void Paragraph::acceptChanges(BufferParams const & bparams, pos_type start,
case Change::UNCHANGED: case Change::UNCHANGED:
// accept changes in nested inset // accept changes in nested inset
if (Inset * inset = getInset(pos)) if (Inset * inset = getInset(pos))
inset->acceptChanges(bparams); inset->acceptChanges();
break; break;
case Change::INSERTED: case Change::INSERTED:
d->changes_.set(Change(Change::UNCHANGED), pos); d->changes_.set(Change(Change::UNCHANGED), pos);
// also accept changes in nested inset // also accept changes in nested inset
if (Inset * inset = getInset(pos)) if (Inset * inset = getInset(pos))
inset->acceptChanges(bparams); inset->acceptChanges();
break; break;
case Change::DELETED: case Change::DELETED:
@ -398,8 +397,7 @@ void Paragraph::acceptChanges(BufferParams const & bparams, pos_type start,
} }
void Paragraph::rejectChanges(BufferParams const & bparams, void Paragraph::rejectChanges(pos_type start, pos_type end)
pos_type start, pos_type end)
{ {
LASSERT(start >= 0 && start <= size(), /**/); LASSERT(start >= 0 && start <= size(), /**/);
LASSERT(end > start && end <= size() + 1, /**/); LASSERT(end > start && end <= size() + 1, /**/);
@ -409,7 +407,7 @@ void Paragraph::rejectChanges(BufferParams const & bparams,
case Change::UNCHANGED: case Change::UNCHANGED:
// reject changes in nested inset // reject changes in nested inset
if (Inset * inset = getInset(pos)) if (Inset * inset = getInset(pos))
inset->rejectChanges(bparams); inset->rejectChanges();
break; break;
case Change::INSERTED: case Change::INSERTED:

View File

@ -229,10 +229,10 @@ public:
void setChange(pos_type pos, Change const & change); void setChange(pos_type pos, Change const & change);
/// accept changes within the given range /// accept changes within the given range
void acceptChanges(BufferParams const & bparams, pos_type start, pos_type end); void acceptChanges(pos_type start, pos_type end);
/// reject changes within the given range /// reject changes within the given range
void rejectChanges(BufferParams const & bparams, pos_type start, pos_type end); void rejectChanges(pos_type start, pos_type end);
/// Paragraphs can contain "manual labels", for example, Description /// Paragraphs can contain "manual labels", for example, Description
/// environment. The text for this user-editable label is stored in /// environment. The text for this user-editable label is stored in

View File

@ -840,9 +840,9 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
pos_type right = (pit == endPit ? endPos : parSize); pos_type right = (pit == endPit ? endPos : parSize);
if (op == ACCEPT) { if (op == ACCEPT) {
pars_[pit].acceptChanges(cur.buffer()->params(), left, right); pars_[pit].acceptChanges(left, right);
} else { } else {
pars_[pit].rejectChanges(cur.buffer()->params(), left, right); pars_[pit].rejectChanges(left, right);
} }
} }
@ -919,7 +919,7 @@ void Text::rejectChanges(BufferParams const & bparams)
// (do not consider end-of-par) // (do not consider end-of-par)
for (pit_type pit = 0; pit < pars_size; ++pit) { for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars_[pit].empty()) // prevent assertion failure if (!pars_[pit].empty()) // prevent assertion failure
pars_[pit].rejectChanges(bparams, 0, pars_[pit].size()); pars_[pit].rejectChanges(0, pars_[pit].size());
} }
// next, reject imaginary end-of-par characters // next, reject imaginary end-of-par characters

View File

@ -461,8 +461,6 @@ bool Inset::covers(BufferView const & bv, int x, int y) const
InsetLayout const & Inset::getLayout() const InsetLayout const & Inset::getLayout() const
{ {
if (!buffer_)
return DocumentClass::plainInsetLayout();
return buffer().params().documentClass().insetLayout(name()); return buffer().params().documentClass().insetLayout(name());
} }

View File

@ -27,7 +27,6 @@ namespace lyx {
class BiblioInfo; class BiblioInfo;
class Buffer; class Buffer;
class BufferParams;
class BufferView; class BufferView;
class Change; class Change;
class CompletionList; class CompletionList;
@ -97,8 +96,9 @@ public:
virtual ~Inset() {} virtual ~Inset() {}
/// change associated Buffer /// change associated Buffer
/// FIXME this should go.
virtual void setBuffer(Buffer & buffer); virtual void setBuffer(Buffer & buffer);
/// remove the buffer reference
void resetBuffer() { setBuffer( *static_cast<Buffer *>(0)); }
/// retrieve associated Buffer /// retrieve associated Buffer
virtual Buffer & buffer(); virtual Buffer & buffer();
virtual Buffer const & buffer() const; virtual Buffer const & buffer() const;
@ -487,9 +487,9 @@ public:
/// set the change for the entire inset /// set the change for the entire inset
virtual void setChange(Change const &) {} virtual void setChange(Change const &) {}
/// accept the changes within the inset /// accept the changes within the inset
virtual void acceptChanges(BufferParams const &) {}; virtual void acceptChanges() {};
/// reject the changes within the inset /// reject the changes within the inset
virtual void rejectChanges(BufferParams const &) {}; virtual void rejectChanges() {};
/// ///
virtual Dimension const dimension(BufferView const &) const; virtual Dimension const dimension(BufferView const &) const;

View File

@ -5152,17 +5152,17 @@ void InsetTabular::setChange(Change const & change)
} }
void InsetTabular::acceptChanges(BufferParams const & bparams) void InsetTabular::acceptChanges()
{ {
for (idx_type idx = 0; idx < nargs(); ++idx) 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) for (idx_type idx = 0; idx < nargs(); ++idx)
cell(idx)->rejectChanges(bparams); cell(idx)->rejectChanges();
} }

View File

@ -48,7 +48,6 @@
namespace lyx { namespace lyx {
class Buffer; class Buffer;
class BufferParams;
class BufferView; class BufferView;
class CompletionList; class CompletionList;
class CursorSlice; class CursorSlice;
@ -803,9 +802,9 @@ public:
/// set the change for the entire inset /// set the change for the entire inset
void setChange(Change const & change); void setChange(Change const & change);
/// accept the changes within the inset /// accept the changes within the inset
void acceptChanges(BufferParams const & bparams); void acceptChanges();
/// reject the changes within the inset /// reject the changes within the inset
void rejectChanges(BufferParams const & bparams); void rejectChanges();
// this should return true if we have a "normal" cell, otherwise false. // this should return true if we have a "normal" cell, otherwise false.
// "normal" means without width set! // "normal" means without width set!

View File

@ -355,15 +355,15 @@ void InsetText::setChange(Change const & change)
} }
void InsetText::acceptChanges(BufferParams const & bparams) void InsetText::acceptChanges()
{ {
text_.acceptChanges(bparams); text_.acceptChanges(buffer().params());
} }
void InsetText::rejectChanges(BufferParams const & bparams) void InsetText::rejectChanges()
{ {
text_.rejectChanges(bparams); text_.rejectChanges(buffer().params());
} }

View File

@ -21,7 +21,6 @@
namespace lyx { namespace lyx {
class BufferParams;
class CompletionList; class CompletionList;
class CursorSlice; class CursorSlice;
class Dimension; class Dimension;
@ -116,9 +115,9 @@ public:
/// set the change for the entire inset /// set the change for the entire inset
void setChange(Change const & change); void setChange(Change const & change);
/// accept the changes within the inset /// accept the changes within the inset
void acceptChanges(BufferParams const & bparams); void acceptChanges();
/// reject the changes within the inset /// reject the changes within the inset
void rejectChanges(BufferParams const & bparams); void rejectChanges();
/// append text onto the existing text /// append text onto the existing text
void appendParagraphs(ParagraphList &); void appendParagraphs(ParagraphList &);

View File

@ -354,7 +354,7 @@ void acceptChanges(ParagraphList & pars, BufferParams const & bparams)
// (do not consider end-of-par) // (do not consider end-of-par)
for (pit_type pit = 0; pit < pars_size; ++pit) { for (pit_type pit = 0; pit < pars_size; ++pit) {
if (!pars[pit].empty()) // prevent assertion failure if (!pars[pit].empty()) // prevent assertion failure
pars[pit].acceptChanges(bparams, 0, pars[pit].size()); pars[pit].acceptChanges(0, pars[pit].size());
} }
// next, accept imaginary end-of-par characters // next, accept imaginary end-of-par characters