]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
* ExternalSupport.cpp:
[lyx.git] / src / Buffer.cpp
index c64590573ee0e8f87030d2876f00c98be5ad16b3..a068ecfe3a9c9e502cac0801395b4aaf56f09a83 100644 (file)
@@ -127,7 +127,7 @@ namespace {
 
 // 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;
@@ -255,9 +255,9 @@ public:
        /// 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_;
 
@@ -279,12 +279,19 @@ public:
                        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_
@@ -1698,6 +1705,7 @@ void Buffer::getLabelList(vector<docstring> & list) const
 
 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) {
@@ -1714,47 +1722,53 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const
                        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_)
@@ -1766,28 +1780,28 @@ support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const
 
 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];
@@ -1796,15 +1810,20 @@ void Buffer::checkBibInfoCache() const
                        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);
 }
 
 
@@ -3705,7 +3724,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        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
@@ -4014,6 +4033,7 @@ int Buffer::spellCheck(DocIterator & from, DocIterator & to,
                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;