From: Richard Heck Date: Sat, 19 Apr 2008 15:52:35 +0000 (+0000) Subject: Remove embedding stuff from InsetBibtex. X-Git-Tag: 1.6.10~5109 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=5cadecf3f66912361e30e0e978b2098f0ba5cde7;p=lyx.git Remove embedding stuff from InsetBibtex. There might be some header cleanup that can be done here, or some uses of forward declarations and such. This was pretty quick and dirty, just to get it done. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24357 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index d6fdee79b1..3149aea9ae 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -207,7 +207,7 @@ public: /// A cache for the bibfiles (including bibfiles of loaded child /// documents), needed for appropriate update of natbib labels. - mutable EmbeddedFileList bibfilesCache_; + mutable support::FileNameList bibfilesCache_; mutable RefCache ref_cache_; @@ -1388,7 +1388,7 @@ void Buffer::updateBibfilesCache() const if (it->lyxCode() == BIBTEX_CODE) { InsetBibtex const & inset = static_cast(*it); - EmbeddedFileList const bibfiles = inset.getBibFiles(); + support::FileNameList const bibfiles = inset.getBibFiles(); d->bibfilesCache_.insert(d->bibfilesCache_.end(), bibfiles.begin(), bibfiles.end()); @@ -1396,7 +1396,7 @@ void Buffer::updateBibfilesCache() const InsetInclude & inset = static_cast(*it); inset.updateBibfilesCache(); - EmbeddedFileList const & bibfiles = + support::FileNameList const & bibfiles = inset.getBibfilesCache(*this); d->bibfilesCache_.insert(d->bibfilesCache_.end(), bibfiles.begin(), @@ -1406,7 +1406,7 @@ void Buffer::updateBibfilesCache() const } -EmbeddedFileList const & Buffer::getBibfilesCache() const +support::FileNameList const & Buffer::getBibfilesCache() const { // If this is a child document, use the parent's cache instead. if (d->parent_buffer) diff --git a/src/Buffer.h b/src/Buffer.h index 68f80cc82e..edafa55a0c 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -61,6 +61,7 @@ class WorkAreaManager; namespace support { class FileName; +class FileNameList; } /** The buffer object. @@ -307,7 +308,7 @@ public: void updateBibfilesCache() const; /// Return the cache with all bibfiles in use (including bibfiles /// of loaded child documents). - EmbeddedFileList const & getBibfilesCache() const; + support::FileNameList const & getBibfilesCache() const; /// void getLabelList(std::vector &) const; diff --git a/src/frontends/qt4/GuiBibtex.cpp b/src/frontends/qt4/GuiBibtex.cpp index 274effa2d1..31f7b1bf63 100644 --- a/src/frontends/qt4/GuiBibtex.cpp +++ b/src/frontends/qt4/GuiBibtex.cpp @@ -208,9 +208,7 @@ void GuiBibtex::addDatabase() if (matches.empty()) { QString label = item->text(); QListWidgetItem * db = new QListWidgetItem(label); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } @@ -223,9 +221,7 @@ void GuiBibtex::addDatabase() databaseLW->findItems(f, Qt::MatchExactly); if (matches.empty()) { QListWidgetItem * db = new QListWidgetItem(f); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } @@ -290,19 +286,14 @@ void GuiBibtex::updateContents() databaseLW->clear(); docstring bibs = params_["bibfiles"]; - docstring embs = params_["embed"]; docstring bib; - docstring emb; while (!bibs.empty()) { bibs = split(bibs, bib, ','); - embs = split(embs, emb, ','); bib = trim(bib); if (!bib.empty()) { QListWidgetItem * db = new QListWidgetItem(toqstr(bib)); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(emb.empty() ? Qt::Unchecked : Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } @@ -360,28 +351,17 @@ void GuiBibtex::updateContents() void GuiBibtex::applyView() { docstring dbs; - docstring emb; unsigned int maxCount = databaseLW->count(); - Buffer & buf = buffer(); for (unsigned int i = 0; i < maxCount; i++) { - if (i != 0) { + if (i != 0) dbs += ','; - emb += ','; - } QString item = databaseLW->item(i)->text(); docstring bibfile = qstring_to_ucs4(item); dbs += bibfile; - if (databaseLW->item(i)->checkState() == Qt::Checked) { - FileName bibfilepath = InsetBibtex::getBibTeXPath(bibfile, buf); - string inzipName = EmbeddedFile(bibfilepath.absFilename(), - buf.filePath()).inzipName(); - emb += from_utf8(inzipName); - } } params_["bibfiles"] = dbs; - params_["embed"] = emb; docstring const bibstyle = qstring_to_ucs4(styleCB->currentText()); bool const bibtotoc = bibtocCB->isChecked(); diff --git a/src/frontends/qt4/ui/BibtexUi.ui b/src/frontends/qt4/ui/BibtexUi.ui index 7af0e605e2..a32eefcc91 100644 --- a/src/frontends/qt4/ui/BibtexUi.ui +++ b/src/frontends/qt4/ui/BibtexUi.ui @@ -176,7 +176,7 @@ BibTeX database to use - Databa&ses (select to embed when saved in bundled format) + Databa&ses Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index f2f88cb903..5ecddbc501 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -16,7 +16,6 @@ #include "Buffer.h" #include "BufferParams.h" #include "DispatchResult.h" -#include "EmbeddedFiles.h" #include "Encoding.h" #include "FuncRequest.h" #include "LaTeXFeatures.h" @@ -48,30 +47,10 @@ namespace os = support::os; InsetBibtex::InsetBibtex(InsetCommandParams const & p) - : InsetCommand(p, "bibtex"), bibfiles_() + : InsetCommand(p, "bibtex") {} -void InsetBibtex::setBuffer(Buffer & buffer) -{ - // FIXME We ought to have a buffer. - if (buffer_) { - EmbeddedFileList::iterator it = bibfiles_.begin(); - EmbeddedFileList::iterator en = bibfiles_.end(); - for (; it != en; ++it) { - try { - *it = it->copyTo(buffer); - } catch (ExceptionMessage const & message) { - Alert::error(message.title_, message.details_); - // failed to embed - it->setEmbed(false); - } - } - } - InsetCommand::setBuffer(buffer); -} - - ParamInfo const & InsetBibtex::findInfo(string const & /* cmdName */) { static ParamInfo param_info_; @@ -106,8 +85,6 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd) } // setParams(p); - updateBibFiles(); - updateParam(); buffer().updateBibfilesCache(); break; } @@ -162,11 +139,14 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const // use such filenames.) // Otherwise, store the (maybe absolute) path to the original, // unmangled database name. - EmbeddedFileList::const_iterator it = bibfiles_.begin(); - EmbeddedFileList::const_iterator it_end = bibfiles_.end(); + vector bibfilelist = getVectorFromString(getParam("bibfiles")); + vector::const_iterator it = bibfilelist.begin(); + vector::const_iterator en = bibfilelist.end(); odocstringstream dbs; - for (; it != it_end; ++it) { - string utf8input = removeExtension(it->availableFile().absFilename()); + bool didone = false; + + for (; it != en; ++it) { + string utf8input = to_utf8(*it); string database = normalizeName(buffer(), runparams, utf8input, ".bib"); FileName const try_in_file = @@ -196,8 +176,10 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const from_utf8(database)); } - if (it != bibfiles_.begin()) + if (didone) dbs << ','; + else + didone =- true; // FIXME UNICODE dbs << from_utf8(latex_path(database)); } @@ -305,9 +287,27 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const } -EmbeddedFileList const & InsetBibtex::getBibFiles() const +support::FileNameList InsetBibtex::getBibFiles() const { - return bibfiles_; + FileName path(buffer().filePath()); + support::PathChanger p(path); + + FileNameList vec; + + vector bibfilelist = getVectorFromString(getParam("bibfiles")); + vector::const_iterator it = bibfilelist.begin(); + vector::const_iterator en = bibfilelist.end(); + for (; it != en; ++it) { + FileName const file = + findtexfile(changeExtension(to_utf8(*it), "bib"), "bib"); + + // If we didn't find a matching file name just fail silently + if (!file.empty()) + vec.push_back(file); + } + + return vec; + } namespace { @@ -570,11 +570,11 @@ void InsetBibtex::fillWithBibKeys(BiblioInfo & keylist, // We don't restrict keys to ASCII in LyX, since our own // InsetBibitem can generate non-ASCII keys, and nonstandard // 8bit clean bibtex forks exist. - EmbeddedFileList const & files = getBibFiles(); - EmbeddedFileList::const_iterator it = files.begin(); - EmbeddedFileList::const_iterator en = files.end(); + support::FileNameList const & files = getBibFiles(); + support::FileNameList::const_iterator it = files.begin(); + support::FileNameList::const_iterator en = files.end(); for (; it != en; ++ it) { - idocfstream ifs(it->availableFile().toFilesystemEncoding().c_str(), + idocfstream ifs(it->toFilesystemEncoding().c_str(), ios_base::in, buffer().params().encoding().iconvName()); char_type ch; @@ -718,31 +718,33 @@ FileName InsetBibtex::getBibTeXPath(docstring const & filename, Buffer const & b bool InsetBibtex::addDatabase(docstring const & db) { - FileName const texPath = getBibTeXPath(db, buffer()); - EmbeddedFileList::const_iterator efp = - bibfiles_.findFile(texPath.absFilename()); - if (efp != bibfiles_.end()) - //already have it - return false; - - EmbeddedFile file(texPath.absFilename(), buffer().filePath()); - bibfiles_.push_back(file); - updateParam(); - return true; + docstring bibfiles = getParam("bibfiles"); + if (tokenPos(bibfiles, ',', db) == -1) { + if (!bibfiles.empty()) + bibfiles += ','; + setParam("bibfiles", bibfiles + db); + return true; + } + return false; } bool InsetBibtex::delDatabase(docstring const & db) { - FileName const texPath = getBibTeXPath(db, buffer()); - EmbeddedFileList::iterator efp = - bibfiles_.findFile(texPath.absFilename()); - if (efp == bibfiles_.end()) - // don't have it - return false; - - bibfiles_.erase(efp); - updateParam(); + docstring bibfiles = getParam("bibfiles"); + if (contains(bibfiles, db)) { + int const n = tokenPos(bibfiles, ',', db); + docstring bd = db; + if (n > 0) { + // this is not the first database + docstring tmp = ',' + bd; + setParam("bibfiles", subst(bibfiles, tmp, docstring())); + } else if (n == 0) + // this is the first (or only) database + setParam("bibfiles", split(bibfiles, bd, ',')); + else + return false; + } return true; } @@ -754,103 +756,4 @@ void InsetBibtex::validate(LaTeXFeatures & features) const } -void InsetBibtex::updateBibFiles() const -{ - // need to do this to keep old info while also not - // copying over any files that have been deleted. - EmbeddedFileList oldlist = bibfiles_; - bibfiles_.clear(); - - docstring bibfile; - docstring embfile; - - docstring bibfiles = getParam("bibfiles"); - docstring embfiles = getParam("embed"); - - bibfiles = split(bibfiles, bibfile, ','); - embfiles = split(embfiles, embfile, ','); - - while (!bibfile.empty()) { - FileName bib = getBibTeXPath(bibfile, buffer()); - EmbeddedFileList::iterator efp = oldlist.findFile(bib.absFilename()); - if (efp != oldlist.end()) { - // already have this one, but embedding status may have been changed - bool old_status = efp->embedded(); - bool new_status = !embfile.empty(); - efp->setEmbed(new_status); - try { - // copy file if embedding status changed. - efp->enable(buffer().embedded(), buffer(), old_status != new_status); - } catch (ExceptionMessage const & message) { - Alert::error(message.title_, message.details_); - // failed to change embeddeing status - efp->setEmbed(old_status); - } - bibfiles_.push_back(*efp); - } else { - EmbeddedFile file(bib.absFilename(), buffer().filePath()); - file.setEmbed(!embfile.empty()); - try { - file.enable(buffer().embedded(), buffer(), true); - } catch (ExceptionMessage const & message) { - Alert::error(message.title_, message.details_); - // failed to embed - file.setEmbed(false); - } - bibfiles_.push_back(file); - } - // Get next file name - bibfiles = split(bibfiles, bibfile, ','); - embfiles = split(embfiles, embfile, ','); - } -} - - -void InsetBibtex::updateParam() -{ - docstring bibfiles; - docstring embed; - - bool first = true; - - EmbeddedFileList::iterator it = bibfiles_.begin(); - EmbeddedFileList::iterator en = bibfiles_.end(); - for (; it != en; ++it) { - if (!first) { - bibfiles += ','; - embed += ','; - } else - first = false; - bibfiles += from_utf8(it->outputFilename(buffer().filePath())); - if (it->embedded()) - embed += from_utf8(it->inzipName()); - } - setParam("bibfiles", bibfiles); -} - - -void InsetBibtex::registerEmbeddedFiles(EmbeddedFileList & files) const -{ - if (bibfiles_.empty()) - updateBibFiles(); - - EmbeddedFileList::const_iterator it = bibfiles_.begin(); - EmbeddedFileList::const_iterator en = bibfiles_.end(); - for (; it != en; ++it) - files.registerFile(*it, this, buffer()); -} - - -void InsetBibtex::updateEmbeddedFile(EmbeddedFile const & file) -{ - // look for the item and update status - string const filename = file.absFilename(); - EmbeddedFileList::iterator it = bibfiles_.findFile(filename); - if (it == bibfiles_.end()) - return; - *it = file; - updateParam(); -} - - } // namespace lyx diff --git a/src/insets/InsetBibtex.h b/src/insets/InsetBibtex.h index 0308566afe..e54dd7ab4f 100644 --- a/src/insets/InsetBibtex.h +++ b/src/insets/InsetBibtex.h @@ -16,6 +16,8 @@ #include "EmbeddedFiles.h" #include "InsetCommand.h" +#include "support/FileNameList.h" + #include namespace lyx { @@ -28,8 +30,6 @@ public: /// InsetBibtex(InsetCommandParams const &); /// - virtual void setBuffer(Buffer & buffer); - /// docstring screenLabel() const; /// EDITABLE editable() const { return IS_EDITABLE; } @@ -42,7 +42,7 @@ public: /// void fillWithBibKeys(BiblioInfo &, InsetIterator const &) const; /// - EmbeddedFileList const & getBibFiles() const; + support::FileNameList getBibFiles() const; /// bool addDatabase(docstring const &); /// @@ -56,24 +56,14 @@ public: /// static bool isCompatibleCommand(std::string const & s) { return s == "bibtex"; } - /// update bibfiles and embed from bibfiles_ - void updateParam(); /// look up the path to the file using TeX static support::FileName getBibTeXPath(docstring const & filename, Buffer const & buf); private: - /// - void updateBibFiles() const; - /// - void registerEmbeddedFiles(EmbeddedFileList &) const; - /// - void updateEmbeddedFile(EmbeddedFile const & file); /// void doDispatch(Cursor & cur, FuncRequest & cmd); /// Inset * clone() const { return new InsetBibtex(*this); } - /// embedded bib files - mutable EmbeddedFileList bibfiles_; }; diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index e3d0de3f2d..d9dbbeac1a 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -17,7 +17,6 @@ #include "buffer_funcs.h" #include "BufferParams.h" #include "DispatchResult.h" -#include "EmbeddedFiles.h" #include "FuncRequest.h" #include "LaTeXFeatures.h" #include "ParIterator.h" @@ -25,6 +24,7 @@ #include "support/debug.h" #include "support/docstream.h" +#include "support/FileNameList.h" #include "support/gettext.h" #include "support/lstrings.h" @@ -142,15 +142,15 @@ docstring complexLabel(Buffer const & buffer, static CachedMap cached_keys; // and cache the timestamp of the bibliography files. - static map bibfileStatus; + static map bibfileStatus; BiblioInfo biblist; - EmbeddedFileList const & bibfilesCache = buffer.getBibfilesCache(); + support::FileNameList const & bibfilesCache = buffer.getBibfilesCache(); // compare the cached timestamps with the actual ones. bool changed = false; - EmbeddedFileList::const_iterator ei = bibfilesCache.begin(); - EmbeddedFileList::const_iterator en = bibfilesCache.end(); + support::FileNameList::const_iterator ei = bibfilesCache.begin(); + support::FileNameList::const_iterator en = bibfilesCache.end(); for (; ei != en; ++ ei) { time_t lastw = ei->lastModified(); if (lastw != bibfileStatus[*ei]) { diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 3745f2ddd4..130c843e9a 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -704,17 +704,17 @@ void InsetInclude::updateBibfilesCache() } -EmbeddedFileList const & +support::FileNameList const & InsetInclude::getBibfilesCache(Buffer const & buffer) const { Buffer * const tmp = getChildBuffer(buffer, params()); if (tmp) { tmp->setParent(0); - EmbeddedFileList const & cache = tmp->getBibfilesCache(); + support::FileNameList const & cache = tmp->getBibfilesCache(); tmp->setParent(&buffer); return cache; } - static EmbeddedFileList const empty; + static support::FileNameList const empty; return empty; } diff --git a/src/insets/InsetInclude.h b/src/insets/InsetInclude.h index 80e8c3915a..9a05758a88 100644 --- a/src/insets/InsetInclude.h +++ b/src/insets/InsetInclude.h @@ -19,7 +19,8 @@ #include "Counters.h" #include "InsetCommandParams.h" #include "RenderButton.h" -#include "EmbeddedFiles.h" + +#include "support/FileNameList.h" #include @@ -31,10 +32,6 @@ class InsetLabel; class LaTeXFeatures; class RenderMonitoredPreview; -namespace support { - class FileNameList; -} - /// for including tex/lyx files class InsetInclude : public InsetCommand { public: @@ -72,7 +69,7 @@ public: * Return an empty vector if the child doc is not loaded. * \param buffer the Buffer containing this inset. */ - EmbeddedFileList const & + support::FileNameList const & getBibfilesCache(Buffer const & buffer) const; /// EDITABLE editable() const { return IS_EDITABLE; } diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index ad1b961f77..19c49d6d66 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -592,6 +592,24 @@ int tokenPos(string const & a, char delim, string const & tok) } +// this could probably be faster and/or cleaner, but it seems to work (JMarc) +// rewritten to use new string (Lgb) +int tokenPos(docstring const & a, char_type delim, docstring const & tok) +{ + int i = 0; + docstring str = a; + docstring tmptok; + + while (!str.empty()) { + str = split(str, tmptok, delim); + if (tok == tmptok) + return i; + ++i; + } + return -1; +} + + namespace { /// Substitute all \a oldchar with \a newchar diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 3519184743..c9bc75a9a7 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -152,6 +152,7 @@ docstring const token(docstring const & a, char_type delim, int n); \endcode */ int tokenPos(std::string const & a, char delim, std::string const & tok); +int tokenPos(docstring const & a, char_type delim, docstring const & tok); /// Substitute all \a oldchar with \a newchar