diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 3652e7af12..d8d93b0afd 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -278,7 +278,7 @@ public: /// A cache for the bibfiles (including bibfiles of loaded child /// documents), needed for appropriate update of natbib labels. - mutable support::FileNameList bibfiles_cache_; + mutable support::FileNamePairList bibfiles_cache_; // FIXME The caching mechanism could be improved. At present, we have a // cache for each Buffer, that caches all the bibliography info for that @@ -2302,7 +2302,7 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) { if (it->lyxCode() == BIBTEX_CODE) { InsetBibtex const & inset = static_cast(*it); - support::FileNameList const bibfiles = inset.getBibFiles(); + support::FileNamePairList const bibfiles = inset.getBibFiles(); d->bibfiles_cache_.insert(d->bibfiles_cache_.end(), bibfiles.begin(), bibfiles.end()); @@ -2311,7 +2311,7 @@ void Buffer::updateBibfilesCache(UpdateScope scope) const Buffer const * const incbuf = inset.getChildBuffer(); if (!incbuf) continue; - support::FileNameList const & bibfiles = + support::FileNamePairList const & bibfiles = incbuf->getBibfilesCache(UpdateChildOnly); if (!bibfiles.empty()) { d->bibfiles_cache_.insert(d->bibfiles_cache_.end(), @@ -2349,7 +2349,7 @@ void Buffer::invalidateBibfileCache() const } -support::FileNameList const & Buffer::getBibfilesCache(UpdateScope scope) const +support::FileNamePairList const & Buffer::getBibfilesCache(UpdateScope scope) const { // FIXME This is probably unnecessary, given where we call this. // If this is a child document, use the master's cache instead. @@ -2383,16 +2383,17 @@ void Buffer::checkIfBibInfoCacheIsValid() const } // compare the cached timestamps with the actual ones. - FileNameList const & bibfiles_cache = getBibfilesCache(); - FileNameList::const_iterator ei = bibfiles_cache.begin(); - FileNameList::const_iterator en = bibfiles_cache.end(); + FileNamePairList const & bibfiles_cache = getBibfilesCache(); + FileNamePairList::const_iterator ei = bibfiles_cache.begin(); + FileNamePairList::const_iterator en = bibfiles_cache.end(); for (; ei != en; ++ ei) { - time_t lastw = ei->lastModified(); - time_t prevw = d->bibfile_status_[*ei]; + FileName const fn = ei->second; + time_t lastw = fn.lastModified(); + time_t prevw = d->bibfile_status_[fn]; if (lastw != prevw) { d->bibinfo_cache_valid_ = false; d->cite_labels_valid_ = false; - d->bibfile_status_[*ei] = lastw; + d->bibfile_status_[fn] = lastw; } } } diff --git a/src/Buffer.h b/src/Buffer.h index 0cb7026637..999b7cbf73 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -69,7 +69,7 @@ class WorkAreaManager; namespace support { class DocFileName; class FileName; -class FileNameList; +class FileNamePairList; } namespace graphics { @@ -790,7 +790,7 @@ private: void updateBibfilesCache(UpdateScope scope = UpdateMaster) const; /// Return the list with all bibfiles in use (including bibfiles /// of loaded child documents). - support::FileNameList const & + support::FileNamePairList const & getBibfilesCache(UpdateScope scope = UpdateMaster) const; /// void collectChildren(ListOfBuffers & children, bool grand_children) const; diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index 1c4090a350..97d8ed09c6 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -402,12 +402,15 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const } -support::FileNameList InsetBibtex::getBibFiles() const +support::FileNamePairList InsetBibtex::getBibFiles() const { FileName path(buffer().filePath()); support::PathChanger p(path); - support::FileNameList vec; + // We need to store both the real FileName and the way it is entered + // (with full path, rel path or as a single file name). + // The latter is needed for biblatex's central bibfile macro. + support::FileNamePairList vec; vector bibfilelist = getVectorFromString(getParam("bibfiles")); vector::const_iterator it = bibfilelist.begin(); @@ -416,7 +419,7 @@ support::FileNameList InsetBibtex::getBibFiles() const FileName const file = getBibTeXPath(*it, buffer()); if (!file.empty()) - vec.push_back(file); + vec.push_back(make_pair(*it, file)); else LYXERR0("Couldn't find " + to_utf8(*it) + " in InsetBibtex::getBibFiles()!"); } @@ -695,11 +698,11 @@ void InsetBibtex::parseBibTeXFiles() const BiblioInfo keylist; - support::FileNameList const files = getBibFiles(); - support::FileNameList::const_iterator it = files.begin(); - support::FileNameList::const_iterator en = files.end(); + support::FileNamePairList const files = getBibFiles(); + support::FileNamePairList::const_iterator it = files.begin(); + support::FileNamePairList::const_iterator en = files.end(); for (; it != en; ++ it) { - ifdocstream ifs(it->toFilesystemEncoding().c_str(), + ifdocstream ifs(it->second.toFilesystemEncoding().c_str(), ios_base::in, buffer().params().encoding().iconvName()); char_type ch; diff --git a/src/insets/InsetBibtex.h b/src/insets/InsetBibtex.h index a4310ad205..1e42ca4152 100644 --- a/src/insets/InsetBibtex.h +++ b/src/insets/InsetBibtex.h @@ -20,7 +20,7 @@ class BiblioInfo; namespace support { class FileName; - class FileNameList; + class FileNamePairList; } /** Used to insert BibTeX's information @@ -33,7 +33,7 @@ public: ~InsetBibtex(); /// - support::FileNameList getBibFiles() const; + support::FileNamePairList getBibFiles() const; /// bool addDatabase(docstring const &); /// diff --git a/src/support/FileNameList.h b/src/support/FileNameList.h index 20b6a85af7..894087d881 100644 --- a/src/support/FileNameList.h +++ b/src/support/FileNameList.h @@ -28,6 +28,16 @@ class FileNameList: public std::vector { }; + +/** + * List of filename with additional information. Used by the Bibfiles cache, + * which needs to store, next to the real filename, the way it was entered + * in the BibTeX inset (as abspath, relpath or texmf file) + */ +class FileNamePairList: public std::vector> +{ +}; + } // namespace support } // namespace lyx