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
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);
buffer_clone->setChild(dit, child_clone);
}
buffer_clone->d->macro_lock = false;
- return buffer_clone;
+ return;
}
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
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