]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetBibitem.cpp
prepare Qt 5.6 builds
[lyx.git] / src / insets / InsetBibitem.cpp
index a05b21d28b00deb14564f7e11247a629fd7abceb..d0a28e73fe964d02965d168b1b6829fa78f51096 100644 (file)
@@ -41,6 +41,7 @@
 #include "support/docstream.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
+#include "support/mutex.h"
 
 using namespace std;
 using namespace lyx::support;
@@ -49,6 +50,7 @@ namespace lyx {
 
 
 int InsetBibitem::key_counter = 0;
+static Mutex counter_mutex;
 docstring const key_prefix = from_ascii("key-");
 
 
@@ -56,8 +58,10 @@ InsetBibitem::InsetBibitem(Buffer * buf, InsetCommandParams const & p)
        : InsetCommand(buf, p)
 {
        buffer().invalidateBibinfoCache();
-       if (getParam("key").empty())
+       if (getParam("key").empty()) {
+               Mutex::Locker lock(&counter_mutex);
                setParam("key", key_prefix + convert<docstring>(++key_counter));
+       }
 }
 
 
@@ -77,12 +81,10 @@ void InsetBibitem::initView()
 void InsetBibitem::updateCommand(docstring const & new_key, bool)
 {
        docstring key = new_key;
-
        vector<docstring> bibkeys = buffer().masterBibInfo().getKeys();
 
-       int i = 1;
-
        if (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) {
+               int i = 1;
                // generate unique label
                key = new_key + '-' + convert<docstring>(i);
                while (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) {
@@ -130,7 +132,6 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
                docstring label = p["label"];
 
                // definitions for escaping
-               int previous;
                static docstring const backslash = from_ascii("\\");
                static docstring const lbrace = from_ascii("{");
                static docstring const rbrace = from_ascii("}");
@@ -139,6 +140,7 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
                static char_type const brackets_escape[2] = {'[', ']'};
 
                if (!label.empty()) {
+                       int previous;
                        // The characters in chars_name[] need to be changed to a command when
                        // they are in the name field.
                        for (int k = 0; k < 6; k++)
@@ -177,8 +179,7 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
                setParam("label", p["label"]);
                if (p["key"] != old_key) {
                        updateCommand(p["key"]);
-                       cur.bv().buffer().changeRefsIfUnique(old_key,
-                               params()["key"], CITE_CODE);
+                       cur.bv().buffer().changeRefsIfUnique(old_key, params()["key"]);
                        cur.forceBufferUpdate();
                        buffer().invalidateBibinfoCache();
                }
@@ -198,6 +199,7 @@ void InsetBibitem::read(Lexer & lex)
 
        if (prefixIs(getParam("key"), key_prefix)) {
                int const key = convert<int>(getParam("key").substr(key_prefix.length()));
+               Mutex::Locker lock(&counter_mutex);
                key_counter = max(key_counter, key);
        }
 }
@@ -205,6 +207,9 @@ void InsetBibitem::read(Lexer & lex)
 
 docstring InsetBibitem::bibLabel() const
 {
+       BufferParams const & bp = buffer().masterBuffer()->params();
+       if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL)
+               return autolabel_;
        docstring const & label = getParam("label");
        return label.empty() ? autolabel_ : label;
 }
@@ -216,7 +221,8 @@ docstring InsetBibitem::screenLabel() const
 }
 
 
-int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const
+int InsetBibitem::plaintext(odocstringstream & os,
+        OutputParams const &, size_t) const
 {
        odocstringstream oss;
        oss << '[' << bibLabel() << "] ";
@@ -231,6 +237,10 @@ int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const
 // ale070405
 docstring bibitemWidest(Buffer const & buffer, OutputParams const & runparams)
 {
+       BufferParams const & bp = buffer.masterBuffer()->params();
+       if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL)
+               return from_ascii("99");
+
        int w = 0;
 
        InsetBibitem const * bitem = 0;
@@ -307,6 +317,17 @@ void InsetBibitem::collectBibKeys(InsetIterator const & it) const
        BibTeXInfo keyvalmap(false);
        keyvalmap.key(key);
        keyvalmap.label(label);
+
+       BufferParams const & bp = buffer().masterBuffer()->params();
+       Counters & counters = bp.documentClass().counters();
+       docstring const bibitem = from_ascii("bibitem");
+       if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL || getParam("label").empty()) {
+               if (counters.hasCounter(bibitem))
+                       counters.step(bibitem, InternalUpdate);
+               string const & lang = it.paragraph().getParLanguage(bp)->code();
+               keyvalmap.setCiteNumber(counters.theCounter(bibitem, lang));
+       }
+
        DocIterator doc_it(it);
        doc_it.forwardPos();
        keyvalmap[from_ascii("ref")] = doc_it.paragraph().asString(
@@ -321,7 +342,7 @@ void InsetBibitem::updateBuffer(ParIterator const & it, UpdateType utype)
        BufferParams const & bp = buffer().masterBuffer()->params();
        Counters & counters = bp.documentClass().counters();
        docstring const bibitem = from_ascii("bibitem");
-       if (getParam("label").empty()) {
+       if (bp.citeEngineType() == ENGINE_TYPE_NUMERICAL || getParam("label").empty()) {
                if (counters.hasCounter(bibitem))
                        counters.step(bibitem, utype);
                string const & lang = it.paragraph().getParLanguage(bp)->code();