]> git.lyx.org Git - lyx.git/blobdiff - src/buffer.C
Oops...
[lyx.git] / src / buffer.C
index 0ea325d36dbd77eef2e17352c44a65db46eba539..d091ac51e867a2cec56a97b67b30cc5bf48342df 100644 (file)
 #include "lyxtext.h"
 #include "gettext.h"
 #include "language.h"
-#include "encoding.h"
 #include "exporter.h"
 #include "Lsstream.h"
-#include "converter.h"
+#include "format.h"
 #include "BufferView.h"
 #include "ParagraphParameters.h"
 #include "iterators.h"
@@ -56,7 +55,8 @@
 #include "insets/insetnote.h"
 #include "insets/insetquotes.h"
 #include "insets/insetlatexaccent.h"
-#include "insets/insetbib.h"
+#include "insets/insetbibitem.h"
+#include "insets/insetbibtex.h"
 #include "insets/insetcite.h"
 #include "insets/insetexternal.h"
 #include "insets/insetindex.h"
@@ -93,7 +93,6 @@
 #include "support/lyxlib.h"
 #include "support/FileInfo.h"
 #include "support/lyxmanip.h"
-#include "support/lyxalgo.h" // for lyx::count
 #include "support/lyxtime.h"
 
 #include <boost/bind.hpp>
@@ -132,8 +131,6 @@ using std::pair;
 using std::make_pair;
 using std::vector;
 using std::map;
-using std::max;
-using std::set;
 using std::stack;
 using std::list;
 using std::for_each;
@@ -165,7 +162,7 @@ Buffer::Buffer(string const & file, bool ronly)
        }
 
        // set initial author
-       authorlist.record(Author(lyxrc.user_name, lyxrc.user_email)); 
+       authorlist.record(Author(lyxrc.user_name, lyxrc.user_email));
 }
 
 
@@ -399,7 +396,7 @@ namespace {
        // but this code is too b0rken to admit of a better solution yet
        Change current_change;
 };
+
 
 bool
 Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
@@ -775,7 +772,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                istringstream ss(lex.getString());
                Author a;
                ss >> a;
-               int aid(authorlist.record(a)); 
+               int aid(authorlist.record(a));
                lyxerr << "aid is " << aid << endl;
                lyxerr << "listed aid is " << author_ids.size() << endl;
                author_ids.push_back(authorlist.record(a));
@@ -926,7 +923,8 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                params.float_placement = lex.getString();
        } else if (token == "\\align") {
                int tmpret = lex.findToken(string_align);
-               if (tmpret == -1) ++tmpret;
+               if (tmpret == -1)
+                       ++tmpret;
                int const tmpret2 = int(pow(2.0, tmpret));
                par->params().align(LyXAlignment(tmpret2));
        } else if (token == "\\added_space_top") {
@@ -959,6 +957,12 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                inset->read(this, lex);
                par->insertInset(pos, inset, font, current_change);
                ++pos;
+       } else if (token == "\\bibitem") {  // ale970302
+               InsetCommandParams p("bibitem", "dummy");
+               InsetBibitem * inset = new InsetBibitem(p);
+               inset->read(this, lex);
+               par->insertInset(pos, inset, font, current_change);
+               ++pos;
        } else if (token == "\\hfill") {
                par->insertChar(pos, Paragraph::META_HFILL, font, current_change);
                ++pos;
@@ -983,12 +987,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                istr >> aid;
                istr >> ct;
                current_change = Change(Change::DELETED, author_ids[aid], ct);
-       } else if (token == "\\bibitem") {  // ale970302
-               if (!par->bibkey) {
-                       InsetCommandParams p("bibitem", "dummy");
-                       par->bibkey = new InsetBibKey(p);
-               }
-               par->bibkey->read(this, lex);
        } else if (token == "\\the_end") {
                the_end_read = true;
        } else {
@@ -1017,7 +1015,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
 
 // needed to insert the selection
 void Buffer::insertStringAsLines(Paragraph *& par, pos_type & pos,
-                                LyXFont const & fn,string const & str) const
+                                LyXFont const & fn,string const & str)
 {
        LyXLayout_ptr const & layout = par->layout();
 
@@ -1032,7 +1030,7 @@ void Buffer::insertStringAsLines(Paragraph *& par, pos_type & pos,
            cit != str.end(); ++cit) {
                if (*cit == '\n') {
                        if (autobreakrows && (!par->empty() || layout->keepempty)) {
-                               breakParagraph(params, par, pos,
+                               breakParagraph(this, par, pos,
                                               layout->isEnvironment());
                                par = par->next();
                                pos = 0;
@@ -1102,7 +1100,7 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetCitation(inscmd);
                } else if (cmdName == "bibitem") {
                        lex.printError("Wrong place for bibitem");
-                       inset = new InsetBibKey(inscmd);
+                       inset = new InsetBibitem(inscmd);
                } else if (cmdName == "BibTeX") {
                        inset = new InsetBibtex(inscmd);
                } else if (cmdName == "index") {
@@ -1137,7 +1135,6 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetParent(inscmd, *this);
                }
        } else {
-               bool alreadyread = false;
                if (tmptok == "Quotes") {
                        inset = new InsetQuotes;
                } else if (tmptok == "External") {
@@ -1146,16 +1143,8 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetFormulaMacro;
                } else if (tmptok == "Formula") {
                        inset = new InsetFormula;
-               } else if (tmptok == "Figure") { // Backward compatibility
-//                     inset = new InsetFig(100, 100, *this);
-                       inset = new InsetGraphics;
                } else if (tmptok == "Graphics") {
                        inset = new InsetGraphics;
-               } else if (tmptok == "Info") {// backwards compatibility
-                       inset = new InsetNote(this,
-                                             lex.getLongString("\\end_inset"),
-                                             true);
-                       alreadyread = true;
                } else if (tmptok == "Note") {
                        inset = new InsetNote(params);
                } else if (tmptok == "Include") {
@@ -1195,7 +1184,8 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetFloatList;
                }
 
-               if (inset && !alreadyread) inset->read(this, lex);
+               if (inset)
+                       inset->read(this, lex);
        }
 
        if (inset) {
@@ -1402,7 +1392,7 @@ bool Buffer::writeFile(string const & fname) const
                        ofs << "\\author " << it->second << "\n";
                }
        }
+
        Paragraph::depth_type depth = 0;
 
        // this will write out all the paragraphs
@@ -1589,7 +1579,7 @@ string const Buffer::asciiParagraph(Paragraph const & par,
 
        // this is to change the linebreak to do it by word a bit more
        // intelligent hopefully! (only in the case where we have a
-       // max linelenght!) (Jug)
+       // max linelength!) (Jug)
 
        string word;
 
@@ -1695,8 +1685,6 @@ void Buffer::writeFileAscii(ostream & os, int linelen)
 }
 
 
-bool use_babel;
-
 
 void Buffer::makeLaTeXFile(string const & fname,
                           string const & original_path,
@@ -1771,388 +1759,8 @@ void Buffer::makeLaTeXFile(ostream & os,
                        texrow.newline();
                }
 
-               os << "\\documentclass";
-
-               LyXTextClass const & tclass = params.getLyXTextClass();
-
-               ostringstream options; // the document class options.
-
-               if (tokenPos(tclass.opt_fontsize(),
-                            '|', params.fontsize) >= 0) {
-                       // only write if existing in list (and not default)
-                       options << params.fontsize << "pt,";
-               }
-
-
-               if (!params.use_geometry &&
-                   (params.paperpackage == BufferParams::PACKAGE_NONE)) {
-                       switch (params.papersize) {
-                       case BufferParams::PAPER_A4PAPER:
-                               options << "a4paper,";
-                               break;
-                       case BufferParams::PAPER_USLETTER:
-                               options << "letterpaper,";
-                               break;
-                       case BufferParams::PAPER_A5PAPER:
-                               options << "a5paper,";
-                               break;
-                       case BufferParams::PAPER_B5PAPER:
-                               options << "b5paper,";
-                               break;
-                       case BufferParams::PAPER_EXECUTIVEPAPER:
-                               options << "executivepaper,";
-                               break;
-                       case BufferParams::PAPER_LEGALPAPER:
-                               options << "legalpaper,";
-                               break;
-                       }
-               }
-
-               // if needed
-               if (params.sides != tclass.sides()) {
-                       switch (params.sides) {
-                       case LyXTextClass::OneSide:
-                               options << "oneside,";
-                               break;
-                       case LyXTextClass::TwoSides:
-                               options << "twoside,";
-                               break;
-                       }
-               }
-
-               // if needed
-               if (params.columns != tclass.columns()) {
-                       if (params.columns == 2)
-                               options << "twocolumn,";
-                       else
-                               options << "onecolumn,";
-               }
-
-               if (!params.use_geometry
-                   && params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
-                       options << "landscape,";
-
-               // language should be a parameter to \documentclass
-               use_babel = false;
-               ostringstream language_options;
-               if (params.language->babel() == "hebrew"
-                   && default_language->babel() != "hebrew")
-                        // This seems necessary
-                       features.useLanguage(default_language);
-
-               if (lyxrc.language_use_babel ||
-                   params.language->lang() != lyxrc.default_language ||
-                   features.hasLanguages()) {
-                       use_babel = true;
-                       language_options << features.getLanguages();
-                       language_options << params.language->babel();
-                       if (lyxrc.language_global_options)
-                               options << language_options.str() << ',';
-               }
-
-               // the user-defined options
-               if (!params.options.empty()) {
-                       options << params.options << ',';
-               }
-
-               string strOptions(STRCONV(options.str()));
-               if (!strOptions.empty()) {
-                       strOptions = rtrim(strOptions, ",");
-                       os << '[' << strOptions << ']';
-               }
-
-               os << '{' << tclass.latexname() << "}\n";
-               texrow.newline();
-               // end of \documentclass defs
-
-               // font selection must be done before loading fontenc.sty
-               // The ae package is not needed when using OT1 font encoding.
-               if (params.fonts != "default" &&
-                   (params.fonts != "ae" || lyxrc.fontenc != "default")) {
-                       os << "\\usepackage{" << params.fonts << "}\n";
-                       texrow.newline();
-                       if (params.fonts == "ae") {
-                               os << "\\usepackage{aecompl}\n";
-                               texrow.newline();
-                       }
-               }
-               // this one is not per buffer
-               if (lyxrc.fontenc != "default") {
-                       os << "\\usepackage[" << lyxrc.fontenc
-                           << "]{fontenc}\n";
-                       texrow.newline();
-               }
-
-               if (params.inputenc == "auto") {
-                       string const doc_encoding =
-                               params.language->encoding()->LatexName();
-
-                       // Create a list with all the input encodings used
-                       // in the document
-                       set<string> encodings = features.getEncodingSet(doc_encoding);
-
-                       os << "\\usepackage[";
-                       std::copy(encodings.begin(), encodings.end(),
-                                 std::ostream_iterator<string>(os, ","));
-                       os << doc_encoding << "]{inputenc}\n";
-                       texrow.newline();
-               } else if (params.inputenc != "default") {
-                       os << "\\usepackage[" << params.inputenc
-                           << "]{inputenc}\n";
-                       texrow.newline();
-               }
-
-               // At the very beginning the text parameters.
-               if (params.paperpackage != BufferParams::PACKAGE_NONE) {
-                       switch (params.paperpackage) {
-                       case BufferParams::PACKAGE_A4:
-                               os << "\\usepackage{a4}\n";
-                               texrow.newline();
-                               break;
-                       case BufferParams::PACKAGE_A4WIDE:
-                               os << "\\usepackage{a4wide}\n";
-                               texrow.newline();
-                               break;
-                       case BufferParams::PACKAGE_WIDEMARGINSA4:
-                               os << "\\usepackage[widemargins]{a4}\n";
-                               texrow.newline();
-                               break;
-                       }
-               }
-               if (params.use_geometry) {
-                       os << "\\usepackage{geometry}\n";
-                       texrow.newline();
-                       os << "\\geometry{verbose";
-                       if (params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
-                               os << ",landscape";
-                       switch (params.papersize2) {
-                       case BufferParams::VM_PAPER_CUSTOM:
-                               if (!params.paperwidth.empty())
-                                       os << ",paperwidth="
-                                           << params.paperwidth;
-                               if (!params.paperheight.empty())
-                                       os << ",paperheight="
-                                           << params.paperheight;
-                               break;
-                       case BufferParams::VM_PAPER_USLETTER:
-                               os << ",letterpaper";
-                               break;
-                       case BufferParams::VM_PAPER_USLEGAL:
-                               os << ",legalpaper";
-                               break;
-                       case BufferParams::VM_PAPER_USEXECUTIVE:
-                               os << ",executivepaper";
-                               break;
-                       case BufferParams::VM_PAPER_A3:
-                               os << ",a3paper";
-                               break;
-                       case BufferParams::VM_PAPER_A4:
-                               os << ",a4paper";
-                               break;
-                       case BufferParams::VM_PAPER_A5:
-                               os << ",a5paper";
-                               break;
-                       case BufferParams::VM_PAPER_B3:
-                               os << ",b3paper";
-                               break;
-                       case BufferParams::VM_PAPER_B4:
-                               os << ",b4paper";
-                               break;
-                       case BufferParams::VM_PAPER_B5:
-                               os << ",b5paper";
-                               break;
-                       default:
-                               // default papersize ie BufferParams::VM_PAPER_DEFAULT
-                               switch (lyxrc.default_papersize) {
-                               case BufferParams::PAPER_DEFAULT: // keep compiler happy
-                               case BufferParams::PAPER_USLETTER:
-                                       os << ",letterpaper";
-                                       break;
-                               case BufferParams::PAPER_LEGALPAPER:
-                                       os << ",legalpaper";
-                                       break;
-                               case BufferParams::PAPER_EXECUTIVEPAPER:
-                                       os << ",executivepaper";
-                                       break;
-                               case BufferParams::PAPER_A3PAPER:
-                                       os << ",a3paper";
-                                       break;
-                               case BufferParams::PAPER_A4PAPER:
-                                       os << ",a4paper";
-                                       break;
-                               case BufferParams::PAPER_A5PAPER:
-                                       os << ",a5paper";
-                                       break;
-                               case BufferParams::PAPER_B5PAPER:
-                                       os << ",b5paper";
-                                       break;
-                               }
-                       }
-                       if (!params.topmargin.empty())
-                               os << ",tmargin=" << params.topmargin;
-                       if (!params.bottommargin.empty())
-                               os << ",bmargin=" << params.bottommargin;
-                       if (!params.leftmargin.empty())
-                               os << ",lmargin=" << params.leftmargin;
-                       if (!params.rightmargin.empty())
-                               os << ",rmargin=" << params.rightmargin;
-                       if (!params.headheight.empty())
-                               os << ",headheight=" << params.headheight;
-                       if (!params.headsep.empty())
-                               os << ",headsep=" << params.headsep;
-                       if (!params.footskip.empty())
-                               os << ",footskip=" << params.footskip;
-                       os << "}\n";
-                       texrow.newline();
-               }
-
-               if (tokenPos(tclass.opt_pagestyle(),
-                            '|', params.pagestyle) >= 0) {
-                       if (params.pagestyle == "fancy") {
-                               os << "\\usepackage{fancyhdr}\n";
-                               texrow.newline();
-                       }
-                       os << "\\pagestyle{" << params.pagestyle << "}\n";
-                       texrow.newline();
-               }
-
-               if (params.secnumdepth != tclass.secnumdepth()) {
-                       os << "\\setcounter{secnumdepth}{"
-                           << params.secnumdepth
-                           << "}\n";
-                       texrow.newline();
-               }
-               if (params.tocdepth != tclass.tocdepth()) {
-                       os << "\\setcounter{tocdepth}{"
-                           << params.tocdepth
-                           << "}\n";
-                       texrow.newline();
-               }
-
-               if (params.paragraph_separation) {
-                       switch (params.defskip.kind()) {
-                       case VSpace::SMALLSKIP:
-                               os << "\\setlength\\parskip{\\smallskipamount}\n";
-                               break;
-                       case VSpace::MEDSKIP:
-                               os << "\\setlength\\parskip{\\medskipamount}\n";
-                               break;
-                       case VSpace::BIGSKIP:
-                               os << "\\setlength\\parskip{\\bigskipamount}\n";
-                               break;
-                       case VSpace::LENGTH:
-                               os << "\\setlength\\parskip{"
-                                   << params.defskip.length().asLatexString()
-                                   << "}\n";
-                               break;
-                       default: // should never happen // Then delete it.
-                               os << "\\setlength\\parskip{\\medskipamount}\n";
-                               break;
-                       }
-                       texrow.newline();
-
-                       os << "\\setlength\\parindent{0pt}\n";
-                       texrow.newline();
-               }
-
-               // Now insert the LyX specific LaTeX commands...
-
-               // The optional packages;
-               string preamble(features.getPackages());
-
-               // this might be useful...
-               preamble += "\n\\makeatletter\n";
-
-               // Some macros LyX will need
-               string tmppreamble(features.getMacros());
-
-               if (!tmppreamble.empty()) {
-                       preamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
-                               "LyX specific LaTeX commands.\n"
-                               + tmppreamble + '\n';
-               }
-
-               // the text class specific preamble
-               tmppreamble = features.getTClassPreamble();
-               if (!tmppreamble.empty()) {
-                       preamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
-                               "Textclass specific LaTeX commands.\n"
-                               + tmppreamble + '\n';
-               }
-
-               /* the user-defined preamble */
-               if (!params.preamble.empty()) {
-                       preamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
-                               "User specified LaTeX commands.\n"
-                               + params.preamble + '\n';
-               }
-
-               // Itemize bullet settings need to be last in case the user
-               // defines their own bullets that use a package included
-               // in the user-defined preamble -- ARRae
-               // Actually it has to be done much later than that
-               // since some packages like frenchb make modifications
-               // at \begin{document} time -- JMarc
-               string bullets_def;
-               for (int i = 0; i < 4; ++i) {
-                       if (params.user_defined_bullets[i] != ITEMIZE_DEFAULTS[i]) {
-                               if (bullets_def.empty())
-                                       bullets_def="\\AtBeginDocument{\n";
-                               bullets_def += "  \\renewcommand{\\labelitemi";
-                               switch (i) {
-                               // `i' is one less than the item to modify
-                               case 0:
-                                       break;
-                               case 1:
-                                       bullets_def += 'i';
-                                       break;
-                               case 2:
-                                       bullets_def += "ii";
-                                       break;
-                               case 3:
-                                       bullets_def += 'v';
-                                       break;
-                               }
-                               bullets_def += "}{" +
-                                 params.user_defined_bullets[i].getText()
-                                 + "}\n";
-                       }
-               }
-
-               if (!bullets_def.empty())
-                 preamble += bullets_def + "}\n\n";
-
-               // We try to load babel late, in case it interferes
-               // with other packages.
-               if (use_babel) {
-                       string tmp = lyxrc.language_package;
-                       if (!lyxrc.language_global_options
-                           && tmp == "\\usepackage{babel}")
-                               tmp = string("\\usepackage[") +
-                                       STRCONV(language_options.str()) +
-                                       "]{babel}";
-                       preamble += tmp + "\n";
-                       preamble += features.getBabelOptions();
-               }
-
-               preamble += "\\makeatother\n";
-
-               // dvipost settings come after everything else
-               if (params.tracking_changes) {
-                       preamble += "\\dvipostlayout\n";
-                       preamble += "\\dvipost{osstart color push Red}\n";
-                       preamble += "\\dvipost{osend color pop}\n";
-                       preamble += "\\dvipost{cbstart color push Blue}\n";
-                       preamble += "\\dvipost{cbend color pop} \n";
-               }
-
-               int const nlines =
-                       int(lyx::count(preamble.begin(), preamble.end(), '\n'));
-               for (int j = 0; j != nlines; ++j) {
-                       texrow.newline();
-               }
-
-               os << preamble;
+               // Write the preamble
+               params.writeLaTeX(os, features, texrow);
 
                if (only_preamble)
                        return;
@@ -2170,7 +1778,7 @@ void Buffer::makeLaTeXFile(ostream & os,
                texrow.newline();
        }
 
-       latexParagraphs(os, &*(paragraphs.begin()), 0, texrow);
+       latexParagraphs(os, paragraphs.begin(), paragraphs.end(), texrow);
 
        // add this just in case after all the paragraphs
        os << endl;
@@ -2208,8 +1816,10 @@ void Buffer::makeLaTeXFile(ostream & os,
 //
 // LaTeX all paragraphs from par to endpar, if endpar == 0 then to the end
 //
-void Buffer::latexParagraphs(ostream & ofs, Paragraph * par,
-                            Paragraph * endpar, TexRow & texrow,
+void Buffer::latexParagraphs(ostream & ofs,
+                            ParagraphList::iterator par,
+                            ParagraphList::iterator endpar,
+                            TexRow & texrow,
                             bool moving_arg) const
 {
        bool was_title = false;
@@ -2257,12 +1867,12 @@ void Buffer::latexParagraphs(ostream & ofs, Paragraph * par,
                        if (layout->isEnvironment() ||
                                !par->params().leftIndent().zero())
                        {
-                               par = par->TeXEnvironment(this, params, ofs, texrow);
+                               par = TeXEnvironment(this, params, par, ofs, texrow);
                        } else {
-                               par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
+                               par = TeXOnePar(this, params, par, ofs, texrow, moving_arg);
                        }
                } else {
-                       par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
+                       par = TeXOnePar(this, params, par, ofs, texrow, moving_arg);
                }
        }
        // It might be that we only have a title in this document
@@ -2419,6 +2029,7 @@ void Buffer::makeLinuxDocFile(string const & fname, bool nice, bool body_only)
 
                case LATEX_ENVIRONMENT:
                case LATEX_ITEM_ENVIRONMENT:
+               case LATEX_BIB_ENVIRONMENT:
                {
                        string const & latexname = style->latexname();
 
@@ -2473,6 +2084,7 @@ void Buffer::makeLinuxDocFile(string const & fname, bool nice, bool body_only)
                        break;
                case LATEX_ENVIRONMENT:
                case LATEX_ITEM_ENVIRONMENT:
+               case LATEX_BIB_ENVIRONMENT:
                        if (style->latexparam() == "CDATA")
                                ofs << "]]>";
                        break;
@@ -3195,7 +2807,7 @@ void Buffer::validate(LaTeXFeatures & features) const
                features.require("dvipost");
                features.require("color");
        }
+
        // AMS Style is at document level
        if (params.use_amsmath || tclass.provides(LyXTextClass::amsmath))
                features.require("amsmath");
@@ -3255,50 +2867,33 @@ vector<string> const Buffer::getLabelList() const
 
 
 // This is also a buffer property (ale)
-vector<pair<string, string> > const Buffer::getBibkeyList() const
+void Buffer::fillWithBibKeys(vector<pair<string, string> > & keys) const
 {
-       typedef pair<string, string> StringPair;
        /// if this is a child document and the parent is already loaded
-       /// Use the parent's list instead  [ale990412]
+       /// use the parent's list instead  [ale990412]
        if (!params.parentname.empty() && bufferlist.exists(params.parentname)) {
                Buffer const * tmp = bufferlist.getBuffer(params.parentname);
-               if (tmp)
-                       return tmp->getBibkeyList();
-       }
-
-       vector<StringPair> keys;
-       ParagraphList::iterator pit = paragraphs.begin();
-       ParagraphList::iterator pend = paragraphs.end();
-       for (; pit != pend; ++pit) {
-               if (pit->bibkey) {
-                       string const key = pit->bibkey->getContents();
-                       string const opt = pit->bibkey->getOptions();
-                       string const ref = pit->asString(this, false);
-                       string const info = opt + "TheBibliographyRef" + ref;
-
-                       keys.push_back(StringPair(key, info));
+               if (tmp) {
+                       tmp->fillWithBibKeys(keys);
+                       return;
                }
        }
 
-       if (!keys.empty())
-               return keys;
-
-       // Might be either using bibtex or a child has bibliography
        for (inset_iterator it = inset_const_iterator_begin();
                it != inset_const_iterator_end(); ++it) {
-               // Search for Bibtex or Include inset
-               if (it->lyxCode() == Inset::BIBTEX_CODE) {
-                       vector<StringPair> tmp =
-                               static_cast<InsetBibtex &>(*it).getKeys(this);
-                       keys.insert(keys.end(), tmp.begin(), tmp.end());
-               } else if (it->lyxCode() == Inset::INCLUDE_CODE) {
-                       vector<StringPair> const tmp =
-                               static_cast<InsetInclude &>(*it).getKeys();
-                       keys.insert(keys.end(), tmp.begin(), tmp.end());
+               if (it->lyxCode() == Inset::BIBTEX_CODE)
+                       static_cast<InsetBibtex &>(*it).fillWithBibKeys(this, keys);
+               else if (it->lyxCode() == Inset::INCLUDE_CODE)
+                       static_cast<InsetInclude &>(*it).fillWithBibKeys(keys);
+               else if (it->lyxCode() == Inset::BIBITEM_CODE) {
+                       InsetBibitem & bib = static_cast<InsetBibitem &>(*it);
+                       string const key = bib.getContents();
+                       string const opt = bib.getOptions();
+                       string const ref; // = pit->asString(this, false);
+                       string const info = opt + "TheBibliographyRef" + ref;
+                       keys.push_back(pair<string, string>(key, info));
                }
        }
-
-       return keys;
 }
 
 
@@ -3413,7 +3008,7 @@ Paragraph * Buffer::getParFromID(int id) const
 {
        if (id < 0)
                return 0;
+
        // why should we allow < 0 ??
        //lyx::Assert(id >= 0);