mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 18:08:10 +00:00
Fix problem first reported by Diego: If you try to view a child document,
the macros declared in the parent do not work. This is because we were cloning only the child, which then didn't have a parent. The solution is to clone the whole structure, starting with the master document. As a side effect, we only clone each child once. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38837 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
12cecb196d
commit
2d6173d810
@ -427,7 +427,22 @@ Buffer::~Buffer()
|
||||
|
||||
Buffer * Buffer::clone() const
|
||||
{
|
||||
BufferMap bufmap;
|
||||
masterBuffer()->clone(bufmap);
|
||||
BufferMap::iterator it = bufmap.find(this);
|
||||
LASSERT(it != bufmap.end(), return 0);
|
||||
return it->second;
|
||||
}
|
||||
|
||||
|
||||
void Buffer::clone(BufferMap & bufmap) const
|
||||
{
|
||||
// have we already been cloned?
|
||||
if (bufmap.find(this) != bufmap.end())
|
||||
return;
|
||||
|
||||
Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this);
|
||||
bufmap[this] = buffer_clone;
|
||||
buffer_clone->d->macro_lock = true;
|
||||
buffer_clone->d->children_positions.clear();
|
||||
// FIXME (Abdel 09/01/2010): this is too complicated. The whole children_positions and
|
||||
@ -440,7 +455,12 @@ Buffer * Buffer::clone() const
|
||||
DocIterator dit = it->second.clone(buffer_clone);
|
||||
dit.setBuffer(buffer_clone);
|
||||
Buffer * child = const_cast<Buffer *>(it->first);
|
||||
Buffer * child_clone = child->clone();
|
||||
|
||||
child->clone(bufmap);
|
||||
BufferMap::iterator it = bufmap.find(child);
|
||||
LASSERT(it != bufmap.end(), continue);
|
||||
Buffer * child_clone = it->second;
|
||||
|
||||
Inset * inset = dit.nextInset();
|
||||
LASSERT(inset && inset->lyxCode() == INCLUDE_CODE, continue);
|
||||
InsetInclude * inset_inc = static_cast<InsetInclude *>(inset);
|
||||
@ -449,7 +469,7 @@ Buffer * Buffer::clone() const
|
||||
buffer_clone->setChild(dit, child_clone);
|
||||
}
|
||||
buffer_clone->d->macro_lock = false;
|
||||
return buffer_clone;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
@ -211,6 +211,10 @@ public:
|
||||
int readHeader(Lexer & lex);
|
||||
|
||||
private:
|
||||
///
|
||||
typedef std::map<Buffer const *, Buffer *> BufferMap;
|
||||
///
|
||||
void clone(BufferMap &) const;
|
||||
/// save timestamp and checksum of the given file.
|
||||
void saveCheckSum() const;
|
||||
/// read a new file
|
||||
|
@ -2944,7 +2944,11 @@ docstring GuiView::GuiViewPrivate::runAndDestroy(const T& func, Buffer const * o
|
||||
buffer->params().maintain_unincluded_children
|
||||
&& !buffer->params().getIncludedChildren().empty();
|
||||
bool const success = func(format, update_unincluded);
|
||||
delete buffer;
|
||||
|
||||
// the cloning operation will have produced a clone of the entire set of
|
||||
// documents, starting from the master. so we must delete those.
|
||||
Buffer * mbuf = const_cast<Buffer *>(buffer->masterBuffer());
|
||||
delete mbuf;
|
||||
busyBuffers.remove(orig);
|
||||
if (msg == "preview") {
|
||||
return success
|
||||
|
Loading…
Reference in New Issue
Block a user