Alert::error(_("Print document failed"), str);
}
-/// a list of Buffers we cloned
-set<Buffer *> cloned_buffer_list;
+} // namespace anon
-} // namespace anon
+// A storehouse for the cloned buffers.
+list<CloneList> cloned_buffers;
class Buffer::Impl
/// If non zero, this buffer is a clone of existing buffer \p cloned_buffer_
/// This one is useful for preview detached in a thread.
Buffer const * cloned_buffer_;
+ ///
+ CloneList * clone_list_;
/// are we in the process of exporting this buffer?
mutable bool doing_export;
toc_backend(owner), macro_lock(false), timestamp_(0), checksum_(0),
wa_(0), gui_(0), undo_(*owner), bibinfo_cache_valid_(false),
bibfile_cache_valid_(false), cite_labels_valid_(false),
- preview_loader_(0), cloned_buffer_(cloned_buffer),
+ preview_loader_(0), cloned_buffer_(cloned_buffer), clone_list_(0),
doing_export(false), parent_buffer(0)
{
if (!cloned_buffer_) {
if (isClone()) {
// this is in case of recursive includes: we won't try to delete
// ourselves as a child.
- cloned_buffer_list.erase(this);
+ d->clone_list_->erase(this);
// loop over children
Impl::BufferPositionMap::iterator it = d->children_positions.begin();
Impl::BufferPositionMap::iterator end = d->children_positions.end();
for (; it != end; ++it) {
Buffer * child = const_cast<Buffer *>(it->first);
- if (cloned_buffer_list.erase(child))
+ if (d->clone_list_->erase(child))
delete child;
}
// FIXME Do we really need to do this right before we delete d?
Buffer * Buffer::clone() const
{
BufferMap bufmap;
- masterBuffer()->clone(bufmap);
+ cloned_buffers.push_back(CloneList());
+ CloneList * clones = &cloned_buffers.back();
+
+ masterBuffer()->clone(bufmap, clones);
// make sure we got cloned
BufferMap::const_iterator bit = bufmap.find(this);
LASSERT(bit != bufmap.end(), return 0);
Buffer * cloned_buffer = bit->second;
- // this should be empty. if not, then either we have left
- // some buffer undeleted, or else we are trying to export
- // two buffers at once. either way is a problem.
- LASSERT(cloned_buffer_list.empty(), return 0);
- // record the list of cloned buffers in the cloned master
- BufferMap::iterator it = bufmap.begin();
- BufferMap::iterator en = bufmap.end();
- for (; it != en; ++it)
- cloned_buffer_list.insert(it->second);
-
return cloned_buffer;
}
-void Buffer::clone(BufferMap & bufmap) const
+void Buffer::clone(BufferMap & bufmap, CloneList * clones) const
{
// have we already been cloned?
if (bufmap.find(this) != bufmap.end())
Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this);
bufmap[this] = buffer_clone;
+ clones->insert(buffer_clone);
+ buffer_clone->d->clone_list_ = clones;
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
dit.setBuffer(buffer_clone);
Buffer * child = const_cast<Buffer *>(it->second.second);
- child->clone(bufmap);
+ child->clone(bufmap, clones);
BufferMap::iterator const bit = bufmap.find(child);
LASSERT(bit != bufmap.end(), continue);
Buffer * child_clone = bit->second;