*/
#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 "ParagraphList.h"
#include "TextClass.h"
-#include "support/lstrings.h"
-#include "support/docstream.h"
-#include "support/convert.h"
+#include "frontends/alert.h"
-#include <ostream>
+#include "support/convert.h"
+#include "support/docstream.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
using namespace std;
using namespace lyx::support;
docstring const key_prefix = from_ascii("key-");
-InsetBibitem::InsetBibitem(InsetCommandParams const & p)
+InsetBibitem::InsetBibitem(Buffer const & buf, InsetCommandParams const & p)
: InsetCommand(p, "bibitem")
{
+ Inset::setBuffer(const_cast<Buffer &>(buf));
+ buffer_->invalidateBibinfoCache();
if (getParam("key").empty())
setParam("key", key_prefix + convert<docstring>(++key_counter));
}
+InsetBibitem::~InsetBibitem()
+{
+ if (isBufferValid())
+ buffer_->invalidateBibinfoCache();
+}
+
+
+void InsetBibitem::initView()
+{
+ updateCommand(getParam("key"));
+}
+
+
+void InsetBibitem::updateCommand(docstring const & new_key, bool)
+{
+ docstring const old_key = getParam("key");
+ docstring key = new_key;
+
+ vector<docstring> bibkeys = buffer().masterBibInfo().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_;
}
-Inset * InsetBibitem::clone() const
-{
- InsetBibitem * b = new InsetBibitem(params());
- b->autolabel_ = autolabel_;
- return b;
-}
-
-
void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd)
{
switch (cmd.action) {
case LFUN_INSET_MODIFY: {
InsetCommandParams p(BIBITEM_CODE);
- InsetCommandMailer::string2params("bibitem", to_utf8(cmd.argument()), p);
+ InsetCommand::string2params("bibitem", to_utf8(cmd.argument()), p);
if (p.getCmdName().empty()) {
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"]);
+ if (params()["key"] != old_key) {
+ updateCommand(p["key"]);
+ cur.bv().buffer().changeRefsIfUnique(old_key,
+ params()["key"], CITE_CODE);
+ }
+ buffer_->invalidateBibinfoCache();
+ break;
}
default:
}
-void InsetBibitem::read(Buffer const & buf, Lexer & lex)
+void InsetBibitem::read(Lexer & lex)
{
- InsetCommand::read(buf, lex);
+ InsetCommand::read(lex);
if (prefixIs(getParam("key"), key_prefix)) {
int const key = convert<int>(getParam("key").substr(key_prefix.length()));
}
-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;
// ale070405
-docstring const bibitemWidest(Buffer const & buffer)
+docstring bibitemWidest(Buffer const & buffer)
{
int w = 0;
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
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(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[from_ascii("ref")] = doc_it.paragraph().asString();
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().textClass().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();
+ }
}