mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 18:08:10 +00:00
Fix multipart document background compilation. I am not fully satisfied with this solution (see FIXME in Buffer::clone()). There might be some memory leaks...
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32910 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
ecc2b2f2e0
commit
cda980db51
@ -380,9 +380,28 @@ Buffer::~Buffer()
|
|||||||
|
|
||||||
Buffer * Buffer::clone() const
|
Buffer * Buffer::clone() const
|
||||||
{
|
{
|
||||||
// FIXME for asynchronous export and preview: We must also clone all
|
Buffer * buffer_clone = new Buffer(fileName().absFilename(), false, this);
|
||||||
// the child buffers!
|
buffer_clone->d->macro_lock = true;
|
||||||
return new Buffer(fileName().absFilename(), false, this);
|
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();
|
||||||
|
for (; it != end; ++it) {
|
||||||
|
DocIterator dit = it->second.clone(buffer_clone);
|
||||||
|
dit.setBuffer(buffer_clone);
|
||||||
|
Buffer * child = const_cast<Buffer *>(it->first);
|
||||||
|
Buffer * child_clone = child->clone();
|
||||||
|
Inset * inset = dit.nextInset();
|
||||||
|
LASSERT(inset && inset->lyxCode() == INCLUDE_CODE, continue);
|
||||||
|
InsetInclude * inset_inc = static_cast<InsetInclude *>(inset);
|
||||||
|
inset_inc->setChildBuffer(child_clone);
|
||||||
|
child_clone->d->setParent(buffer_clone);
|
||||||
|
buffer_clone->setChild(dit, child_clone);
|
||||||
|
}
|
||||||
|
return buffer_clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -484,6 +503,12 @@ Undo & Buffer::undo()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Buffer::setChild(DocIterator const & dit, Buffer * child)
|
||||||
|
{
|
||||||
|
d->children_positions[child] = dit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string Buffer::latexName(bool const no_path) const
|
string Buffer::latexName(bool const no_path) const
|
||||||
{
|
{
|
||||||
FileName latex_name =
|
FileName latex_name =
|
||||||
|
@ -474,6 +474,8 @@ public:
|
|||||||
/// This function is called when the buffer is changed.
|
/// This function is called when the buffer is changed.
|
||||||
void changed(bool update_metrics) const;
|
void changed(bool update_metrics) const;
|
||||||
///
|
///
|
||||||
|
void setChild(DocIterator const & dit, Buffer * child);
|
||||||
|
///
|
||||||
void updateTocItem(std::string const &, DocIterator const &) const;
|
void updateTocItem(std::string const &, DocIterator const &) const;
|
||||||
/// This function is called when the buffer structure is changed.
|
/// This function is called when the buffer structure is changed.
|
||||||
void structureChanged() const;
|
void structureChanged() const;
|
||||||
|
@ -72,6 +72,24 @@ DocIterator doc_iterator_end(const Buffer * buf0, const Inset * inset0)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DocIterator DocIterator::clone(Buffer * buffer) const
|
||||||
|
{
|
||||||
|
LASSERT(buffer->isClone(), return DocIterator());
|
||||||
|
Inset * inset = &buffer->inset();
|
||||||
|
DocIterator dit = *this;
|
||||||
|
dit.buffer_ = buffer;
|
||||||
|
dit.inset_ = inset;
|
||||||
|
size_t const n = slices_.size();
|
||||||
|
for (size_t i = 0 ; i != n; ++i) {
|
||||||
|
LASSERT(inset, /**/);
|
||||||
|
dit.top().inset_ = inset;
|
||||||
|
if (i + 1 != n)
|
||||||
|
inset = dit.nextInset();
|
||||||
|
}
|
||||||
|
return dit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DocIterator::inRegexped() const
|
bool DocIterator::inRegexped() const
|
||||||
{
|
{
|
||||||
InsetMathHull * i = dynamic_cast<InsetMathHull *>(inset().asInsetMath());
|
InsetMathHull * i = dynamic_cast<InsetMathHull *>(inset().asInsetMath());
|
||||||
|
@ -51,6 +51,10 @@ public:
|
|||||||
/// access to owning buffer
|
/// access to owning buffer
|
||||||
void setBuffer(Buffer * buf) { buffer_ = buf; }
|
void setBuffer(Buffer * buf) { buffer_ = buf; }
|
||||||
|
|
||||||
|
/// Clone this for given \p buffer.
|
||||||
|
/// \p buffer must be a clone of buffer_.
|
||||||
|
DocIterator clone(Buffer * buffer) const;
|
||||||
|
|
||||||
/// access slice at position \p i
|
/// access slice at position \p i
|
||||||
CursorSlice const & operator[](size_t i) const { return slices_[i]; }
|
CursorSlice const & operator[](size_t i) const { return slices_[i]; }
|
||||||
/// access slice at position \p i
|
/// access slice at position \p i
|
||||||
|
@ -200,6 +200,12 @@ void InsetInclude::setBuffer(Buffer & buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetInclude::setChildBuffer(Buffer * buffer)
|
||||||
|
{
|
||||||
|
child_buffer_ = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ParamInfo const & InsetInclude::findInfo(string const & /* cmdName */)
|
ParamInfo const & InsetInclude::findInfo(string const & /* cmdName */)
|
||||||
{
|
{
|
||||||
// FIXME
|
// FIXME
|
||||||
@ -382,6 +388,11 @@ Buffer * InsetInclude::getChildBuffer() const
|
|||||||
|
|
||||||
Buffer * InsetInclude::loadIfNeeded() const
|
Buffer * InsetInclude::loadIfNeeded() const
|
||||||
{
|
{
|
||||||
|
// This is for background export and preview. We don't want to load the
|
||||||
|
// cloned child document again.
|
||||||
|
if (child_buffer_ && child_buffer_->isClone())
|
||||||
|
return child_buffer_;
|
||||||
|
|
||||||
// Don't try to load it again if we failed before.
|
// Don't try to load it again if we failed before.
|
||||||
if (failedtoload_ || isVerbatim(params()) || isListings(params()))
|
if (failedtoload_ || isVerbatim(params()) || isListings(params()))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -50,6 +50,10 @@ public:
|
|||||||
DisplayType display() const;
|
DisplayType display() const;
|
||||||
///
|
///
|
||||||
InsetCode lyxCode() const { return INCLUDE_CODE; }
|
InsetCode lyxCode() const { return INCLUDE_CODE; }
|
||||||
|
|
||||||
|
///
|
||||||
|
void setChildBuffer(Buffer * buffer);
|
||||||
|
|
||||||
/** Fills \c keys
|
/** Fills \c keys
|
||||||
* \param buffer the Buffer containing this inset.
|
* \param buffer the Buffer containing this inset.
|
||||||
* \param keys the list of bibkeys in the child buffer.
|
* \param keys the list of bibkeys in the child buffer.
|
||||||
|
Loading…
Reference in New Issue
Block a user