From: Richard Heck Date: Sat, 7 May 2011 23:02:53 +0000 (+0000) Subject: Fix bug #7499. The problem here is that there was no way for the X-Git-Tag: 2.1.0beta1~3324 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=33ee5c9ae8c4206e9028cb228c7f2d92d0b3ed1b;p=features.git Fix bug #7499. The problem here is that there was no way for the inset to know that the BibTeX data had changed. So we introduce a Buffer-wide variable that we can query for that information. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38619 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 6a66d87e59..07a82c0371 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -257,6 +257,10 @@ public: mutable bool bibfile_cache_valid_; /// Cache of timestamps of .bib files map bibfile_status_; + /// Indicates whether the bibinfo has changed since the last time + /// we ran updateBuffer(), i.e., whether citation labels may need + /// to be updated. + mutable bool cite_labels_valid_; mutable RefCache ref_cache_; @@ -329,8 +333,8 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, read_only(readonly_), filename(file), file_fully_loaded(false), toc_backend(owner), macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0), undo_(*owner), bibinfo_cache_valid_(false), - bibfile_cache_valid_(false), cloned_buffer_(cloned_buffer), - doing_export(false), parent_buffer(0) + bibfile_cache_valid_(false), cite_labels_valid_(false), + cloned_buffer_(cloned_buffer), doing_export(false), parent_buffer(0) { if (!cloned_buffer_) { temppath = createBufferTmpDir(); @@ -347,6 +351,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, bibinfo_cache_valid_ = cloned_buffer_->d->bibinfo_cache_valid_; bibfile_cache_valid_ = cloned_buffer_->d->bibfile_cache_valid_; bibfile_status_ = cloned_buffer_->d->bibfile_status_; + cite_labels_valid_ = cloned_buffer_->d->cite_labels_valid_; } @@ -1771,12 +1776,14 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const } d->bibfile_cache_valid_ = true; d->bibinfo_cache_valid_ = false; + d->cite_labels_valid_ = false; } void Buffer::invalidateBibinfoCache() const { d->bibinfo_cache_valid_ = false; + d->cite_labels_valid_ = false; // also invalidate the cache for the parent buffer Buffer const * const pbuf = d->parent(); if (pbuf) @@ -1788,6 +1795,7 @@ void Buffer::invalidateBibfileCache() const { d->bibfile_cache_valid_ = false; d->bibinfo_cache_valid_ = false; + d->cite_labels_valid_ = false; // also invalidate the cache for the parent buffer Buffer const * const pbuf = d->parent(); if (pbuf) @@ -1837,6 +1845,7 @@ void Buffer::checkIfBibInfoCacheIsValid() const time_t prevw = d->bibfile_status_[*ei]; if (lastw != prevw) { d->bibinfo_cache_valid_ = false; + d->cite_labels_valid_ = false; d->bibfile_status_[*ei] = lastw; } } @@ -1887,6 +1896,12 @@ void Buffer::addBibTeXInfo(docstring const & key, BibTeXInfo const & bi) const } +bool Buffer::citeLabelsValid() const +{ + return masterBuffer()->d->cite_labels_valid_; +} + + bool Buffer::isDepClean(string const & name) const { DepClean::const_iterator const it = d->dep_clean.find(name); @@ -4015,6 +4030,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const return; d->bibinfo_cache_valid_ = true; + d->cite_labels_valid_ = true; cbuf.tocBackend().update(); if (scope == UpdateMaster) cbuf.structureChanged(); diff --git a/src/Buffer.h b/src/Buffer.h index bd462e2640..a54371ce27 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -461,6 +461,8 @@ public: /// add a single piece of bibliography info to our cache void addBibTeXInfo(docstring const & key, BibTeXInfo const & bi) const; /// + bool citeLabelsValid() const; + /// void getLabelList(std::vector &) const; /// diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index 7780f24a8d..6f9035c5b9 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -19,6 +19,8 @@ #include "BufferParams.h" #include "BufferView.h" #include "DispatchResult.h" +#include "FuncCode.h" +#include "FuncRequest.h" #include "LaTeXFeatures.h" #include "output_xhtml.h" #include "ParIterator.h" @@ -99,6 +101,14 @@ bool InsetCitation::isCompatibleCommand(string const & cmd) } +void InsetCitation::doDispatch(Cursor & cur, FuncRequest & cmd) +{ + if (cmd.action() == LFUN_INSET_MODIFY) + cache.recalculate = true; + InsetCommand::doDispatch(cur, cmd); +} + + docstring InsetCitation::toolTip(BufferView const & bv, int, int) const { Buffer const & buf = bv.buffer(); @@ -459,11 +469,10 @@ docstring InsetCitation::screenLabel() const void InsetCitation::updateBuffer(ParIterator const &, UpdateType) { - CiteEngine const engine = buffer().params().citeEngine(); - if (cache.params == params() && cache.engine == engine) + if (!cache.recalculate && buffer().citeLabelsValid()) return; - // The label has changed, so we have to re-create it. + // The label may have changed, so we have to re-create it. docstring const glabel = generateLabel(); unsigned int const maxLabelChars = 45; @@ -474,8 +483,7 @@ void InsetCitation::updateBuffer(ParIterator const &, UpdateType) label += "..."; } - cache.engine = engine; - cache.params = params(); + cache.recalculate = false; cache.generated_label = glabel; cache.screen_label = label; } diff --git a/src/insets/InsetCitation.h b/src/insets/InsetCitation.h index 49104924cd..6eb0da03fc 100644 --- a/src/insets/InsetCitation.h +++ b/src/insets/InsetCitation.h @@ -41,6 +41,8 @@ public: /// docstring toolTip(BufferView const & bv, int x, int y) const; /// + void doDispatch(Cursor & cur, FuncRequest & cmd); + /// InsetCode lyxCode() const { return CITE_CODE; } /// void latex(otexstream &, OutputParams const &) const; @@ -102,14 +104,10 @@ private: static ParamInfo param_info_; /// - class Cache { - public: - /// - Cache() : engine(ENGINE_BASIC), params(CITE_CODE) {} - /// - CiteEngine engine; + struct Cache { + Cache() : recalculate(true) {}; /// - InsetCommandParams params; + bool recalculate; /// docstring generated_label; ///