]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetBibitem.cpp
Fix GRAPHICS_EDIT of InsetGraphics
[lyx.git] / src / insets / InsetBibitem.cpp
index 50e1cb1c8a33e0804c3d0a2c27302fcaa2056e83..22bb43d55f74ccec17c7da3273c7f104a358b8fa 100644 (file)
@@ -9,10 +9,13 @@
  */
 
 #include <config.h>
+#include <algorithm>
 
 #include "InsetBibitem.h"
 
+#include "BiblioInfo.h"
 #include "Buffer.h"
+#include "buffer_funcs.h"
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "Counters.h"
 #include "Lexer.h"
 #include "Paragraph.h"
 #include "ParagraphList.h"
+#include "TextClass.h"
+
+#include "frontends/alert.h"
 
 #include "support/lstrings.h"
-#include "support/std_ostream.h"
+#include "support/docstream.h"
+#include "support/gettext.h"
 #include "support/convert.h"
 
+#include <ostream>
+
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
 
 int InsetBibitem::key_counter = 0;
-
-
 docstring const key_prefix = from_ascii("key-");
 
 
@@ -46,20 +55,48 @@ InsetBibitem::InsetBibitem(InsetCommandParams const & p)
 }
 
 
-CommandInfo const * InsetBibitem::findInfo(std::string const & /* cmdName */)
+void InsetBibitem::initView()
 {
-       static const char * const paramnames[] = {"label", "key", ""};
-       static const bool isoptional[] = {true, false};
-       static const CommandInfo info = {2, paramnames, isoptional};
-       return &info;
+       updateCommand(getParam("key"));
 }
 
 
-Inset * InsetBibitem::clone() const
+void InsetBibitem::updateCommand(docstring const & new_key, bool)
 {
-       InsetBibitem * b = new InsetBibitem(params());
-       b->autolabel_ = autolabel_;
-       return b;
+       docstring const old_key = getParam("key");
+       docstring key = new_key;
+
+       BiblioInfo keys;
+       keys.fillWithBibKeys(&buffer());
+       vector<docstring> bibkeys = keys.getKeys();
+
+       int i = 1;
+
+       if (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) {
+               // generate unique label
+               key = new_key + '-' + convert<docstring>(i);
+               while (find(bibkeys.begin(), bibkeys.end(), key) != bibkeys.end()) {
+                       ++i;
+                       key = new_key + '-' + convert<docstring>(i);
+               }
+               frontend::Alert::warning(_("Keys must be unique!"),
+                       bformat(_("The key %1$s already exists,\n"
+                       "it will be changed to %2$s."), new_key, key));
+       }
+       setParam("key", key);
+
+       lyx::updateLabels(buffer());
+}
+
+
+ParamInfo const & InsetBibitem::findInfo(string const & /* cmdName */)
+{
+       static ParamInfo param_info_;
+       if (param_info_.empty()) {
+               param_info_.add("label", ParamInfo::LATEX_OPTIONAL);
+               param_info_.add("key", ParamInfo::LATEX_REQUIRED);
+       }
+       return param_info_;
 }
 
 
@@ -74,10 +111,13 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
                        cur.noUpdate();
                        break;
                }
-               if (p["key"] != params()["key"])
-                       cur.bv().buffer().changeRefsIfUnique(params()["key"],
-                                                      p["key"], CITE_CODE);
-               setParams(p);
+               docstring old_key = params()["key"];
+               setParam("label", p["label"]);
+               updateCommand(p["key"]);
+               if (params()["key"] != old_key)
+                       cur.bv().buffer().changeRefsIfUnique(old_key,
+                               params()["key"], CITE_CODE);
+               break;
        }
 
        default:
@@ -87,35 +127,34 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
 }
 
 
-void InsetBibitem::read(Buffer const & buf, Lexer & lex)
+void InsetBibitem::read(Lexer & lex)
 {
-       InsetCommand::read(buf, lex);
+       InsetCommand::read(lex);
 
-       if (support::prefixIs(getParam("key"), key_prefix)) {
+       if (prefixIs(getParam("key"), key_prefix)) {
                int const key = convert<int>(getParam("key").substr(key_prefix.length()));
-               key_counter = std::max(key_counter, key);
+               key_counter = max(key_counter, key);
        }
 }
 
 
-docstring const InsetBibitem::getBibLabel() const
+docstring InsetBibitem::bibLabel() const
 {
        docstring const & label = getParam("label");
        return label.empty() ? autolabel_ : label;
 }
 
 
-docstring const InsetBibitem::getScreenLabel(Buffer const &) const
+docstring InsetBibitem::screenLabel() const
 {
-       return getParam("key") + " [" + getBibLabel() + ']';
+       return getParam("key") + " [" + bibLabel() + ']';
 }
 
 
-int InsetBibitem::plaintext(Buffer const &, odocstream & os,
-                           OutputParams const &) const
+int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const
 {
        odocstringstream oss;
-       oss << '[' << getBibLabel() << "] ";
+       oss << '[' << bibLabel() << "] ";
 
        docstring const str = oss.str();
        os << str;
@@ -164,7 +203,7 @@ docstring const bibitemWidest(Buffer const & buffer)
                        continue;
 
                bitem = static_cast<InsetBibitem const *>(inset);
-               docstring const label = bitem->getBibLabel();
+               docstring const label = bitem->bibLabel();
 
                // FIXME: we can't be sure using the following that the GUI
                // version and the command-line version will give the same
@@ -182,38 +221,36 @@ docstring const bibitemWidest(Buffer const & buffer)
                        w = wx;
        }
 
-       if (bitem && !bitem->getBibLabel().empty())
-               return bitem->getBibLabel();
+       if (bitem && !bitem->bibLabel().empty())
+               return bitem->bibLabel();
 
        return from_ascii("99");
 }
 
 
-void InsetBibitem::fillWithBibKeys(Buffer const & buf,
-       BiblioInfo & keys, InsetIterator const & it) const
+void InsetBibitem::fillWithBibKeys(BiblioInfo & keys, InsetIterator const & it) const
 {
        docstring const key = getParam("key");
-       BibTeXInfo keyvalmap;
+       BibTeXInfo keyvalmap(false);
        keyvalmap[from_ascii("label")] = getParam("label");
        DocIterator doc_it(it); 
        doc_it.forwardPos();
-       keyvalmap[from_ascii("ref")] = doc_it.paragraph().asString(buf, false);
-       keyvalmap.isBibTeX = false;
+       keyvalmap[from_ascii("ref")] = doc_it.paragraph().asString(false);
        keys[key] = keyvalmap;
 }
 
 
 /// Update the counters of this inset and of its contents
-void InsetBibitem::updateLabels(Buffer const &buf, ParIterator const &) 
+void InsetBibitem::updateLabels(ParIterator const &) 
 {
-       Counters & counters = buf.params().getTextClass().counters();
+       Counters & counters = buffer().params().documentClass().counters();
        docstring const bibitem = from_ascii("bibitem");
        if (counters.hasCounter(bibitem) && getParam("label").empty()) {
                counters.step(bibitem);
                autolabel_ = counters.theCounter(bibitem);
-       } else
+       } else {
                autolabel_ = from_ascii("??");
-       refresh();
+       }
 }