// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-int const LYX_FORMAT = 398; // uwestoehr: support for \mathscr
+int const LYX_FORMAT = 400; // uwestoehr: support for \rule
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
/// A cache for bibliography info
mutable BiblioInfo bibinfo_;
/// whether the bibinfo cache is valid
- bool bibinfo_cache_valid_;
+ mutable bool bibinfo_cache_valid_;
/// whether the bibfile cache is valid
- bool bibfile_cache_valid_;
+ mutable bool bibfile_cache_valid_;
/// Cache of timestamps of .bib files
map<FileName, time_t> bibfile_status_;
parent_buffer = 0;
return parent_buffer;
}
+
///
void setParent(Buffer const * pb) {
- if (!cloned_buffer_
- && parent_buffer && pb && parent_buffer != pb)
+ if (parent_buffer == pb)
+ // nothing to do
+ return;
+ if (!cloned_buffer_ && parent_buffer && pb)
LYXERR0("Warning: a buffer should not have two parents!");
parent_buffer = pb;
+ if (!cloned_buffer_ && parent_buffer) {
+ parent_buffer->invalidateBibfileCache();
+ parent_buffer->invalidateBibinfoCache();
+ }
}
/// If non zero, this buffer is a clone of existing buffer \p cloned_buffer_
void Buffer::updateBibfilesCache(UpdateScope scope) const
{
+ // FIXME This is probably unnecssary, given where we call this.
// If this is a child document, use the parent's cache instead.
Buffer const * const pbuf = d->parent();
if (pbuf && scope != UpdateChildOnly) {
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
bibfiles.begin(),
bibfiles.end());
- // the bibinfo cache is now invalid
- d->bibinfo_cache_valid_ = false;
} else if (it->lyxCode() == INCLUDE_CODE) {
InsetInclude & inset =
static_cast<InsetInclude &>(*it);
Buffer const * const incbuf = inset.getChildBuffer();
if (!incbuf)
continue;
- incbuf->updateBibfilesCache(UpdateChildOnly);
support::FileNameList const & bibfiles =
incbuf->getBibfilesCache(UpdateChildOnly);
if (!bibfiles.empty()) {
d->bibfiles_cache_.insert(d->bibfiles_cache_.end(),
bibfiles.begin(),
bibfiles.end());
- // the bibinfo cache is now invalid
- d->bibinfo_cache_valid_ = false;
}
}
}
d->bibfile_cache_valid_ = true;
+ d->bibinfo_cache_valid_ = false;
}
-void Buffer::invalidateBibinfoCache()
+void Buffer::invalidateBibinfoCache() const
{
d->bibinfo_cache_valid_ = false;
+ // also invalidate the cache for the parent buffer
+ Buffer const * const pbuf = d->parent();
+ if (pbuf)
+ pbuf->invalidateBibinfoCache();
}
-void Buffer::invalidateBibfileCache()
+void Buffer::invalidateBibfileCache() const
{
d->bibfile_cache_valid_ = false;
- invalidateBibinfoCache();
+ d->bibinfo_cache_valid_ = false;
+ // also invalidate the cache for the parent buffer
+ Buffer const * const pbuf = d->parent();
+ if (pbuf)
+ pbuf->invalidateBibfileCache();
}
+
support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const
{
- // If this is a child document, use the parent's cache instead.
- Buffer const * const pbuf = d->parent();
- if (pbuf && scope != UpdateChildOnly)
+ // FIXME This is probably unnecessary, given where we call this.
+ // If this is a child document, use the master's cache instead.
+ Buffer const * const pbuf = masterBuffer();
+ if (pbuf != this && scope != UpdateChildOnly)
return pbuf->getBibfilesCache();
if (!d->bibfile_cache_valid_)
BiblioInfo const & Buffer::masterBibInfo() const
{
- // if this is a child document and the parent is already loaded
- // use the parent's list instead [ale990412]
Buffer const * const tmp = masterBuffer();
- LASSERT(tmp, /**/);
if (tmp != this)
return tmp->masterBibInfo();
- return localBibInfo();
-}
-
-
-BiblioInfo const & Buffer::localBibInfo() const
-{
return d->bibinfo_;
}
void Buffer::checkBibInfoCache() const
{
- support::FileNameList const & bibfilesCache = getBibfilesCache();
+ // use the master's cache
+ Buffer const * const tmp = masterBuffer();
+ if (tmp != this) {
+ tmp->checkBibInfoCache();
+ return;
+ }
+
+ // this will also reload the cache if it is invalid
+ support::FileNameList const & bibfiles_cache = getBibfilesCache();
+
// compare the cached timestamps with the actual ones.
- support::FileNameList::const_iterator ei = bibfilesCache.begin();
- support::FileNameList::const_iterator en = bibfilesCache.end();
+ support::FileNameList::const_iterator ei = bibfiles_cache.begin();
+ support::FileNameList::const_iterator en = bibfiles_cache.end();
for (; ei != en; ++ ei) {
time_t lastw = ei->lastModified();
time_t prevw = d->bibfile_status_[*ei];
d->bibfile_status_[*ei] = lastw;
}
}
-
- // FIXME Don't do this here, but instead gather them as we go through
- // updateBuffer().
+
+ // if not valid, then reload the info
if (!d->bibinfo_cache_valid_) {
d->bibinfo_.clear();
- for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
- it->fillWithBibKeys(d->bibinfo_, it);
+ fillWithBibKeys(d->bibinfo_);
d->bibinfo_cache_valid_ = true;
- }
+ }
+}
+
+
+void Buffer::fillWithBibKeys(BiblioInfo & keys) const
+{
+ for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
+ it->fillWithBibKeys(keys, it);
}
DocumentClass const & textclass = master->params().documentClass();
// do this only if we are the top-level Buffer
- if (scope != UpdateMaster || master == this)
+ if (master == this)
checkBibInfoCache();
// keep the buffers to be children in this set. If the call from the
if (from == end)
break;
to = from;
+ from.paragraph().spellCheck();
SpellChecker::Result res = from.paragraph().spellCheck(from.pos(), to.pos(), wl, suggestions);
if (SpellChecker::misspelled(res)) {
word_lang = wl;