diff --git a/src/Buffer.cpp b/src/Buffer.cpp index ea1168b684..c6ce92aa97 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -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(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(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; } diff --git a/src/Buffer.h b/src/Buffer.h index b5c34b3a08..9701f31913 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -211,6 +211,10 @@ public: int readHeader(Lexer & lex); private: + /// + typedef std::map BufferMap; + /// + void clone(BufferMap &) const; /// save timestamp and checksum of the given file. void saveCheckSum() const; /// read a new file diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 89a00c6609..97d3204917 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -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->masterBuffer()); + delete mbuf; busyBuffers.remove(orig); if (msg == "preview") { return success