]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetBibtex.cpp
Fix trailing whitespace in cpp files.
[lyx.git] / src / insets / InsetBibtex.cpp
index 4ead8663492ef6ac631715b5997323210af1052b..4b9dab5d6513f572ac7b1539031ce1cc52723500 100644 (file)
@@ -68,8 +68,11 @@ InsetBibtex::InsetBibtex(Buffer * buf, InsetCommandParams const & p)
 InsetBibtex::~InsetBibtex()
 {
        if (isBufferLoaded()) {
-               buffer().invalidateBibfileCache();
-               buffer().removeBiblioTempFiles();
+               /* We do not use buffer() because Coverity believes that this
+                * may throw an exception. Actually this code path is not
+                * taken when buffer_ == 0 */
+               buffer_-> invalidateBibfileCache();
+               buffer_->removeBiblioTempFiles();
        }
 }
 
@@ -149,7 +152,7 @@ void InsetBibtex::editDatabases() const
 
        int nr_databases = bibfilelist.size();
        if (nr_databases > 1) {
-                       docstring const engine = usingBiblatex() ? _("Biblatex") : _("BibTex");
+                       docstring const engine = usingBiblatex() ? _("Biblatex") : _("BibTeX");
                        docstring message = bformat(_("The %1$s[[BibTeX/Biblatex]] inset includes %2$s databases.\n"
                                                       "If you proceed, all of them will be opened."),
                                                        engine, convert<docstring>(nr_databases));
@@ -164,15 +167,15 @@ void InsetBibtex::editDatabases() const
        vector<docstring>::const_iterator en = bibfilelist.end();
        for (; it != en; ++it) {
                FileName const bibfile = getBibTeXPath(*it, buffer());
-               formats.edit(buffer(), bibfile,
-                    formats.getFormatFromFile(bibfile));
+               theFormats().edit(buffer(), bibfile,
+                    theFormats().getFormatFromFile(bibfile));
        }
 }
 
 
 bool InsetBibtex::usingBiblatex() const
 {
-       return buffer().params().useBiblatex();
+       return buffer().masterParams().useBiblatex();
 }
 
 
@@ -206,12 +209,12 @@ docstring InsetBibtex::toolTip(BufferView const & /*bv*/, int /*x*/, int /*y*/)
                        style = split(style, bibtotoc, char_type(','));
        }
 
+       docstring const btprint = getParam("btprint");
        if (!usingBiblatex()) {
                tip += _("Style File:");
                tip += "<ul><li>" + (style.empty() ? _("none") : style) + "</li></ul>";
 
                tip += _("Lists:") + " ";
-               docstring btprint = getParam("btprint");
                if (btprint == "btPrintAll")
                        tip += _("all references");
                else if (btprint == "btPrintNotCited")
@@ -222,9 +225,24 @@ docstring InsetBibtex::toolTip(BufferView const & /*bv*/, int /*x*/, int /*y*/)
                        tip += ", ";
                        tip += _("included in TOC");
                }
+               if (!buffer().parent()
+                   && buffer().params().multibib == "child") {
+                       tip += "<br />";
+                       tip += _("Note: This bibliography is not output, since bibliographies in the master file "
+                                "are not allowed with the setting 'Multiple bibliographies per child document'");
+               }
        } else {
-               if (toc)
-                       tip += _("Included in TOC");
+               tip += _("Lists:") + " ";
+               if (btprint == "bibbysection")
+                       tip += _("all reference units");
+               else if (btprint == "btPrintAll")
+                       tip += _("all references");
+               else
+                       tip += _("all cited references");
+               if (toc) {
+                       tip += ", ";
+                       tip += _("included in TOC");
+               }
                if (!getParam("biblatexopts").empty()) {
                        if (toc)
                                tip += "<br />";
@@ -250,6 +268,13 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
        // 4. \end{btSect}
        // With Biblatex:
        // \printbibliography[biblatexopts]
+       // or
+       // \bibbysection[biblatexopts] - if btprint is "bibbysection"
+
+       // chapterbib does not allow bibliographies in the master
+       if (!usingBiblatex() && !runparams.is_child
+           && buffer().params().multibib == "child")
+               return;
 
        string style = to_utf8(getParam("options")); // maybe empty! and with bibtotoc
        string bibtotoc;
@@ -269,7 +294,10 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
                docstring btprint = getParam("btprint");
                if (btprint == "btPrintAll")
                        os << "\\nocite{*}\n";
-               os << "\\printbibliography";
+               if (btprint == "bibbysection" && !buffer().masterParams().multibib.empty())
+                       os << "\\bibbysection";
+               else
+                       os << "\\printbibliography";
                if (!opts.empty())
                        os << "[" << opts << "]";
                os << "\n";
@@ -279,9 +307,9 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
                        buffer().prepareBibFilePaths(runparams, getBibFiles(), false);
                // Style options
                if (style == "default")
-                       style = buffer().params().defaultBiblioStyle();
-               if (!style.empty() && !buffer().params().use_bibtopic) {
-                       string base = buffer().prepareFileNameForLaTeX(style, ".bst", runparams.nice);
+                       style = buffer().masterParams().defaultBiblioStyle();
+               if (!style.empty() && !buffer().masterParams().useBibtopic()) {
+                       string base = buffer().masterBuffer()->prepareFileNameForLaTeX(style, ".bst", runparams.nice);
                        FileName const try_in_file =
                                makeAbsPath(base + ".bst", buffer().filePath());
                        bool const not_from_texmf = try_in_file.isReadableFile();
@@ -316,7 +344,7 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
                                                      "BibTeX will be unable to find it."));
                }
                // Handle the bibtopic case
-               if (!db_out.empty() && buffer().params().use_bibtopic) {
+               if (!db_out.empty() && buffer().masterParams().useBibtopic()) {
                        os << "\\begin{btSect}";
                        if (!style.empty())
                                os << "[" << style << "]";
@@ -329,17 +357,17 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const
                           << "\\end{btSect}\n";
                }
                // bibtotoc option
-               if (!bibtotoc.empty() && !buffer().params().use_bibtopic) {
+               if (!bibtotoc.empty() && !buffer().masterParams().useBibtopic()) {
                        // set label for hyperref, see http://www.lyx.org/trac/ticket/6470
-                       if (buffer().params().pdfoptions().use_hyperref)
+                       if (buffer().masterParams().pdfoptions().use_hyperref)
                                        os << "\\phantomsection";
-                       if (buffer().params().documentClass().hasLaTeXLayout("chapter"))
+                       if (buffer().masterParams().documentClass().hasLaTeXLayout("chapter"))
                                os << "\\addcontentsline{toc}{chapter}{\\bibname}";
-                       else if (buffer().params().documentClass().hasLaTeXLayout("section"))
+                       else if (buffer().masterParams().documentClass().hasLaTeXLayout("section"))
                                os << "\\addcontentsline{toc}{section}{\\refname}";
                }
                // The bibliography command
-               if (!db_out.empty() && !buffer().params().use_bibtopic) {
+               if (!db_out.empty() && !buffer().masterParams().useBibtopic()) {
                        docstring btprint = getParam("btprint");
                        if (btprint == "btPrintAll") {
                                os << "\\nocite{*}\n";
@@ -651,7 +679,7 @@ void InsetBibtex::parseBibTeXFiles() const
        support::FileNamePairList::const_iterator en = files.end();
        for (; it != en; ++ it) {
                ifdocstream ifs(it->second.toFilesystemEncoding().c_str(),
-                       ios_base::in, buffer().params().encoding().iconvName());
+                       ios_base::in, buffer().masterParams().encoding().iconvName());
 
                char_type ch;
                VarMap strings;
@@ -862,8 +890,11 @@ bool InsetBibtex::delDatabase(docstring const & db)
 
 void InsetBibtex::validate(LaTeXFeatures & features) const
 {
-       if (features.bufferParams().use_bibtopic)
+       BufferParams const & mparams = features.buffer().masterParams();
+       if (mparams.useBibtopic())
                features.require("bibtopic");
+       else if (!mparams.useBiblatex() && mparams.multibib == "child")
+               features.require("chapterbib");
        // FIXME XHTML
        // It'd be better to be able to get this from an InsetLayout, but at present
        // InsetLayouts do not seem really to work for things that aren't InsetTexts.
@@ -927,7 +958,7 @@ docstring InsetBibtex::xhtml(XHTMLStream & xs, OutputParams const &) const
 {
        BiblioInfo const & bibinfo = buffer().masterBibInfo();
        bool const all_entries = getParam("btprint") == "btPrintAll";
-       vector<docstring> const & cites = 
+       vector<docstring> const & cites =
            all_entries ? bibinfo.getKeys() : bibinfo.citedEntries();
 
        docstring const reflabel = buffer().B_("References");
@@ -952,17 +983,17 @@ docstring InsetBibtex::xhtml(XHTMLStream & xs, OutputParams const &) const
                        continue;
 
                BibTeXInfo const & entry = biit->second;
-               string const attr = "class='bibtexentry' id='LyXCite-" 
+               string const attr = "class='bibtexentry' id='LyXCite-"
                    + to_utf8(html::cleanAttr(entry.key())) + "'";
                xs << html::StartTag("div", attr);
-               
+
                // don't print labels if we're outputting all entries
                if (!all_entries) {
                        xs << html::StartTag("span", "class='bibtexlabel'")
                                << entry.label()
                                << html::EndTag("span");
                }
-               
+
                // FIXME Right now, we are calling BibInfo::getInfo on the key,
                // which will give us all the cross-referenced info. But for every
                // entry, so there's a lot of repitition. This should be fixed.