X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=117cfe0ca7e5ba5ec100d56e2670635a16f1fe11;hb=1744b6f9edc58a938da97facc3164d623809d2a3;hp=ea1168b6846bc75757703f6cdd94ef772741ef7f;hpb=08cfe6c46b3c369cfeaeab04361e62ff273e298c;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index ea1168b684..117cfe0ca7 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -427,29 +427,50 @@ 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 // math macro caches need to be rethought and simplified. // I am not sure wether we should handle Buffer cloning here or in BufferList. // Right now BufferList knows nothing about buffer clones. - Impl::BufferPositionMap::iterator it = d->children_positions.begin(); - Impl::BufferPositionMap::iterator end = d->children_positions.end(); + Impl::PositionScopeBufferMap::iterator it = d->position_to_children.begin(); + Impl::PositionScopeBufferMap::iterator end = d->position_to_children.end(); for (; it != end; ++it) { - DocIterator dit = it->second.clone(buffer_clone); + DocIterator dit = it->first.clone(buffer_clone); dit.setBuffer(buffer_clone); - Buffer * child = const_cast(it->first); - Buffer * child_clone = child->clone(); + Buffer * child = const_cast(it->second.second); + + child->clone(bufmap); + BufferMap::iterator const bit = bufmap.find(child); + LASSERT(bit != bufmap.end(), continue); + Buffer * child_clone = bit->second; + Inset * inset = dit.nextInset(); LASSERT(inset && inset->lyxCode() == INCLUDE_CODE, continue); InsetInclude * inset_inc = static_cast(inset); inset_inc->setChildBuffer(child_clone); child_clone->d->setParent(buffer_clone); + // FIXME Do we need to do this now, or can we wait until we run updateMacros()? buffer_clone->setChild(dit, child_clone); } buffer_clone->d->macro_lock = false; - return buffer_clone; + return; }